본문 바로가기
프로그래밍/Java

[실전 자바-기본편] 인터페이스

by Dean30 2024. 2. 24.
728x90

인터페이스

자바는 순수 추상 클래스를 더 편리하게 사용할 수 있는 인터페이스 라는 기능을 제공한다.

 

순수 추상 클래스 특징

  • 인스턴스를 생성할 수 없음
  • 상속시 모든 메서드를 오버라이딩 해야 한다.
  • 주로 다형성을 위해 사용된다.

인터페이스 특징 (순수 추상 클래스 + 약간의 편의 기능 추가)

  • 인터페이스의 메서드는 모두 public, abstract이다.
  • 메서드의 public abstract를 생략할 수 있다. 참고로 생략이 권장된다.
  • 인터페이스는 다중 구현(다중 상속)을 지원한다.

 

인터페이스의 멤버 변수

  • 인터페이스의 멤버 변수 public, static, final이 모두 포함되어 있다고 간주된다. (수정 불가)
    • 생략이 권장된다.
public interface InterfaceAnimal {
	public static final int MY_PI = 3.14
}

public interface InterfaceAnimal {
	int MY_PI = 3.14
}

 

 

클래스 상속 관계는 UML에서 실선을 사용하지만, 인터페이스 구현 관계는 UML에서 점선을 사용한다.

  • UML: Unified Modeling Language

 

 

 

순수 추상 클래스가 아닌 인터페이스를 굳이 쓰는 이유?

  • 제약: 순수 추상 클래스의 경우 미래에 누군가 메서드를 끼워 넣을 수 있다. 인터페이스는 이를 원천 차단한다.
  • 다중 구현: 자바에서 클래스 상속은 부모를 하나만 지정할 수 있다. 인터페이스는 부모를 여러명 두는 다중 구현이 가능하다.

 

  • 참고
    자바 8에 등장한 default 메서드를 사용하면 인터페이스도 메서드 구현 가능
  • 자바 9에 등장한 private 메서드도 구현가능
    • 하지만 이것은 예외적으로 아주 특별한 경우에만 사용해야 함.

 

 

인터페이스 - 다중 구현

자바는 다중 상속을 지원하지 않는다.

  • 자식 입장에서 어떤 부모의 메서드를 호출할지 애매해짐 (다이아몬드 문제)
  • 그리고 다중 상속은 계층 구조가 매우 복잡해질 수 있다.

 

인터페이스는 다중 상속이 가능

  • 자신에서 기능을 직접 구현해야하기 때문에 다이아몬드 문제가 발생하지 않는다.

 

 

public class DiamondMain {
    public static void main(String[] args) {
        InterfaceA a = new Child();
        a.methodA();
        a.methodCommon();

        InterfaceB b = new Child();
        b.methodB();
        b.methodCommon();

        Child child = new Child();
        child.methodA();
        child.methodB();
        child.methodCommon();
    }
}

// 실행 결과 //
Child.methodA
Child.methodCommon
Child.methodB
Child.methodCommon

 

 

 

 

 

InterfaceB로 정의 된 b는 InterfaceB 인스턴스에 접근해서 자식 Child의 overriding된 메서드를 참조하는구나 !

 

 

 

 

클래스와 인터페이스 활용

 

 

  • AbstractAnimal은 추상 클래스
    • sound(): 동물 소리 관련 추상 메서드
    • move() 동물 이동 관련 메서드. 추상 메서드 x라 상속을 목적으로 사용
  • fly는 인터페이스. 
    • Bird, Chicken은 날 수 있다. fly()메서드를 구현해야 함

 

 

 

 

하나의 클래스 여러 인터페이스 예시

  • extends를 통한 상속은 하나만 할 수 있고 implements를 통한 인터페이스는 다중 구현 할 수 있기 때문에 둘이 함께 나온 경우 extends가 먼저 나와야 한다.
public class Bird extends AbstractAnimal implements Fly, Swim {}

 

728x90

댓글