interface 인터페이스 이름 {
public static final 타입 상수이름 = 값; //상수
public abstract 메서드이름(매개변수목록); //추상메서드
}
- 변수를 가질 수 없다!!
- 메서드는 모두 추상메서드(abstract)이다.
- 접근제어자는 public 이다. (public abstract는 생략가능)
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
class Fighter implements Fightable {
public void move(int x, int y) { /* 구현 내용 */}
public void attack(Unit u) { /* 구현 내용 */}
}
abstract class Fighter implements Fightable {
public void move(int x, int y) { /* 구현 내용 */}
}
Q. 인터페이스란?
A. 추상메서드의 집합 (JDK 1.8 이후 상수, static 메서드, default 메서드가 추가됨)
Q. 인터페이스의 구현이란?
A. 인터페이스의 추상메서드 {몸통} 만들기 = 미완성 설계도 완성하기
// 추상 클래스 구현
class AudioPlayer extends Player {
void play(int pos) {/* 구현 내용*/} //추상메서드를 구현
void stop() {/* 구현 내용*/} //추상메서드를 구현
}
//인터페이스
interface Fighter {
void move(int x, int y);
void attact(Unit u);
}
//인터페이스 구현
class Fighter implements Fightable {
public void move(int x, int y) { /* 구현 내용 */}
public void attack(unit u) { /* 구현 내용 */}
}
Q. 추상 클래스와 인터페이스의 공통점은?
A. 추상메서드를 가지고 있다. = 미완성 설계도
Q. 추상 클래스와 인터페이스의 차이점은?
A. iv를 가질 수 있냐 없냐 차이.(인터페이스는 못 갖는다!)
abstract class Player {
boolean pause; //일시정지 상태를 저장하기 위한 변수
int currentPos; //현재 play되고 있는 위치를 저장함
Player() {
pause = false;
currentPos = 0;
}
/** 지정된 위치(pos)에서 재생을 시작하는 기능이 수행되도록 작성되어야 한다. */
abstract void play(int pos); //추상메서드
/** 재생을 즉시 멈추는 기능을 수행하도록 작성되어야 한다. */
abstract void stop().; //추상메서드
void play() {
play(currentPos); //추상메서드를 사용할 수 있다.
}
}
class Fighter extends Unit implements Fightable { public void move(int x, int y) { /* 내용 생략 */ } public void attack(Fightable f) { /* 내용 생략 */} }
- Unit을 상속 받은 Fighter 클래스.
- Fightable 인터페이스를 구현하고 있는 Fighter 클래스.
- 원래 이렇게 되면 부모가 둘이니까 다중상속이 되어버리고,
다중상속이 문제가 되는 이유는 바로 "충돌" 때문이다.
- 예시) 만약 Unit에도 attack() 메서드가 있고, Fightable에도 attack() 메서드가 있다면 어떤걸 불러올거야?
- 그러나 인터페이스인 Fightable에는 attack()이 구현되어있지 않으므로 Unit의 attack() 불러지게 되면서 충돌하지 않는다!
- 인터페이스가 다형성이 되는 이유.
따라서 아래와 같은 것도 가능하다.(조상클래스) Unit u = new Fighter(); < 자손객체 (인터페이스) Fightable f = new Fighter(); < 자손 객체
예제)이것도됨.
⇩ A가 B를 의존하는 코드
⇩ 만약 A 메서드에서 C를 받을 때, A를 건드려줘야한다.
⇩ 인터페이스 사용시
⇩ C로 바꾸고 싶을 때 - A를 안건드려도됨