minOS

자바의 정석 ch7-5,6 단일상속, Object클래스 본문

TIL/남궁성의 자바의 정석

자바의 정석 ch7-5,6 단일상속, Object클래스

minOE 2023. 11. 22. 23:16
728x90

ch7-5 단일상속

 

- 자바는 단일 상속만 하용( c++ 은 다중상속 가능)

다중 상속시 부모 클래스에 메소드 이름이 같고, 기능이 다르면 충돌이 일어나기 때문에 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` 메서드를 오버라이드하여 원하는 문자열을 반환하도록 변경할 수 있습니다.

 

728x90