JAVA/자바의정석

자바(JAVA) : 객체지향 프로그래밍 II (1) - 상속

tigre 2022. 1. 10. 00:09
728x90
반응형

상속(inheritance)

 

[1] 상속의 정의와 장점

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

코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.

 

자바에서 상속을 구현하는 방법은 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends' 와 함께 써주기만 하면 된다.

 

새로 작성하려는 클래스가 Child 이고 상속받고자 하는 기존 클래스가 Parent 일때

class Child extends Parent{
	...
}

이 두개의 클래스는 서로 상속 관계에 있다고 하며, 상속해주는 클래스를 '조상 클래스'라 하고 상속 받는 클래스를 '자손 클래스'라 한다.

조상 클래스 - 부모 클래스, 상위 클래스, 기반 클래스
자손 클래스 - 자식 클래스, 하위 클래스, 파생된 클래스

자손 클래스는 조상 클래스의 모든 멤버를 상속받기 때문에, '자식 클래스'는 '부모 클래스'의 멤버들을 포함한다고 할 수 있다. 클래스는 멤버들의 집합이므로 다음과 같이 표현할 수 있다.

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

반대로 자손인 Child 클래스에 새로운 멤버로 play( ) 메서드를 추가해본다면

class Parent{
	int age;
}

class Child extends Parent {
	void play(){
    	System.out.println("play");
    }

}

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

 

이처럼 조상클래스가 변경되면 자손 클래스는 자동으로 영향을 받지만, 자손 클래스만 변경된다면 조상 클래스에는 아무런 영향을 주지 않는다.

 

자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스보다 같거나 많은 멤버를 갖는다.

즉, 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어나게 된다.

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

Child2를 추가했을때

Parent 클래스와 Child1, Child2 는 모두 상속관계에 있지만

Child1, Child2 클래스는 서로 아무런 관계도 성립되지 않는다.

 

여기에 또다시 Child클래스로부터 상속받는 GrandChild 클래스를 추가한다면

GrandChild클래스는 Child클래스의 자손이면서 Parent클래스로의 자손이기도 하다.

age변수를 추가로 추가하면 GrandChild에도 같이 적용하게 되는것이다.

 

<예제>

class Tv {
	boolean power;
	int channel;
	
	void power() { power = !power;}
	void channelUp() { ++channel; }
	void channelDown() { --channel; }
}

class CaptionTv extends Tv{
	boolean caption;
	void displayCaption(String text) {
		if (caption) {
			System.out.println(text);
		}
	}
	
}

public class Page315 {
	public static void main(String[] args) {
		CaptionTv captionTv = new CaptionTv();
		captionTv.channel = 10;
		captionTv.channelUp();
		System.out.println(captionTv.channel);
		captionTv.displayCaption("Hellow World");
		captionTv.caption = true;
		captionTv.displayCaption("Hellow World");
	}
}

Tv 클래스로부터 상속받고 기능을 추가하여 CaptionTv 클래스를 작성!

자손 클래스의 인스턴스를 생성하면 조상클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다.

[2] 클래스간의 관계 - 포함관계

상속이외에도 클래스를 재사용하는 또 다른 방법이 있는데, 그것은 클래스간에 '포함'관계를 맺어주는 것이다.

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

 

원을 표기하기 위한 Circle 클래스와 좌표상에서 한점을 다루기위한 Point 클래스를 각각 작성해보자

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

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

이와 같이 한 클래스를 작성하는 데 다른 클래스를 멤버변수로 선언하여 포함시키면 보다 간결하고 손쉽게 코드를 짤 수 있다.

 

[3] 클래스간의 관계 설정

상속관계 '~은 ~이다'

포함관계 '~은 ~을 가지고 있다.'

 

[4] 단일 상속

C++에서는 다중상속을 허용하지만 자바에서는 단일 상속만을 허용한다.

 

[5] Object 클래스 - 모든 클래스의 조상

Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.

다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 함으로써 이것을 가능하게 한다.

 

728x90
반응형