본문 바로가기
Programming/Java

[whiteship 온라인 스터디] 8주차 과제 - 인터페이스

by 읽고 쓰는 개발자 2021. 2. 13.

github.com/whiteship/live-study/issues/8

 

8주자 과제: 인터페이스 · Issue #8 · whiteship/live-study

목표 자바의 인터페이스에 대해 학습하세요. 학습할 것 (필수) 인터페이스 정의하는 방법 인터페이스 구현하는 방법 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법 인터페이스 상속 인터

github.com

목표

자바의 인터페이스에 대해 학습하세요.

학습할 것 (필수)

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

출처 : https://www.javatpoint.com/interface-in-java

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

class 키워드 대신 interface 키워드를 사용하여 선언한다.

[ public ] interface 인터페이스명 { 

}

 

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

인터페이스 구현(implement) 객체 : 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가진 객체 

 

구현 클래스 : 구현 객채를 생성하는 클래스 

 

(1) 구현 클래스 

보통의 클래스와 비슷하지만 인터페이스 타입으로 사용할 수 있음을 알려주기 위하여 클래스 선언부에 implement 키워드를 추가하고 인터페이스명을 명시한다.

또한, 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언해야한다.

  • interface의 모든 메소드는 기본적으로 public 접근 제한자를 가지기 때문에(자바9 이전), 구현 메소드 또한 그보다 낮은 접근 제한으로 작성불가하다.
  • 인터페이스 변수를 선언하고 구현 객체를 대입하면 인터페이스로 구현 객체를 사용할 수 있다.
public class 구현클래스명 implement 인터페이스명 {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}

(2) 익명 구현 객체 

  • 필드와 메소드를 선언할 수 있지만, 익명 객체 안에서만 사용할 수 있고 인터페이스 변수로 접근할 수 없다.
  • 자바 컴파일러에 의해 익명 구현 객체 또한 클래스파일로 컴파일된다. 
인터페이스 변수 = new 인터페이스() {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}

 

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

인터페이스는 클래스와 달리 다중 상속을 허용한다. extends 키워드 뒤에 상속할 인터페이스 나열이 가능하다. 

하위 인터페이스를 구현하는 클래스는 하위 인터페이스 메소드 + 상위 인터페이스 메소드 모두 구현해야한다. 

상, 하위 인터페이스 구현한 클래스는 상,하위 인터페이스 구현 클래스로 타입 변환이 가능하다. -> 하위 인터페이스로 타입 변환하면 상,하위 구현 메소드 모두 사용 가능하지만, 상위 인터페이스로 타입이 변환되면 상위 인터페이스에 선언된 메소드만 사용 가능하다.

 

참조가 인터페이스라면 해당 구현체는 인터페이스 정의 메소드만 사용 가능.

public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {

}

상속받는 두 인터페이스에 동일 메소드가 존재할 때, 파라미터 형식이 다르다면 다중 상속 가능. but 동일명, 동일 파라미터 형식, 리턴타입만 다르다면 다중 상속 불가하다.

 

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

기본 메소드(default method ) : 인터페이스에서 선언&구현된 메소드. 해당 인터페이스를 구현하는 객체들이 공유하여, 따로 구현하지 않아도 사용 가능한 메소드. 하지만 인터페이스를 구현하지 않으면 기본 메소드 사용이 불가능하다.

 

기본 메소드의 필요성 : 하나의 인터페이스가 생성되고, 해당 인터페이스의 구현체가 많은 상황에서 해당 인터페이스의 기능을 추가하고 싶을 때, 구현체의 소스코드를 수정하거나 추가하지 않고 인터페이스의 기능만 추가할 수 있다.

 

디폴트 메소드가 있는 인터페이스 상속 (활용법)

  • 디폴트 메소드를 단순히 상속만 받는다
  • 디폴트 메소드를 재정의(Override)해서 실행 내용을 변경한다.
  • 디폴트 메소드를 추상 메소드로 재선언한다.

재정의한 메소드가 아닌, 인터페이스의 디폴트 메소드를 호출하는 방법 : 상위 클래스의 메소드를 호출하기 위한 일반적인 방법인 super 키워드를 사용하면 Object (객체 최상위 부모 클래스)를 상속받았기 때문에 Object 객체에만 접근된다. 

-> 인터페이스의 super 키워드를 사용한다. 인터페이스에 super 키워드를 이용하여 메소드 호출 가능하다. (자바8)

인터페이스명.super.디폴트메소드명();

 

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

형태 : 클래스의 정적 메소드와 완전히 동일. 인터페이스 레벨에서 정의되는 메소드이기 때문에 오버라이드 범위에 들지 않는다.

[public] static 리턴타입 메소드명(매개변수, ... ) {	//정적 메소드는 public이기에 생략해도 컴파일 과정에서 추가됨.
	
}

 

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

자바9부터 인터페이스는 비공개(private) 메소드를 만들 수 있다.

인터페이스의 private method : static or instance method는 될 수 있지만 default method는 될 수 없다. : 인터페이스 레벨에서 정의되는 메소드이기 때문에 오버라이드 범위에 들지 못하기 때문.

인터페이스 자체에 있는 메소드에서만 쓸 수 있기 때문에, 인터페이스 안의 타 메소드의 헬퍼 메소드로만 사용할 수 있다.