본문 바로가기

Java/문법 및 이해

[JAVA] IS - A, HAS - A

자바에서 클래스를 생성하다 보면 다른 클래스를 상속하는 경우가 많다.

 

이럴 때 필요한 것이 IS - A 관계이다.

 

상속을 사용하지 않는 HAS-A관계도 있기 때문에 두 가지의 관계를 정리할 것이다.

 

 

1. IS - A

자바 내에서 어느 한 클래스가 다른 클래스를 상속받기 위해서는 IS-A관계를 사용해야 한다.

 

IS-A (is a relationship, inheritance)는 일반적인 개념과 구체적인 개념의 관계이다. 

 

위 처럼 Animal과 Human, Cow, Bird는 서로 상속 관계를 의미하는 사진이다.

 

코드로 보면,

# Animal class
class Animal {
	String name;
    
    void setName(String name) {
    	this.name = name;
    }

}


# Human class
class Human extends Animal {
	void sleep() {
    	System.out.println("zzzzz");
    }
}

# Cow class
class Cow extends Animal {
	void sleep() {
    	System.out.println("zzzzz");
    }
}

# Bird class
class Bird extends Animal {
	void sleep() {
    	System.out.println("zzzzz");
    }
}   
 
# main
public class Sample {
    public static void main(String[] args) {
        Animal human = new Human;
        Animal cow = new Cow;
        Animal bird = new Bird;
    }
}

위와 같은 코드로 나타낼 수 있다.

상속을 나타내는 extends를 사용하여 is-a 관계를 표시한다. 

또한, human과 cow, bird는 Animal 클래스의 setName() 메서드를 사용할 수 있다.

 

IS-A 상속을 사용하면 많은 장점이 있지만, 하위 클래스가 상위 클래스에 종속되기 때문에 이직적인 클래스 간에는 상속을 사용하지 않는 것이 좋다.

 

 

2. HAS-A

HAS-A 관계는 다른 클래스의 기능(변수 혹은 메서드)을 받아들여 사용한다.

has-a 관계는 하위 클래스가 상위 클래스를 소유한다는 의미를 가지고 있다.

물론 상속을 받기도 하지만 상속이 어울리지 않는 경우도 많다.

 

has-a관계는 extends와 같은 키워드를 사용하지는 않는다. 부모 클래스 또는 이 메서드에서 사용하려는 클래스의 객체를 만드는 것이다.

 

class Legs {
	public String howManyLegs() {
    	return "I have four legs";
    }
}

class Dog {
	Legs legs = new Legs();
    
    public void aboutMe() {
    	System.out.println("I am a Dog class and " + legs.howManyLegs());
    }
}

위 코드를 보면 Dog 클래스는 Leg 클래스를 구성하고 있다는 의미로 해석된다.

 

has-a 관계와 관련된 기능은 자바의 인터페이서와 매우 연관성이 있다. 

 

추후에 인터페이스를 공부하게 되었을 때, has-a 관계와 함께 다시 정리할 예정이다.