티스토리 뷰

상속

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

두 클래스를 부모와 자식으로 관계를 맺어주는 것.

class 자손클래스 extends 부모클래스 {
    // ...
}
클래스 Parent와 Child의 상속계층도 vs 클래스 Parent와 Child의 벤다이어그램

 

 

상속의 특징

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

1.  자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.

  • 단, 생성자와 초기화 블럭은 상속되지 않는다.

2. 자손의 멤버 개수는 조상보다 적을 수 없다

  • 자손의 멤버 개수는 조상보다 같거나 많다.

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

  • 조상의 변경은 자손에 영향을 미친다.

 

예제7-1

더보기

테스트 | SmartTv클래스의 부모인 Tv클래스 주석처리 해보기

[IntelliJ]Cannot resolve symbol 'channel' 
[Eclipse] channel cannot be resolved or is not a filed

결론 : 자손의 변경은 조상에 영향을 미치지 않지만, 조상의 변경은 자손에 영향을 미친다.

 

[클래스의 관계] 2. 포함관계

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.
더보기

클래스의 멤버로 참조변수를 선언하는 것

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인스턴스를 생성했을 때 '비포함관계'와 '포함관계' 시를 구분하여 그림을 그릴 수 있어야 한다.

비포함관계 vs 포함관계 비교

 

작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.

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

더보기

설계 | Circle클래스와 MyPoint클래스는 포함관계

InheritanceTest 실습하기

 

단일 상속(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
댓글
공지사항