JAVA 상속

Dev.Shinny·2022년 9월 22일
0

자바의 정석

목록 보기
5/18

상속의 정의와 장점

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

상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고, 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.

자바의 상속을 구현하는 방법은 아래와 같다.

class Child extends Parent{
	//...
}

새로 작성하고자 하는 클래스명 뒤에 상속받고자 하는 클래스명을 키워드 'extends'와 함께 써 주기만 하면 된다.

조상 클래스 = 부모 클래스 = 상위 클래스
자손 클래스 = 자식 클래스 = 하위 클래스

class Parent {}
class Child extends Parent {}

클래스 간 상속관계를 그림으로 표현한 것을 상속계층도라고 한다.

자손 클래스는 조상 클래스의 모든 멤버를 상속받기 때문에, Child 클래스는 Parent 클래스의 멤버들을 포함한다.

class Parent {
	int age;
}

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

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

자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스보다 같거나 많은 멤버를 갖는다. 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어난다.

그래서 상속을 받는다는 것은 조상 클래스를 확장(extend)한다는 의미로 해석할 수 있고 이것이 상속에 사용되는 키워드가 되는 이유이다.

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

조상 클래스를 변경하면 자손 클래스에, 자손의 자손 클래스 까지 영향을 받기 떄문에, 클래스간 상속관계를 맺어 주면 자손 클래스들의 공통적인 부분은 조상 클래스에서 관리하고 자손 클래스는 자신에 정의된 멤버들만 관리하면 되므로 각 클래스이 코드가 적어져서 관리가 용이하다.

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

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

public class CaptionTvTest {
	public static void main(String[] args) {
		
		CaptionTv ctv = new CaptionTv();
		ctv.channel = 10;
		ctv.channelUo();
		System.err.println(ctv.channel);
		ctv.displayCaption("Hello!");
		ctv.caption = true;
		ctv.displayCaption("Hello, Java!");		
	}
}

< 결과 >

업로드중..

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

자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스가 생성된다.

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

상속이외에도 클래스를 재사용하는 또 다른 방법은 클래스간에 '포함(Composite)'을 맺어 주는 것이다. 클래스 간 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스이 타입의 참조변수를 선언하는 것을 뜻한다.

class Circle{
	int x, y, r;
}

class Point{
	int x, y;
}


(1)
class Circle{
	int x, y, r;
}

(2)
class Circle{
	point c = new Point();
    int r;
}

(1)번과 달리 (2)번은 Point 클래스를 재사용해서 Circle 클래스를 작성한 것이다. 하나의 거대한 클래스를 작성하는 것보다 단위별로 여러 개의 클래스를 작성한 다음, 이 단위 클래스들을 포함관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있다.

클래스간 관계 결정

상속과 포함 관계 중 어떤 관계를 결정해야 할 지 고민된다면 아래와 같은 방법을 생각해보면 된다.

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

예를 들어 '원(Circle)은 점(Point)이다.' 보다는 '원(Circle)은 점(Point)을 가지고 있다.'가 더 옳다. 따라서 Circle 클래스와 Point 클래스는 상속 관계 보다 포함관계를 맺어주는 것이 더 옿다.

자바의 상속

단일 상속

자바에서는 오직 단일 상속만을 허용한다.

다중상속을 허용하면 여러 클래스로부터상속받을 수 있기 때문에 복합적 기능을 가진 클래스를 쉽게 작성할 수 있지만, 클래스간 관계가 매우 복잡해진다는 것과 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 없다는 단점이 있다.

Object 클래스

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

다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 한다.







< 혼공 _ 자바의 정석 요약 >

profile
Hello I'm Shinny. A developer who try to enjoy the challenge.

0개의 댓글