글 작성자: 취업중인 피터팬
728x90
기본 환경
JDK : 1.8.0_261 버전
JRE : 1.8.0_261 버전
JAVA VERSION : 8 업데이트 261
Eclipse IDE VERSION : 2020-06버전

 

목표

경찰과 총의 관계를 이해하여 소유관계에 대해 이해한다.

이전 게시물과 비교하여 소유관계와 상속관계의 차이를 이해한다.


 

 

코드
package ex12inheritance;
/*
구성관계로 표현하기에 적합한 Has-A관계
		X has a Y => X과 Y를 소유(보유)하고 있다.
		- 경찰이 권총을 소유하고 있다.
		- 경찰이 수갑을 소유하고 있다.
 	
 		Has-A와 같이 소유의 관계를 상속으로 표현하면 클래스 간의
 		강한 연결고리가 형성되어 권총이 없는 경찰을 표현하기가 힘들어진다.
 		따라서 이 경우에는 구성관계로 표현하는 것이 적합한다. 구성관계를 
 		클래스의 맴버로 또 다른 객체를 정의하는 것을 말한다.
 */
class Gun{
	int bullet;
	public Gun(int bNum) {
		bullet = bNum;
	}
	
	//총을 쏘는 행위를 표현한 맴버메소드
	public void shutGun() {
		System.out.println("빵야~~~~!");
		bullet--; //탄환이 감소됨
	}
}
//경찰을 표현한 클래스
class Police{
	
	int handCuffs; //수갑의 보유갯수
	Gun gun;//보유한 권총
	
	public Police(int bNum, int hCuff) {
		handCuffs = hCuff;
		/*
		 권총 보유 여부 초기화
		 		: 만약 총알이 없는 상태라면 보유한 권총이 없는것으로
		 		표현하기 위해 맴버변수를 null로 초기화 한다.
		 		참조변수가 null값이란 것은 아무것도 참조할 객체가 
		 		없다는 의미이다.
		 */
		if(bNum <= 0) {
			gun = null;
		}
		else {
			gun = new Gun(bNum);
		}
	}
	
	//수갑을 채우는 행위를 표현
	public void putHandcuff() {
		System.out.println("수갑채움~! 넌 콩밥~!");
		handCuffs--;
	}
	//경찰이 권총을 발사하는 행위를 표현
	public void shut() {
		if(gun == null) {
			//경창이 권총을 소유하지 못했다면 발사할 수 없다.
			System.out.println("보유한 권총 없음, 헛방");
		}
		else {
			gun.shutGun();
		}
	}
	
}


public class E05HasAComposite {

	public static void main(String[] args) {
		
		//권총을 보유한 경찰을 표현
		System.out.println("==경찰 1==");
		Police police1 = new Police(5, 3);
		police1.shut();
		police1.putHandcuff();
		
		//권총을 보유하지 못한 경찰을 표현
		System.out.println("==경찰 2==");
		Police police2 = new Police(0, 3);
		police2.shut();
		police2.putHandcuff();
	}

}

 

앞에서 컴퓨터는 상속의 관계로 만들었고 경찰과 총은 소유의 관계로 구성을 만들었습니다. 그 이유는 노트북과 테블릿은 컴퓨터 범주안에 포함되지만 총은 경찰의 범주안에 포함되지 않기 때문입니다. 이처럼 사물과 사물의 관계를 객체지향적으로 이해하고 구성할 줄 알아야 가독성이 높은 코드를 완성할 수 있습니다.

 

 

결과 값