Java/Java(base)

[Java] 인터페이스 interface, 다중 상속, 마크 인터페이스

ID_DI 2021. 12. 1. 02:10

인터페이스(interface)

틀이 극대화

  • 추상클래스를 고도화시킨 문법, 반드시 추상메소드와 상수만 선언해야 한다.
    • 구현이 되어 있는 것이 없음(틀의 역할만 함)
  • 다른 클래스에서 인터페이스를 지정받을 때 implements를 사용함
  • 틀로 받아 올 수 있는 interface의 개수에 제한이 없다.
  • 지정 받은 클래스는 인터페이스가 가지고 있는 추상 메소드를 반드시 재정의해야한다.
  • 인터페이스는 상수와 추상메소드만 존재하므로 그냥 선언해도 상수와 추상메소드로 선언됨.
    • public static final 상수 : static final 생략가능
    • abstract 리턴타입 함수명 : abstract 생략가능
    • interface에는 public 이 필수
jdk 8버전 이후부터는 인터페이스에 default 메소드를 선언할 수 있다. 사실상 다중상속을 지원
  • 인터페이스들 끼리 다른 클래스와의 메소드 모호성이 발행한다면 지정, 상속받은 클래스에서 명시적으로 그 메소드를 재정의 해주어 모호성을 해결해주어야한다.

인터페이스에서 상수 선언

public static final

  • static : 상수이기 때문에 객체화 없이 사용할 수 있어야 한다.
  • final : 상수이기 때문에 바뀌면 안되는 값이다.

인터페이스 사용 이유

자바에서 class 상속은 오로지 부모클래스 하나만 상속 가능

인터페이스는 여러개의 다중상속이 가능하다.

다중 상속 multi interface

public interface Animation{
    abstract void watch();
}
public interface Action{
    abstract void watch();
}
public class Incredible implements Animation, Action{
    @Override
    public void watch() {
        System.out.println("액션 장르의 애니메이션 영화를 봅니다.");
    }

    void doSomething() {
        //Animation과 Action의 watch() 모두 사용 (다중상속)
        Animation.super.watch();
        Action.super.watch();
    }
}

마크 인터페이스 - 표시를 위한 인터페이스

class B extends A implements C
  • 클래스 B는 A의 자식 클래스이자, C의 인터페이스를 가진다.

ex) if( list[i] instanceof C ) ... 사용 가능(C의 타입을 가지는 느낌으로 구별가능)