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 |