본문 바로가기
JAVA

14. 상속과 포함

by seongju.lee 2022. 10. 2.

클래스의 관계에는 상속과 포함이 있다.

 

상속

  • 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화 블럭은 상속받을 수 없다.)
  • 자손의 멤버 개수는 조상보다 적을 수가 없다.

포함

  • 클래스의 멤버로 참조변수를 선언하는 것이다.
  • 적은 단위의 클래스를 만들고, 이들을 조합하여 클래스를 만든다.

클래스 간의 관계(상속과 포함) 결정?

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

 

아래 코드를 통해 상속관계와 포함관계의 구조적인 차이를 확인할 수 있다.

아래의 예제같은 경우에는
'원은 점을 가지고 있다' 와 같은 has-A관계가 더 적합하므로 포함관계가 더 적절한 사용예시라고 볼 수 있다.

 

  1. 상속관계 Ex
class Point {
    int x;
    int y;
}

class Circle extends Point {
	int r;
}

public class InherianceEx{
	public static void main(String[] args) {
    
    	Circle c = new Circle();
        
        c.x = 1;
        c.y = 1;
        c.r = 10;
        
    }

}


   2. 포함관계 Ex

class Point {
    int x;
    int y;
}

class Circle {
    Point p = new Point();
    int r;
}

public class HasA{
	public static void main(String[] args){
    	Circle c = new Circle();
        
        c.p.x = 1;
        c.p.y = 1;
        c.r = 10;
    
    }

}

 

 

 

Java는 단일상속만 허용한다.

why?
두 부모에게서 상속을 받고 싶을 때, 만약 동일한 이름을 가진 메서드가 있으면 충돌문제가 발생할 여지가 있다.

때문에, Java에서는 이러한 충돌위험을 제거하기 위해 제공하지 않는다.

 

그렇다면 어떤 방식으로 다중상속을 구현할 수 있을까?

  • 인터페이스를 사용한다.
  • 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

 

아래 예시처럼, 비중이 높은 Tv를 상속관계로 처리하고, 나머지 DVD를 포함관계로 처리한다.

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

class DVD {
	
	boolean power; 
	
	void power() {
		power =  !power;
	}
	
	void play() {
		
	}
	
	void stop() {
		
	}
}

class TvDVD extends Tv {
	DVD d = new DVD();
	
	void play() {
		d.play();
	}
	
	void stop() {
		d.stop();
	}
	
}

 

'JAVA' 카테고리의 다른 글

16. super()와 super  (0) 2022.10.02
15. 오버라이딩  (0) 2022.10.02
13. 멤버변수의 초기화  (0) 2022.09.25
12. this()와 this  (0) 2022.09.24
12. 생성자, 기본 생성자  (0) 2022.09.24