본문 바로가기
✨ Java/etc

자바(JAVA) - IS-A관계와 HAS-A 관계

by 환풍 2023. 7. 7.
728x90
반응형

객체 지향의 장점은 코드의 재사용이다.

상속의 구현 (IS-A) 또는 객체의 구성 (HAS-A)를 통해 코드 재사용을 수행할 수 있는 두가지 방법이 있다.

 

IS-A 관계 : 일반화 관계(Generalizaion) => 상속 관계

~은 ~다.

상속은 is-a 관계에서 사용하는 것이 효율적이다.

상속을 코드 재사용의 개념으로 이해하면 안된다. 상속을 사용하면 클래스간 결합도가 높아져 상위 클래스를 수정해야할 때 하위 클래스에 미치는 영향이 크다.

즉, 의미상 상하 관계가 분명한 객체를 연결하기 위한 수단으로 사용해야한다.

클래스 선언에서 extends 또는 implements 키워드가 있으면 이 클래스는 IS-A 관계가 있다고 한다.

예) 집은 건물이다. 그러나 건물은 집이 아니다.

HAS-A관계 : 연관관계(Association) => 포함 관계

~은 ~을 가지고 있다.

컴포지션(HAS-A)는 단순히 다른 객체에 대한 참조인 인스턴스 변수의 사용을 의미한다.

HAS-A 관계는 코드 재사용의 생산적인 방법의 구성 관계이다.

예) 자동차에는 엔진이 있다. 집에는 욕실이 있다.

 

 

예시


 

Car 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package relationships;
class Car {
    // Methods implementation and class/Instance members
    private String color;
    private int maxSpeed; 
    public void carInfo(){
        System.out.println("Car Color= "+color + " Max Speed= " + maxSpeed);
    }
    public void setColor(String color) {
        this.color = color;
    }
    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }
}
 
cs

 Car 클래스에는 몇 가지의 인스턴스 변수와 메서드가 있다. 

Maruti는 Car 클래스를 확장하는 특정 유형의 자동차로 Maruti IS-A Car를 의미한다.

 

Maruti 클래스

1
2
3
4
5
6
7
8
class Maruti extends Car{
    //Maruti extends Car and thus inherits all methods from Car (except final and static)
    //Maruti can also define all its specific functionality
    public void MarutiStartDemo(){
        Engine MarutiEngine = new Engine();
        MarutiEngine.start();
        }
    }
cs

Engine 클래스

1
2
3
4
5
6
7
8
9
package relationships;
public class Engine {
    public void start(){
        System.out.println("Engine Started:");
    }
    public void stop(){
        System.out.println("Engine Stopped:");
    }
}
cs

 

Maruti 클래스는 구성을 통해 Engine 객체의 start() 메서드를 사용한다.

Maruti HAS-A Engine이라고 할 수 있다.

 

RelationsDemo 클래스

1
2
3
4
5
6
7
8
9
10
package relationships;
public class RelationsDemo {
    public static void main(String[] args) {        
        Maruti myMaruti = new Maruti();
        myMaruti.setColor("RED");
        myMaruti.setMaxSpeed(180);
        myMaruti.carInfo();
        myMaruti.MarutiStartDemo();
    }
}
cs

RelationsDemo 클래스는 Maruti 클래스의 객체를 만들고 초기화한다.

Maruti클래스에는 setColor(), setMaxSpeed() 및 carInfo() 메서드가 없지만,

Maruti 클래스와 Car 클래스의 IS-A 관계로 사용가능하다.

728x90
반응형

댓글