JAVA/라이브 스터디 | whiteship

[live-study] 8주차 :: 인터페이스

0298 2021. 1. 30. 23:20

https://youtu.be/HLnMuEZpDwU

참고도서 : Java의 정석 3판, Java in a Nutshell

 

 

 

0. 인터페이스란

인터페이스란
  • 인터페이스는 일종의 추상클래스이다.
  • 하지만, 추상클래스보다 추상화 정도가 높아서, 구현된 메서드 또는 일반 멤버 변수를 가질 수 없다. 상수와 추상메서드만 멤버로 가질 수 있다. (JDK 1.8기준)

 

1. 인터페이스 정의하는 방법

인터페이스 정의
  • 인터페이스를 작성하는 것은 클래스를 작성하는 것과 같은데, 다만 키워드로 class 대신 interface를 사용한다는 것만 다르다.
  • 기본적으로 모든 멤버변수는 상수이며 public static final 인데, 이를 생략할 수 있다.
  • 모든 메서드는 추상화 메서드이며 public abstract 인데, 이를 생략할 수 있다. (단, JDK1.8부터는 인터페이스에서 static메서드와 default메서드 예외이다.)
  • 그리고, 이렇게 생략된 제어자들은 컴파일 시에 컴파일러가 자동적으로 추가해준다.

 

2. 인터페이스 구현하는 방법

implements
  • 인터페이스는 구현한다라는 의미의  implements 키워드를 사용한다.
  • 그리고 인터페이스를 implments한 클래스는 반드시 인터페이스에 정의되어 있는 메소드를 재정의 해야만한다.
  • 또한, 인터페이스는 구현을 하지만, 인터페이스로부터 상속받은 추상메서드를 구현하는 것이기 때문에 조금 다른 의미의 부모라고 볼 수 있다. 그래서 오버라이딩 할때는 부모의 메서드보다 넓은 범위의 접근 제어자를 지정해야한다.

  • 인터페이스도 추상클래스처럼 그 자체로는 인스턴스 생성이 불가능하다.

 

3. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

다형성
  • 다형성을 통해 자식 클래스의 인스턴스를 부모타입의 참조변수로 참조가 가능하다라는 것을 알고 있다.
  • 인터페이스 또한, 해당 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있다.
예시
  • 먼저, Vehicle이라는 interface를 생성하고,

  • Bus와 Subway라는 클래스를 만들어 본다.

  • 그리고 인터페이스 타입의 참조변수로 이 2개의 클래스의 인스턴스를 참조할 수 있다.

위 코드 출력 결과

 

4. 인터페이스 상속

인터페이스 상속
  • 인터페이스는 인터페이스로부터만 상속을 받을 수 있으며, 클래스와는 달리 다중상속도 가능하다.
  • 클래스의 상속과 마찬가지로 부모 인터페이스에 정의된 멤버들을 모두 상속 받을 수 있다.

  • 또한, 클래스에서 구현과 상속을 동시에 할 수도 있다.

 

5. 인터페이스의 기본 메소드 (Default Method), 자바 8

기본 메소드 (Default Method)
  • 인터페이스에 메서드를 추가한다라는 의미는 어떤 것일까.
  • 단순히 부모 클래스에 새로운 메서드를 추가하는 것과 다르게, 인터페이스에 메서드를 추가한다라는 것은 "추상 클래스"를 추가하는 것이고 또한 이 인터페이스를 구현한 기존의 모든 클래스들도 변경이 필요하다라는 의미이다.
  • 따라서, 기본 메소드 (Default Method)라는 것을 고안해냈다. 추상 메소드의 기본적인 구현을 제공하는 메소드로 추상 메소드가 아니기 때문에, 추가되어도 인터페이스를 구현한 클래스들에서 변경이 필수적이지 않게 되었다.
  • 메소드 앞에 default 키워드를 붙이면 되고, 일반 메소드처럼 body { }가 필요하다. 접근 제어자는 public이며, 생략이 가능하다.
  • 아래와 같이 interface에 default method를 추가해도 구현체 클래스에는 영향이 없다.
  • 또한, 구현한 클래스에서 재정의가 가능하다.

 

6. 인터페이스의 static 메소드, 자바 8

static 메소드
  • 사실 static 메소드는 인스턴스와 관계가 없는 독립적인 메서드이기 때문에 인터페이스에 추가하지 않을 이유가 없었지만, 규칙의 단순화때문에 인터페이스의 메서드는 추상 메서드여야만 한다 라는 규칙에 포함 될 수 밖에 없었다. 
  • 하지만, 자바 8부터는 static 메서드를 추가할 수 있게 되었다.
  • static 메서드 역시 접근 제어자는 항상 public이며, 생략이 가능하다.
  • 하지만 default 메서드와 달리 구현한 클래스에서 재정의가 불가능하다.

 

7. 인터페이스의 private 메소드, 자바 9

private 메소드
  • 자바 8에서 default 메소드와 static 메소드가 추가되었고, 자바 9에서 private methodprivate static method가 추가되었다.
  • private method로 인해 캡슐화를 유지시킬 수 있고, interface 내부에서의 재사용성이 높아졌다. 
  • private method는 abstract가 될 수 없고, 오직 인터페이스 내부에서만 사용할 수 있다.
  • private static method는 다른 static과 non-static 인터페이스 메소드 내에서 사용할 수 있다.
  • private non-static method는 private static method내에서 사용할 수 없다.
예시
  • 참고자료를 참고하여 예시를 재구성 해보았다.

위 코드 실행 결과

 

8. 인터페이스의 장점

인터페이스의 장점
  • 개발시간을 단축시킬 수 있다. 메소드를 호출하는 쪽에서 메소드의 내용에 관계없이 선언부만 알면 되기 때문이다.
  • 표준화가 가능하다.
  • 서로 아무 관계가 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 할 수 있다.
  • 클래스의 선언과 구현을 분리시킬 수 있기 때문에, 독립적인 프로그램 작성이 가능하다.

 

참고자료