[Java] Ch07_1. 상속(inheritance)

토끼는 개발개발·2022년 1월 20일
0

Java

목록 보기
25/33
post-thumbnail

Chapter07. 객체지향 프로그래밍Ⅱ


✏️ 1. 상속(inheritance)


1.1 상속의 정의와 장점

상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

class Child extends Parent { // Parent클래스를 상속받는 새로운 Child클래스
	// ...
}

상속은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. 상속의 구현은 위처럼 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써주면 된다.

상속해주는 클래스를 '부모 클래스'라고 하고, 상속 받는 클래스를 '자식 클래스'라고 한다.

만일 Parent클래스에 age라는 정수형 변수를 멤버변수로 추가하면, 자식 클래스는 부모의 멤버를 모두 상속받기 때문에, Child클래스는 자동적으로 age라는 멤버변수가 추가된 것과 같은 효과를 얻는다.

반대로, Child 클래스에 새로운 코드가 추가되어도 부모인 Parent클래스는 아무런 영향도 받지 않는다.

- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.


▶ ✨ 예제 1

class Tv {
	boolean power; //전원상태(on/off)
	int channel;
	
	void power() { power = !power;}
	void channelUp() {  ++channel; }
	void channelDown() { --channel; }
}

class CaptionTv extends Tv {
	boolean caption; //캡션상태(on/off)
	void displayCaption(String text) {
		if (caption) { //캡션 상태가 on(true)일 때만 text를 보여준다.
			System.out.println(text);
		}
	}
}

public class CaptionTvTest {
	public static void main(String[] args) {
		CaptionTv ctv = new CaptionTv();
		ctv.channel = 10; // 부모 클래스로부터 상속받은 멤버
		ctv.channelUp(); // 부모 클래스로부터 상속받은 멤버
		System.out.println(ctv.channel);
		ctv.displayCaption("Hello world");
		ctv.caption = true; //캡션 기능을 켠다.
		ctv.displayCaption("Hello world");
	}

}



1.2 클래스간의 관계 - 포함관계

클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.

예를 들어 Circle이라는 클래스를 다음과 같이 작성했다고 가정하자.

class Circle {
	int x; // 원점의 x좌표
    int y; // 원점의 y좌표
    int r; // 반지름
}

그리고 좌표상의 한 점을 다루기 위한 Point 클래스가 다음과 같이 작성되어 있다고 하자.

class Point {
	int x;  // x좌표
    	int y;  // y좌표
}

Point클래스를 재사용해서 Circle클래스를 작성한다면 다음과 같이 할 수 있을 것이다.

class Circle {
	Point c = new Point(); //원점
    	int r;
}

이와 같이 한 클래스를 작성하는 데 다른 클래스를 멤버변수로 선언하여 포함시키는 것을 포함관계라고 한다.




1.3 클래스간의 관계 결정하기

상속관계 '~은 ~이다.(is-a)'
포함관계 '~은 ~을 가지고 있다. (has-a)'

클래스를 작성하는데 있어서 상속관계를 맺어줄 것인지 포함관계를 맺어줄 것인지 결정하는 것은 때때로 혼돈스러울 수 있다.

이 때 위와 같이 문장을 만들어보면 클래스간의 관계가 보다 명확해진다. 이 문장이 완전히 맞는 것은 아니지만 감을 익히는데 좋다.

  • 원(Circle)은 점(Point)이다.
  • 원(Circle)은 점(Point)을 가지고 있다.

두 문장을 비교해 보면 첫 번째 문장보다 두 번째 문장이 더 옳다는 것을 알 수 있다.
즉, 둘은 상속관계보다 포함관계가 옳다.




1.4 단일 상속(single inheritance)

다른 객체지향언어인 C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한 '다중삭속'을 허용하지만 자바에서는 오직 단일 상속만을 허용한다. 그래서 둘 이상의 클래스로부터 상속받을 수 없다.

예를 들어 TV클래스와 VCR클래스가 있을 때, 이 두 클래스로부터 상속을 받는 TVCR클래스를 작성할 수 없다.

class TVCR extends TV, VCR { //에러. 조상은 하나만 허용된다.
	//...
}

다중삭속은 여러 클래스로부터 상속받아 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만, 클래스간의 관계가 매우 복잡해지고 상속받은 멤버간의 이름이 같은 경우 구별할 수 없다는 단점을 가지고 있다.

자바는 다중상속의 장점을 포기하고 단일상속만을 허용했다.




1.5 Object클래스 - 모든 클래스의 조상

Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 함으로써 이것을 가능하게 한다.

만일 다음과 같이 다른 클래스로부터 상속을 받지 않는 Tv클래스를 정의하였다고 하자.

class Tv {
	...
}

위의 코드를 컴파일 하면 컴파일러는 위의 코드를 다음과 같이 자동적으로 Object클래스를 상속받도록 한다.

class Tv extends object {
	...
}

모든 상속계층도의 최상위에는 Object클래스가 위치한다. 그래서 자바의 모든 클래스들은 Object클래스의 멤버들을 상속 받기 때문에 Object클래스에 정의된 멤버들을 사용할 수 있다.




참고
자바의 정석(저자:남궁성)


오늘의 한 줄

객체지향의 꽃인 상속에 대해 배웠다. 1장에서 배웠던 객체지향언어의 장점인 '코드의 재사용성'을 잘 보여줄 수 있는 부분이 상속인 것 같다.
익숙하게 잘 사용한다면 훨씬 더 클린한 코드를 작성할 수 있지 않을까.

다음은 오버라이딩에 대해 공부하겠다.

profile
하이 이것은 나의 깨지고 부서지는 기록들입니다

0개의 댓글