객체지향 프로그래밍 - 포함관계
클래스 간의 관계 중 상속 관계와 비슷한 포함관계가 있다. 포함관계란,
한 클래스의 멤버변수를, 다른 클래스의 멤버변수를 참조하는 참조변수로 사용하는 것을 뜻한다.
규모가 큰 하나의 클래스를 만드는 것보다 단위별로 여러 개의 클래스를 작성하고, 포함관계를 사용하면
재사용성이 높고 더 간결하게 클래스를 작성할 수 있다.
포함 관계와 상속 관계 모두 한 클래스에서 다른 클래스를 활용하는 것이기 때문에
둘 중 어느 것을 사용해야할 지 헷갈릴 수 있다. 그럴 땐
'고양이는 동물이다' 처럼 [~는~이다] 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