250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- @configuration
- 의존관계
- fielderror
- 프록시
- 싱글톤
- 티스토리챌린지
- java
- JSON
- 테스트코드
- 오블완
- ocp
- 스프링
- http 메시지 컨버터
- 김영한
- 코드트리조별과제
- 코드트리
- 오버라이딩
- 참조변수
- 백준
- 추상클래스
- equals()
- 다형성
- 코딩테스트
- objecterror
- 인터페이스
- html form
- 서블릿
- HttpServletResponse
- 스프링컨테이너
- DI
Archives
- Today
- Total
minOS
자바의 정석 ch7-5,6 단일상속, Object클래스 본문
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
'TIL > 남궁성의 자바의 정석' 카테고리의 다른 글
자바의 정석 ch7-12~14 패키지, 클래스 패스 (0) | 2023.11.30 |
---|---|
자바의 정석 ch7-10,11 참조변수 super, 생성자 super() (0) | 2023.11.27 |
자바의 정석 ch7-7~9 오버라이딩 (2) | 2023.11.23 |
자바의 정석 ch7-3,4 포함 (1) | 2023.11.22 |
자바의 정석 ch7-1,2 상속 (0) | 2023.11.19 |