안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
//부모 클래스
public class Shape {
private double area;
public Shape() {}
public Shape(double area) {
this.area = area;
}
public void setArea(double area) {
this.area = area;
}
public double getArea() {
return area;
}
public void draw() {
System.out.println("도형을 그린다.");
}
}
//자식 클래스
public class Circle extends Shape {
private Point center;
private int r;
public Circle() {
this(new Point(200, 200),50); //기본원
}
public Circle(Point center, int r) {
this.center = center;
this.r = r;
}
public void setCenter(Point center) {
this.center = center;
}
public void setR(int r) {
this.r = r;
}
public Point getCenter() {
return center;
}
public int getR() {
return r;
}
//중심점 (50,50)에 반지름이 25인 원을 그린다.
@Override
public void draw() {
System.out.println("중심점 " + center.toString() + "에 반지름이 " + r + "인 원을 그린다.");
}
@Override
public String toString() {
return "Circle [center = " + center + ", r = " + r + "]";
}
}
//Point 클래스
public class Point {
private int x;
private int y;
public Point() {}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public String toString() {
return String.format("(%d,%d)", x, y);
}
}
//Run 클래스
public class ShapeMain {
public static void main(String[] args) {
Circle c1 = new Circle();
Point point = new Point(40, 40);
c1.setCenter(new Point(50, 50));
c1.setR(25);
c1.draw(); //중심점 (50,50)에 반지름이 25인 원을 그린다.
Circle c2 = new Circle();
c2.draw();
Circle c3 = new Circle(point, 200);
c3.draw();
System.out.println(c3.toString());
}
}
@콘솔출력값
중심점 (50,50)에 반지름이 25인 원을 그린다.
중심점 (200,200)에 반지름이 50인 원을 그린다.
중심점 (40,40)에 반지름이 200인 원을 그린다.
Circle [center = (40,40), r = 200]
부모 클래스 Shape와 자식 클래스 Circle은 is-a-상속 관계(일반화 관계 Generaliztion)를 나타내고 있으며,
Circle 클래스와 Point 클래스는 has-a-포함 관계(연관 관계 Association)를 나타내고 있습니다.
또한 Main 메소드에서 해당 코드를 두 가지 방식으로 표현할 수 있는데요,
Point point = new Point(40, 40);
//첫번째 방식
Circle c3 = new Circle(point, 200);
//두번째 방식
Circle c3 = new Circle(new Point(40, 40), 200);
@콘솔출력값
중심점 (40,40)에 반지름이 200인 원을 그린다.
중심점 (40,40)에 반지름이 200인 원을 그린다.
첫 번째 방식은 Point 객체를 만들어 참조변수를 매개인자로 넘겨주었고,
두 번째 방식은 Point 객체를 바로 매개인자로 넘겨주었습니다.
결론적으로는 동일한 값을 가진 객체를 넘겨주었기 때문에 출력값은 동일하지만 메모리 상에는 차이점이 있습니다.
첫 번째 방식은 Aggregation 약집합 - Circle 타입이 Point 객체의 생명 주기를 결정하지 않음
이 의미는 Point 객체를 별도로 만들어 point 참조변수에 객체를 가리키는 주소값을 담아놓았기 때문에 Circle이 사라지더라도 Point 객체는 그대로 살아있습니다. 따라서 언제든 가져와 쓸 수 있는 것이죠.
두 번째 방식은 Composition 강집합 - Circle 타입이 Point 객체의 생명 주기를 결정함
이 의미는 Circle의 매개인자로 바로 new Point(40, 40), Point의 객체 자체를 넘겨주었기 때문에 Circle이 사라지면 넘겨준 Point 객체도 사라지게 되는 것입니다.
이러한 차이점이 있으므로 때에 맞게 약집합 혹은 강집합의 방식을 사용해야겠죠?
'Java > Java' 카테고리의 다른 글
다형성) instanceof 키워드(캐스팅 가능 여부 확인) (0) | 2022.03.24 |
---|---|
객체 지향 3대 원칙) 다형성에 대하여, 업 캐스팅, 다운 캐스팅 (0) | 2022.03.24 |
상속) super 키워드, super() 메소드, protected 접근 제한자 (0) | 2022.03.22 |
상속) 메소드 오버라이딩 (0) | 2022.03.21 |
상속) 최상위 클래스 Object, toString(), equals(Object obj), hashCode(), clone() (0) | 2022.03.21 |