BACK/JAVA

[JAVA] 인터페이스, 디폴트 메서드

연듀 2022. 7. 28. 19:54

 

인터페이스란? 

 

인터페이스의 의미는 입출력 방식의 호환성을 의미한다.

 

내부의 모든 필드가 public static final로 정의되고, static과 default 메서드 이외의 모든 메서드는 public abstract로 정의된 객체지향 프로그래밍 요소이다. 

interface 키워드를 사용해 선언한다. 

 

 

 

interface A {
    public static final int a = 3;
    public abstract void abc();
}

 

 

필드와 메서드 앞에 제어자가 확정되어있고 이는 생략해도 컴파일러가 자동으로 삽입한다.

 

 

 

인터페이스의 상속 

 

클래스가 인터페이스를 상속할 때는 implements 키워드를 사용한다. 

클래스에서는 여러 부모 클래스에 동일한 이름의 필드나 메서드가 존재할 때 이를 내려받으면 충돌이 발생하기 때문에 다중 상속이 불가능 하다.

하지만 인터페이스에서는 모든 필드가 public static final로 정의돼 있어 각각의 인터페이스 내부에 저장 공간이 분리되어 있어 겹치지 않는다. 

또한 메서드도 미완성이라 어차피 자식 클래스 내부에서 완성해 사용하기 때문에 다중 상속이 가능하다. 

 

 

 

 

클래스와 인터페이스를 함께 상속하는 경우, 다음과 같이 클래스는 인터페이스 앞에 표기해야 한다. 


class A{}

interface B{}

interface C{}

class D extends A implements B,C{
    
}

 

 

클래스와 인터페이스 간의 상속 조합 

 

 

클래스 extends 클래스 

 

인터페이스 extends 인터페이스

 

클래스 implements 인터페이스

 

 

인터페이스의 내부에는 완성된 메서드가 들어갈 수 없으므로 구현할 수 없어 인터페이스가 인터페이스를 상속할때는 extends를 사용한다. 

또한 인터페이스는 클래스를 상속할 수 없다. 클래스 내부에 완성된 메서드가 존재하기 때문이다. 

 

 

 

 

디폴트 메서드

 

 

인터페이스 내에 완성된 메서드인 디폴트 메서드가 포함될 수 있다.

디폴트 메서드 앞에 접근 지정자 public을 생략해도 컴파일러가 자동으로 삽입한다.

 

 

interface 인터페이스명{
    public default 리턴 타입 메서드명 {
        // 메서드 내용 
    }
}

 

디폴트 메서드는 이미 완성된 메서드이므로 자식 클래스는 이 메서드를 반드시 오버라이딩할 의무가 없다. 

물론, 오버라이딩해 사용할 수도 있다.