📌 다중 인터페이스
[출처] 이것이 자바다
구현 객체는 여러 개의 인터페이스를 implements 할 수 있음
구현 객체는 모든 인터페이스가 가진 추상 메소드를 재정의해야 함
구현 객체가 어떤 인터페이스 변수에 대입되느냐에 따라 변수를 통해 호출할 수 있는 추상 메소드가 결정됨 => 다형성
public class 구현클래스명 implements 인터페이스1, 인터페이스2 {
//모든 추상 메소드 재정의
}
📌 인터페이스의 상속
인터페이스도 다른 인터페이스를 상속 가능
다중 상속 허용
extends 키워드
자식 인터페이스의 구현 클래스는 자식, 부모 인터페이스의 모든 추상 메소드를 재정의해야 함
구현 객체는 자식, 부모 인터페이스 변수에 대입 가능
자식 인터페이스 변수에 대입되면 자식, 부모 인터페이스의 추상 메소드를 모두 호출 가능
부모 인터페이스 변수에 대입되면 부모 인터페이스의 추상 메소드만 호출 가능
public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 { ... }
📌 자동 타입 변환 (oromotion)
인터페이스 변수 = 구현객체;
📌 강제 타입 변환
구현클래스 변수 = (구현클래스) 인터페이스 변수;
[예시]
interface AInterface {
void method1();
}
class A implements AInterface {
void method1() {...}; //인터페이스의 메소드 재정의
void method2() {...}; //A 클래스가 가진 메소드
}
AInterface aInterface = new A();
aInterface.method1(); //aInterface.method2();는 불가능
A a = (A) aInterface; //Casting
a.method1();
a.method2();
📌 인터페이스의 다형성
📌 필드의 다형성
[예시]
public interface Cosmetic {
//추상 메소드
void use();
}
public class Lipstick implements Cosmetic {
//추상 메소드 재정의
@override
public void use() {
System.out.println("입술에 바릅니다.")
}
}
public class Foundation implements Cosmetic {
//추상 메소드 재정의
@override
public void use() {
System.out.println("얼굴에 바릅니다.")
}
}
public class Person {
//인터페이스에 들어가는 구현 클래스에 따라 use()의 결과가 달라짐
Cosmetic cosmetic1 = new Lipstic();
Cosmetic cosmetic2 = new Foundation();
void makeup() {
cosmetic1.use();
cosemtic2.use();
}
}
📌 매개변수의 다형성
[예시]
public interface Cosmetic {
//추상 메소드
void use();
}
public class Person {
//매개변수의 자리에 promotion으로 여러 구현 객체가 들어갈 수 있음
void makeup(Cosmetic cosmetic) {
//들어간 구현 객체에 따라 use()의 결과가 달라짐
cosmetic.use();
}
}
📌 instanceof
if ( 인터페이스변수 instanceof 구현객체 ) {
//인터페이스 변수에 대입된 객체가 오른쪽의 구현 객체일 경우 실행
}
📌 instanceof 활용
public void method(Cosmetic cosmetic) {
if(cosmetic instanceof Lipstic) {
//Lipstic에만 있는 메소드를 사용하고 싶을 경우
Lipstic lipstic = (Lipstic) cosmetic;
}
}
📌 instanceof 활용 (Java12~)
public void method(Cosmetic cosmetic) {
if(cosmetic instanceof Lipstic lipstic) {
//casting 없이 바로 lipstic 변수 사용 가능
}
}
📌 봉인된 인터페이스 (Sealed Interface)
(Java15~) 무분별한 자식 인터페이스 생성 방지를 위해 사용
permits 키워드로 상속 가능한 자식 인터페이스 지정
자식 인터페이스는 non-sealed 또는 sealed 키워드로 또 다른 봉인 인터페이스 선언해야 함
public seald interface InterfaceA permits InterafaceB {...}
//자식 인터페이스가 non-sealed 선언 시,
public non-sealed interface InterfaceB extends InterfaceA {...}
//다른 자식 인터페이스 생성 가능
public interface InterfaceC extends InterfaceB {...}