JAVA

객체지향 프로그래밍 - 포함관계

HipPopoTamUs 2022. 8. 7. 20:42

클래스 간의 관계 중 상속 관계와 비슷한 포함관계가 있다.  포함관계란,

한 클래스의 멤버변수를, 다른 클래스의 멤버변수를 참조하는 참조변수로 사용하는 것을 뜻한다.

규모가 큰 하나의 클래스를 만드는 것보다 단위별로 여러 개의 클래스를 작성하고, 포함관계를 사용하면

재사용성이 높고 더 간결하게 클래스를 작성할 수 있다.

 

포함 관계와 상속 관계 모두 한 클래스에서 다른 클래스를 활용하는 것이기 때문에

둘 중 어느 것을 사용해야할 지 헷갈릴 수 있다. 그럴 땐

더보기

'고양이는 동물이다' 처럼 [~는~이다] is-a 관계일 땐 상속을

'이어폰은 잭을 가지고있다.' 처럼 [~은~을 가지고있다] has-a 관계일 땐 포함을

항상 딱 떨어지는 것은 아니지만 감을 잡기에 쉬운 방법이다.

 

class DrawShape{
	public void main(String[] args){
    	Point[] p = {new Point(10,10),
                     new Point(20,20),
                     new Point(20,10)};
                     
        Triangle t = new Triangle(p);	//Point 객체 참조배열을 인수로
        t.draw();	// ...(ㄱ)
        }     
}

class Shape{
    String color = "red"; 	//클래스 Shape의 인스턴스 변수
    void draw(){
    	System.out.printf("color: %s\n",color);
	}
}

class Point{
    int x;
    int y;
    
    Point(){this(0,0)}
    Point(int x,int y){
    	this.x = x;
        this.y = y;
    }
    
    String getxy(){
    	return "("+x","+y+")";	// (x,y) 문자열로 반환
    }
}

class Triangle extends Shape{		//Shape를 상속받음
	Point[] p = new Point[3];	//Point 객체 참조변수배열(길이3) 생성 -> 포함관계
    
	Triangle(Point[] p){
		this.p = p}
        
  	void draw(){	//오버라이딩
    	System.out.printf("p1=%s , p2=%s , p3=%s , color=%s\n",
        	p[0].getxy(),p[1].getxy,p[2].getxy(),color)
    }
}

각 클래스 설명 

✔️ DrawShape - 도형을 그리는 클래스 

 

✔️ Shape - 도형 클래스

색상 color 와 색상을 출력하는 draw 변수

 

✔️ Point - 좌표 클래스

객체를 생성할 때 매개변수로 받은 것이 없으면 x=0, y=0

매개변수로 두 값을 받으면 순서대로 x와 y에 저장

반환타입이 String형인 getxy함수 - (x,y) 형식으로 반환

 

✔️ Triangle - 삼각형 클래스

'삼각형(Triangle)은 도형(Shape)이다.' is-a 관계 => 상속관계 사용

Shape 클래스를 상속받음 - Shape의 멤버들 사용 가능

 

'삼각형(Triangle)은 점(Point)를 포함한다.' has-a 관계 => 포함관계 사용

Point 클래스의 인스턴스 참조변수배열 p 생성(길이 3)

 

Point 인스턴스 참조배열을 매개변수로 하는 생성자 => 이 매개변수를 p에 대입해 초기화하는 역할

점 3개와 color를 출력하는 함수 draw (오버라이딩) => Shape 클래스에서 color를 black으로 초기화했으므로 black이 출력됨

 

✔️ (ㄱ)의 결과 : p1=(10,10) , p2=(20,20) , p3=(20,10) , color=black