Study/Java

자바 기본서를 다시 읽다. 2 - 인터페이스

going.yoon 2022. 3. 11. 00:03

인터페이스의 중요성은 두말하면 입 아프다. 인터페이스를 사용함으로써 개발자는 객체의 내부 구조를 알 필요가 없고 메소드만 알고 있으면 되고, 개발코드의 수정 없이 사용 객체를 변경할 수 있다.

 

I. 인터페이스 구성

  • 상수필드 : public static final의 특성을 갖는다. 이를 생략해도 컴파일 과정에서 자동으로 붙게 된다.
  • 추상 메소드 : public static abstract의 특성을 갖는다. 
  • 디폴트 메소드 : public default의 특성을 갖는다. 
  • 정적 메소드 : public static의 특성을 갖는다. 객체가 없어도 인터페이스 만으로 호출 가능

 

이렇듯 인터페이스들의 모든 메소드는 기본적으로 public 접근제한자를 가지고 있기 때문에 이를 구현한 객체들은 public보다 낮은 접근제한자를 가질 수 없다. 만약 인터페이스에 선언한 추상 메소드에 대응하는 실체 메소드를 작성하지 않으면 자동으로 추상클래스가 되므로 abstract 키워드를 추가해야 한다. 

 

디폴트 메소드는 기존 인터페이스를 확장해서 새로운 기능을 추가 하기 위해 사용된다. 기존에 인터페이스를 구현한 구현 클래스에서 새로 추가된 인터페이스 메소드를 구현하지 않았다고 에러를 발생시키는 것을 막기 위해 사용한다. 인터페이스에 새로운 메소드를 추가하고 싶을 때, 기존 구현체들에 대한 영향을 줄이기 위해 기존 인터페이스의 이름과 추상메소드의 변경 없이 디폴트 메소드만 추가한다.

 

II. 인터페이스 구현체의 형변환

인터페이스와 구현체는 그 인스턴스를 생성하고나 메소드를 호출할 때 자동으로 타입 변환을 해준다. 하지만 구현 객체가 인터페이스 타입으로 자동 변환하면, 인터페이스에 선언된 메소드만 가능하다. 이런 경우에는 구현 객체로 강제 타입변환을 한 다음 구현객체의 메소드를 사용하면 된다. 

Vehicle car = new Car();
car.run();
car.getNumOfTires(); // getNumOfTires는 Car에만 구현된 메소드이므로 Vehicle객체 호출 불가

Vehicle carV = new Car();
Car carC = (Car) carV; // Car 형태로 형 변환
carC.run();
carC.getNumOfTires(); // getNumOfTires 호출 가능

 

III. 중첩 클래스와 인터페이스

이 부분에 대해서는 로컬클래스와, 익명객체, 그리고 람다식까지 걸쳐져있는 이해가 필요하다. 이는 따로 포스팅을 작성하여 정리해야될 듯.