Language/Java

Java - 인터페이스 복습

둉이 2021. 6. 24. 13:59

 

인터페이스

// 인터페이스 예시
interface RemoteControl {
   public static final int MAX_VALUE = 10;  // public static final 생략 가능 
   int MIN_VALUE = 0;

  public void turnOn();
  public void turnOff();
  public void setVolume(int volume);
}

: 객체의 사용 방법을 정의한 타입

  자바의 다형성과 관련

  상수 필드와 메소드를 가짐(클래스와의 차이점)

- 특징

  1. 상수 필드만 가질 수 있으므로 변수를 선언해도 자동으로 상수 변환

      ex) int a = 1; → public static final int a = 1; 로 변환

  2. 추상 메소드 선언시 public abstract를 생략하고 선언해도 자동으로 변환

      ex) void hello(String name); → public abstract void hello(String name);

  3. 다중 인터페이스 구현 가능

  4. 다중 상속 가능

 

 

추상 메소드

: 실행부가 없는 메소드, abstract 자동으로 생성

// 추상 메소드 예시
void setMute(boolean mute);

 

 

디폴트 메소드

: 앞에 default를 붙여 선언, public의 특성을 가짐

  인터페이스로 바로 호출 불가, new 연산자를 이용하여 객체 선언을 해준 후 사용 가능

// 디폴트 메소드 예시
default void setMute(boolean mute) {
   ...
}

 

 

정적 메소드

: 앞에 static을 붙여 선언, public의 특성을 가짐

 인터페이스로 바로 호출하여 사용 가능  ex) RemoteControl.changeBattery();

// 정적 메소드 예시
static void changeBattery() {
   ...
}

 

 

인터페이스 구현

- 구현 클래스

  : 클래스 선언부 뒤에 implements 인터페이스명 명시

public class Television implements RemoteControl {
   ...
   public void turnOn() {
      sout("TV를 켭니다.");
   }
   ...
}

- 만약 구현시 모든 추상 메소드를 구현하지 않는다면 오류가 발생하므로 class 앞에 abstract를 붙여 추상 클래스로 선언

- 구현 클래스가 작성되면 new 연산자를 이용하여 객체 생성 가능

 

 

익명 구현 객체

: 소스 파일을 만들지 않고 구현 객체를 만들 수 있는 방법

// 익명 구현 객체 예시
new RemoteControl() {
   @Override public void turnOn() { ... }
   @Override public void turnOff() { ... }
   @Override public void setVolume(int volume) { ... }
};

 

 

다중 인터페이스

- 다중 인터페이스로 구현된 클래스의 객체 선언

  1. 클래스명 c = new 클래스명();
     : 구현된 다중 인터페이스의 모든 메소드 사용 가능
  2. 인터페이스명1 c = new 클래스명();
     : 인터페이스1의 메소드만 사용 가능

 

 

자동 타입 변환(Promotion)

: 인터페이스를 매개변수로 받는 메소드의 경우, 자동으로 타입 변환이 일어남

  클래스의 타입 변환과 같음

 

 

강제 타입 변환(Casting)

: 구현 객체가 인터페이스 타입으로 선언된 상태에서 가능

  구현 객체 → 인터페이스 타입으로 변환 가능

// Vihicle은 인터페이스, Bus와 Taxi는 Vihicle을 구현한 클래스라고 가정
Vihicle vihicle = new Taxi();
Taxi t = (Taxi) vihicle;  // 가능
Bus b = (Bus) vihicle;  // 가능
Bus b2 = (Bus) t; // 불가능

 

 

인터페이스 상속

// 인터페이스 상속 예시
public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {
   ...
}

- 하위 인터페이스는 상위 인터페이스의 모든 메소드 사용 가능

- 하위 인터페이스 → 상위 인터페이스로 타입 변환 시, 해당 상위 인터페이스의 메소드만 사용 가능

 

인터페이스 구현시 모든 메소드를 구현하지 않는 경우 오류 발생
 → 해결법
     1. 구현된 클래스를 추상 클래스로 변경(abstract)
     2. 클래스에서 구현되지 않은 메소드를 디폴트 또는 정적 메소드로 변경

 

- 디폴트 메소드의 상속

  1. 그냥 디폴트 메소드를 상속받음

  2. 디폴트 메소드를 오버라이드하여 내용 변경

  3. 디폴트 메소드를 추상 메소드로 재선언

     → 이 경우 해당 인터페이스를 구현하는 클래스는 실체 메소드를 모두 가져야 함

'Language > Java' 카테고리의 다른 글

Java - 기본 API 클래스 정리  (0) 2021.06.25
Java - 중첩 클래스와 중첩 인터페이스, 예외 처리 복습  (0) 2021.06.25
Java - 상속 복습  (0) 2021.06.23
Java - 클래스 복습  (0) 2021.06.22
Java - 참조 타입 복습  (0) 2021.06.19