다중 상속시 부모 클래스에 메소드 이름이 같고, 기능이 다르면 충돌이 일어나기 때문에 OPP 설계로 부적절함
- 다중 상속의 기능을 하도록 만드는 법
1)비중이 높은 클래스 하나만 상속관계로 정의하고 나머지는 포함관계로 만든다.
class Tv{
boolean power;
int channel =10;
void power(){power=!power;} //전원상태 변경
void channelUp(){++channel;} //채널 +1
void channelDown(){--channel;} //채널 -1
}
class Dvd {
// 멤버 변수
boolean power;
int channel=20;
// 전원 상태 변경 메서드
void togglePower() {
power = !power;
System.out.println("전원: " + (power ? "켜짐" : "꺼짐"));
}
// DVD 재생 메서드
void play() {
if (power) {
System.out.println("DVD가 재생 중입니다.");
} else {
System.out.println("먼저 DVD 플레이어의 전원을 켜세요.");
}
}
}
class TvDvd extends Dvd{
Tv tv = new Tv();
void power(){
tv.power();
}
void channelUp(){
tv.channelUp();
}
void channelDown(){
tv.channelDown();
}
}
public class Main {
public static void main(String[] args) {
TvDvd tvdvd = new TvDvd();
tvdvd.tv.channelDown(); // tv 채널 10 -> 9
tvdvd.togglePower(); // tvdvd 전원상태 false -> true , 전원상태 출력
System.out.println(tvdvd.tv.channel); // 9
System.out.println(tvdvd.channel); // 20
}
}
출력값
2)인터페이스를 사용하면 충돌 문제없이 다중 상속과 같은 효과를 발휘한다.
ch7-6 Object 클래스
조상이 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다. - 조상이 있는 클래스
class SmartTv extends Tv { //Tv 클래스가 부모 클래스
}
- 조상이 없는 클래스
class Tv{
}
조상이 명시되지 않은 클래스는 컴파일러가 자동으로 Object 클래스를 상속시킨다.
class Tv extends Object{
}
이 두 클래스는 본질적으로 동일한 클래스 계층 구조를 갖는다. 따라서 모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받는다.
메서드 예시 equals(Object obj): 객체의 동등성을 검사 hashCode(): 객체의 해시 코드를 반환 toString(): 객체의 문자열 표현을 반환
toString 메소드 사용
class Point{
int x;
int y;
}
class Circle {
Point p = new Point(); //원점
}
public class Main {
public static void main(String[] args) {
Circle c = new Circle();
System.out.println(c.p.toString());
}
}
출력값
참고 `Point@28a418fc`는 Java의 `Object` 클래스에서 상속된 `toString` 메서드의 기본 출력 형식입니다. 이 메서드는 객체의 문자열 표현을 반환하는데, 기본적으로는 클래스 이름과 "@" 기호 뒤에 객체의 해시 코드를 16진수로 나타낸 문자열이 반환됩니다.
여기서 `Point` 클래스의 `toString` 메서드가 명시적으로 오버라이드되지 않았다면, `Object` 클래스의 기본 `toString` 메서드가 사용되어 위와 같은 출력이 나타납니다.
해시 코드는 객체의 메모리 주소와 관련이 있으며, 서로 다른 객체는 서로 다른 메모리 주소를 갖기 때문에 그 값이 다릅니다.
만약 `Point` 클래스에서 `toString` 메서드를 오버라이드하고 좀 더 유용한 정보를 출력하도록 수정하고 싶다면, `toString` 메서드를 오버라이드하여 원하는 문자열을 반환하도록 변경할 수 있습니다.