CH8. 인터페이스 (2)

a.rubz·2023년 1월 12일
0

이것이 자바다

목록 보기
12/15
post-thumbnail
post-custom-banner

📝 정리

8.8 다중 인터페이스 구현

📌 다중 인터페이스

[출처] 이것이 자바다

  • 구현 객체는 여러 개의 인터페이스를 implements 할 수 있음

  • 구현 객체는 모든 인터페이스가 가진 추상 메소드를 재정의해야 함

  • 구현 객체가 어떤 인터페이스 변수에 대입되느냐에 따라 변수를 통해 호출할 수 있는 추상 메소드가 결정됨 => 다형성

public class 구현클래스명 implements 인터페이스1, 인터페이스2 {
    //모든 추상 메소드 재정의
}


8.9 인터페이스 상속

📌 인터페이스의 상속

  • 인터페이스도 다른 인터페이스를 상속 가능

  • 다중 상속 허용

  • extends 키워드

  • 자식 인터페이스의 구현 클래스는 자식, 부모 인터페이스의 모든 추상 메소드를 재정의해야 함

  • 구현 객체는 자식, 부모 인터페이스 변수에 대입 가능

  • 자식 인터페이스 변수에 대입되면 자식, 부모 인터페이스의 추상 메소드를 모두 호출 가능

  • 부모 인터페이스 변수에 대입되면 부모 인터페이스의 추상 메소드만 호출 가능

public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 { ... }


8.10 타입 변환

📌 자동 타입 변환 (oromotion)

  • 인터페이스 변수에 구현 객체를 대입하면 인터페이스 타입으로 promotion
  • 부모 클래스가 인터페이스를 구현하고 있다면 자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있음 (자식 클래스도 인터페이스의 메소드를 구현하고 있기 때문)
인터페이스 변수 = 구현객체;

📌 강제 타입 변환

  • 인터페이스 타입을 구현 클래스 타입으로 변환
  • 구현 객체가 인터페이스 타입이 되었을 때, 원래의 구현 객체에만 있는 메소드를 실행시키고 싶으면 다시 casting 필요
구현클래스 변수 = (구현클래스) 인터페이스 변수;

[예시]

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();


8.11 다형성

📌 인터페이스의 다형성

  • 어느 객체(구현 객체)가 인터페이스에 대입되었느냐에 따라 메소드 호출 결과가 달라짐 => 다형성
  • 메소드 재정의와 자동 타입 변환으로 다형성 구현

📌 필드의 다형성

  • 인터페이스는 동일하지만, 어떤 구현 객체(오버라이딩)를 대입(자동 타입 변환, 객체->인터페이스)하느냐에 따라 결과가 달라짐

[예시]

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();
  }
}


8.12 객체 타입 확인

📌 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 변수 사용 가능
  }
}


8.13 봉인된 인터페이스

📌 봉인된 인터페이스 (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 {...}
profile
🔥 개발 공부 🔥
post-custom-banner

0개의 댓글