다이아몬드 상속에서의 문제점(이슈)
번식() 메서드를 갖는 슈퍼클래스 동물 클래스를 정의하고 고래와 상어 클래스에서 동물클래스를 상속받기
abstract class 동물2 {
public abstract void 번식();
}
class 상어2 extends 동물2 {
@Override
public void 번식() {
System.out.println("알을 낳아 번식!");
}
}
class 고래2 extends 동물2 {
@Override
public void 번식() {
System.out.println("새끼를 낳아 번식!");
}
}
만약, 다중 상속을 허용할 경우 발생하는 문제점
➡️고래와 상어클래스를 동시에 상속받는 고래상어 클래스 정의
// class 고래상어2 extends 고래2, 상어2 { // 컴파일 에러
//외부 또는 내부에서 고래와 상어클래스가 공통적으로 갖는 번식() 메서드를
//호출하게되면 어느 객체의 번식() 메서드를 호출하는지 분명하지 않기 때문에
//자바에서는 다중 상속이 금지되어있음!
}
예제
전투기능을 갖는 Fightable 인터페이스 => fight() 메서드
변신기능을 갖는 Transformable 인터페이스 => transform() 메서드(리턴값X, 파라미터(int mode)) => 상수 값(MODE_CAR=1, MODE_AIRPLANE=2, MODE_NORMAL=3)
Robot 인터페이스 정의 => fightable 인터페이스, transformable 인터페이스 상속 => 말하기 기능(speak())
Robot 인터페이스를 구현하는 BumbleBee 클래스 정의 => fight() 메서드 호출 시 "로켓발사!" 출력 => transform() 메서드 호출 시 mode값에 따라 다른 형태로 변식 MODE_NORMAL: "기본모드(로봇)로 변신!" 출력 MODE_CAR: "자동차로 변신!" 출력 MODE_AIRPLANE: "비행기로 변신!" 출력 => speak() 메서드 호출 시 "라디오로 말하기!" 출력
package interface_;
public class Test2 {
public static void main(String[] args) {
Bumblebee bee = new Bumblebee();
bee.fight();
bee.spaek();
bee.transform(Bumblebee.MODE_NORMAL);
bee.transform(Bumblebee.MODE_CAR);
bee.transform(Bumblebee.MODE_AIRPLANE);
} // main()
} //class
interface Fightable {
public abstract void fight();
}
interface Transformable {
public static final int MODE_CAR = 1;
public static final int MODE_AIRPLANE = 2;
public static final int MODE_NORMAL = 3;
public abstract void transform(int mode);
}
interface Robot extends Fightable, Transformable {
public abstract void spaek();
}
class Bumblebee implements Robot {
@Override
public void fight() {
System.out.println("로켓발사!");
}
@Override
public void transform(int mode) {
if(mode == Transformable.MODE_CAR) {
System.out.println("자동차로 변신!");
} else if(mode == Transformable.MODE_AIRPLANE ) {
System.out.println("비행기로 변신!");
} else {
System.out.println("기본모드(로봇)로 변신!");
}
}
@Override
public void spaek() {
System.out.println("라디오로 말하기!");
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 인터페이스 ④ - 인터페이스의 필요성(2) (1) | 2023.10.10 |
---|---|
[JAVA] 인터페이스 ③ - 인터페이스의 필요성 (1) | 2023.10.10 |
[JAVA] 예제로 알아보는 인터페이스(Interface) ① (0) | 2023.10.10 |
[JAVA] 레퍼런스 형변환에 대해 알아보자 (0) | 2023.09.26 |
[JAVA] final 키워드 (0) | 2023.09.26 |