티스토리 뷰
상속
- 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
- 두 클래스를 부모와 자식으로 관계를 맺어주는 것.
더보기

클래스 Parent와 Child의 상속계층도 vs 클래스 Parent와 Child의 벤다이어그램
두 클래스를 부모와 자식으로 관계를 맺어주는 것.
class 자손클래스 extends 부모클래스 {
// ...
}


상속의 특징 ⭐
- 자손 클래스는 조상 클래스의 모든 멤버를 상속받는다. (단, 생성자와 초기화 블럭 제외)
- 자손의 멤버 개수는 조상보다 적을 수 없다(많거나 같다)
- 자손의 변경은 조상에 영향을 미치지 않는다.
더보기


1. 자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.
- 단, 생성자와 초기화 블럭은 상속되지 않는다.
2. 자손의 멤버 개수는 조상보다 적을 수 없다
- 자손의 멤버 개수는 조상보다 같거나 많다.

3. 자손의 변경은 조상에 영향을 미치지 않는다.
- 조상의 변경은 자손에 영향을 미친다.

예제7-1
더보기
테스트 | SmartTv클래스의 부모인 Tv클래스 주석처리 해보기
[IntelliJ]Cannot resolve symbol 'channel'
[Eclipse] channel cannot be resolved or is not a filed
결론 : 자손의 변경은 조상에 영향을 미치지 않지만, 조상의 변경은 자손에 영향을 미친다.
[클래스의 관계] 2. 포함관계
- 클래스의 멤버로 참조변수를 선언하는 것
- 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.
더보기

비포함관계 vs 포함관계 비교
클래스의 멤버로 참조변수를 선언하는 것
class Circle {
int x; // 원점의 x좌표
int y; // 원점의 y좌표
int z; // 반지름(radius)
} // 비포함관계
- 비포함 관계
class Point {
int x; // x좌표
int y; // y좌표
}
class Circle {
Point p = new Point(); // 원점
int r;
} // Circle클래스가 Point클래스를 포함하는 관계
// 포함관계
- 포함 관계 - Circle이 Point를 포함한다.
Circle c = new Circle();
위와 같이 Circle인스턴스를 생성했을 때 '비포함관계'와 '포함관계' 시를 구분하여 그림을 그릴 수 있어야 한다.


작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.
Class Car {
Engine e = new Engine(); // 엔진
Door[] d = new Door[4]; // 문, 문의 개수를 넷으로 가정하고 배열로 처리했다.
}
- Car클래스는 Engine클래스를 포함한다.
- Car클래스는 Door클래스를 포함한다.
클래스 간의 관계 결정하기
- 포함관계 - ‘~은 ~을 가지고 있다(has-a)’(90%)
- 상속관계 ‘~은 ~이다(is - a)’(10%)
더보기

- 포함관계 - ‘~은 ~을 가지고 있다(has-a)’(90%)
- 상속관계 ‘~은 ~이다(is - a)’(10%)
class Circle {
Point c = new Point(); // 원점
int r;
} // 포함관계 - 원은 점을 가지고 있다. (o)
class Circle extends Point {
int r;
} // 상속관계 - 원은 점이다. (x)


📌 프로그래밍
- 설계(90%) + 코딩(10%)
- 설계 능력은 ‘그리기’
예제InheritanceTest
더보기

InheritanceTest 실습하기
설계 | Circle클래스와 MyPoint클래스는 포함관계

단일 상속(single inheritance)
- Java는 단일상속만을 허용한다.
- 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
더보기
Java는 단일상속만을 허용한다.
- c++은 다중상속 허용
- 자바에서 제공하는 인터페이스를 사용하면, '충돌' 문제도 해결하면서, '다중상속' 효과를 낼 수 있다.
class TVCR extends TV, VCR { // 에러. 조상은 하나만 허용된다.
// ...
}
비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
class TvDVD extends Tv {
DVD dvd = new DVD();
int counter = dvd.counter;
void play() {
dvd.play();
}
void stop() {
dvd.stop();
}
void rew() {
dvd.rew();
}
void ff() {
dvd.ff();
}
}
- Tv클래스는 상속관계로 처리하고, 나머지는 포함관계로 설정한 TvDVD클래스 예시
- 코드를 실제로 만든 게 아니라, DVD클래스의 메소드를 호출했다.
- 코드를 직접 만들 필요가 없다.
- 이렇게 하면 인터페이스 사용 대신, 쉽게 '다중 상속'효과를 낼 수 있다.
Object클래스 - 모든 클래스의 조상
- 부모가 없는 클래스는 컴파일러에 의해 자동적으로 Object클래스를 상속받는다. ⭐
- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.(toString(), equals(), hashCode() 등)
- '참조변수'와 '참조변수.toString()'의 출력 결과는 같다. ⭐
더보기

부모가 없는 클래스는 컴파일러에 의해 자동적으로 Object클래스를 상속받는다.

예제InheritanceTest
더보기
c.toString()과 c의 출력 결과는 같다.
System.out.println(c.toString())
System.out.println(c)
// 위 두 문장의 출력 결과는 같다.(println기능)
🍪
📄 - 객체지향개념 암기노트 바로가기
'Java의 정석_기초편' 카테고리의 다른 글
| JVM & JDK (0) | 2022.10.17 |
|---|---|
| 자바의 특징 (0) | 2022.10.17 |
| 변수의 초기화 (0) | 2022.10.13 |
| 생성자(constructor) (0) | 2022.10.12 |
| 오버로딩(overloading)과 오버라이딩(overriding) (0) | 2022.10.12 |
댓글
공지사항
