인터페이스
// 인터페이스 예시
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 |