본문 바로가기

Java/본격 Java 상속

[Java] 상속 has-a관계

has-a관계
하위클래스 has a 상위클래스의 관계로 하위 클래스가 상위 클래스를 소유하는 개념입니다.
해석 : '하위클래스'가 '상위클래스'를 소유한다.
has-a관계일 경우 상속을 받기도 합니다.(상속이 어울리지 않는 경우도 있습니다.)
has-a관계에서 소유하지 않는 경우가 있으면 상속받지 않는 것이 좋습니다.
  is-a관계와 has-a관계 이외에는 상속을 하지 않는 것이 보통입니다.(안한다고 봐도 무방합니다.)

.

.

예제1

class Gun
{
	int bullet;
	public Gun(int n){ bullet +=n; }
	public void shot(){
		System.out.println("BBANG!!");
		bullet--;
	}
}

class Police extends Gun
{
	// Police클래스는 Gun클래스를 소유한다는 의미로 상속을 받음.
	// 단, Gun이 없는 Police의 인스턴스를 생성할 수 없으므로 좋은 상속의 예는 아님.
	// has-a관계에서는 항상 소유하지 않는 경우가 있는지 여부를 판단한 후 작업해야 함.
	int handcuff;
	public Police(int n, int c){
		super(n);
		handcuff = c;
	}
	public void putHandcuff(){
		System.out.println("SNAP!");
		handcuff--;
	}
}

class HasInheri 
{
	public static void main(String[] args) 
	{
		Police pman = new Police(5, 3);
		// 총을 가진 경찰 인스턴스를 생성
		// 총이 없는 경찰 인스턴스는 생성 불가
		pman.shot();
		pman.putHandcuff();
	}
}

.

이런 경우에는 Gun을 상속하지 않아도 되는 클래스가 존재하게된다.

그런 경우를 생각해서 다시 코딩을 해본다.

.

.

예제2

// 총이 없는 경찰 인스턴스도 생성할 수 있는 프로그램
class Gun
{
	int bullet;
	public Gun(int n){ bullet +=n; }
	public void shot(){
		System.out.println("BBANG!!");
		bullet--;
	}
}

class Police
{
	int handcuff;
	Gun pistol;
	public Police(int n, int c){
		handcuff = c;
		if (n > 0)
		{ // 지급받은 총알이 있으면
			pistol = new Gun(n); // Gun인스턴스 생성(총 지금)
		}else{ // 지급받은 총알이 없으면(초잉 없는 경찰일 경우)
			pistol = null; // pistol인스턴스를 생성하지 않음.
			// null : 객체가 비었을 때의 값을 의미
		}
	}
	public void putHandcuff(){
		System.out.println("SNAP!!");
		handcuff--;
	}
	public void shot(){
		if(pistol == null){ // pistol객체가 비었으면(null은 객체의 '==' 연산자로 비교 가능)
			System.out.println("No Gun");
		}else{
			pistol.shot();
		}
	}
}

class HASCompsite 
{
	public static void main(String[] args) 
	{
		Police pman1 = new Police(5,3);
		pman1.shot();
		pman1.putHandcuff();

		Police pman2 = new Police(0, 3);
		pman2.shot();
		pman2.putHandcuff();
	}
}

.

Police에서 Gun을 상속할 때 바로 상속하는 것이 아니라 조건을 준다.

Gun이 필요없는 조건을 만들어 작동하게 한다.

728x90
반응형

'Java > 본격 Java 상속' 카테고리의 다른 글

[Java] 오버라이딩(overriding)과 오버로딩(overloading)  (0) 2020.06.30
[Java] 오버라이딩(overriding)  (0) 2020.06.30
[Java] 상속 is-a관계  (0) 2020.06.29
[Java] static 상속  (0) 2020.06.29
[Java] 상속 실습  (0) 2020.06.29