본문 바로가기
  • soobinhand의 기술 블로그
도서/자바 프로그래밍 언어 - James Gosling

[자바 프로그래밍 언어] 4장 인터페이스

by soobinhand 2021. 12. 24.
728x90

4.1     인터페이스 예제

  • 인터페이스는 메소드의 집합이나 이 타입의 협약을 구성하는 다른 타입을 포함하여 추상적인 형태로 작성된다. 그래서 인터페이스는 구현을 포함할 수 없고 인터페이스의 인스턴스를 생성할 수도 없다.
  • 인터페이스는 설계만을 표현한 것이며 클래스는 설계와 구현을 함께 표현한 것이다.
  • 대부분의 인터페이스는 여러 클래스의 다양성을 표현할 수 있는 특성을 정의하고 있다. 이 특성들은 어떤 것을 할 수 있다는 의미로 'able'을 포함한다.
    • cloneable - 이 타입의 객체는 복제를 지원한다.
    • comparable - 이 타입의 객체는 비교할 수 있는 순서를 가진다.
    • Runnable - 이 타입의 객체는 독립적인 스레드로 실행할 수 있는 작업 단위를 표현한다.
  • 클래스는 슈퍼 인터페이스에 정의된 메소드를 모두 구현해야 한다. 그렇지 않다면 이 클래스를 abstract로 선언해서 이 클래스를 상속하는 서브 클래스가 아직 구현되지 않은 메소드를 구현하게 만들어야 한다.
  • 인터페이스의 강력한 능력은 특정 클래스 타입 대신에 인터페이스 타입을 선언하고 사용할 수 있는 것에서 기인한다.

4.2     인터페이스 선언

  • 인터페이스는 세 종류의 멤버를 선언할 수 있다.
    • 상수 (필드)
    • 메소드
    • 중첩 클래스와 중첩 인터페이스
  • 모든 인터페이스 멤버는 묵시적으로 public 이기 때문에 굳이 제한자를 선언할 필요가 없다.
  • 인터페이스에는 명명 상수를 선언할 수 있다. 이 상수는 필드로서 정의되지만 묵시적으로 public static final로 되며 이 제한자들은 생략 가능.
  • 인터페이스에 선언한 메서드는 구현부를 가질 수 없기 때문에 묵시적으로 abstract로 선언된다. 이는 생략 가능.
  • static 제한자는 또 불가능하다.

4.3     인터페이스 확장

  • 인터페이스는 extends 키워드를 사용하여 확장 가능.
  • 클래스와는 달리 여러 개의 인터페이스 확장 가능.
  • 인터페이스는 메소드의 구현부를 정의할 수 없고 객체 별로 필드를 제공할 수 없기 때문에 다중 상속 형태에 대한 의미적 논란은 없다.
  • 서브 인터페이스는 슈퍼 인터페이스에 선언된 모든 상수를 상속한다.
  • 서브 인터페이스는 슈퍼 인터페이스에 선언된 모든 메소드를 상속한다.
  • 이미 존재하는 필드를 숨겨야 할 이유는 없으며 정적 필드에 접근해야 하는 경우라면 클래스나 인터페이스에 상관없이 해당 필드가 선언된 타입 이름으로 접근할 수 있어야 한다.

4.4     인터페이스 작성

  • 인터페이스는 작성자와의 협약을 추상적인 형태로 묘사한 것이며 클래스가 인터페이스를 구현할 때만 의미가 있다.
  • 어떤 인터페이스는 완전히 추상적이다. 이는 인터페이스가 어떤 구현도 갖지 않는다는 것을 의미하며 그렇기에 구현부는 인터페이스를 구현하는 클래스에서 작성해야 한다.
  • 구현 클래스의 객체를 생성하고 인터페이스의 모든 메소드를 이 객체로 포워딩한 후에 결과를 반환받는다. 이러한 방식을 컴포지션이라고 한다. 컴포지션과 포워딩에서 인터페이스로부터 상속한 클래스의 메소드는 다른 객체의 구현을 호출하고 그 결과를 반환한다.
  • 속성들을 객체에 결합한다.
  • 속성들을 객체 타입에 반영할지를 결정하는 것이다.
  • 타입 계층도에서 속성을 저장하는 기능을 표현하는 것은 매우 유용하다.

4.5     마커 인터페이스

  • 어떤 인터페이스는 선언된 메소드가 없더라도 클래스가 어떤 특징을 가질 수 있게 표시해주는 역할을 한다.
  • Cloneable 인터페이스가 이런 역할을 하며 마커 인터페이스라 부른다.

4.6     인터페이스를 사용할 시기

  • 인터페이스는 추상적인 협약을 가진 타입을 정의한다.
  • 추상 클래스는 추상적인 협약을 지닌 타입을 정의한다.
  • 언제 어떤 것을 사용해야 할까?
  • 인터페이스와 추상 클래스의 가장 중요한 두 가지 차이점
    • 인터페이스는 여러 인터페이스를 구현할 수 있기 때문에 다중 상속을 지원한다고 할 수 있다. 그러나 클래스는 오직 한 개의 클래스를 확장할 수 있다. 이 클래스가 단지 추상 메소드만을 가지고 있더라도 마찬가지다.
    • 추상 클래스는 protected나 static 메소드 등의 일부만을 구현할 수도 있다. 반면에 인터페이스는 public 상수와 구현부가 없는 public 메소드만을 정의할 수 있다.
  • 다중 상속이 중요하고 유용하다면 인터페이스를 사용.
  • 그러나 추상 클래스는 구현의 일부분이나 전체를 정의할 수 있으며 이렇게 정의된 클래스는 쉽게 상속할 수 있다. 추가적으로 추상 클래스는 final를 메소드에 선언해 서브 클래스에서 이를 구현할 수 없도록 할 수 있다.
  • 추상 클래스의 선언된 메소드가 모두 추상 메소드라면 인터페이스로 작성하는 것이 바람직함.
  • 확장해서 사용할 것으로 예상되는 클래스가 추상 클래스이든 아니든 인터페이스를 구현해서 작성해야 한다. 왜냐하면 더 많은 작업을 요구할 지라도 이렇게 하는 것이 다양한 사용성을 보장하기 때문이다.
728x90

댓글