클래스를 작성하는데 있어서 상속관계를 맺어 줄 것인지 포함관계를 맺어 줄 것인지 결정하는 것은 때때로 혼돈스러울 수 있다.
정리
상속관계 '~는 ~이다(is-a)'
포함관계 '~은 ~을 가지고 있다(has-a)'
예)
원(Circle)은 점(Point)이다. - Circle is a Point.
원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point.
설명: 원은 원점(Point)과 반지름으로 구성되므로 위의 두 문장을 비교해 보면 첫 번째 문장보다 두 번째 문장이 더 옳다는 것을 알 수 있다.
public class DrawShape {
public static void main(String[] args) {
Point[] p = {
new Point(100, 100),
new Point(140, 50),
new Point(200, 100)
};
Triangle t = new Triangle(p);
Circle c = new Circle(new Point(150, 150), 50);
t.draw(); // 삼각형을 그린다
c.draw(); // 원을 그린다.
}
}
class Shape {
String color = "black";
void draw() {
System.out.printf("[color=%s]", color);
}
}
class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
Point() {
this(0,0);
}
String getXY() {
return " (" + x+","+y+")"; // x와 y의 값을 문자열로 반환
}
}
class Circle extends Shape { // Circle과 Shape는 상속관계
Point center; // 원의 원점좌표 // Circle과 Point는 포함관계
int r; // 반지름
Circle() {
this(new Point(0, 0), 100); // Circle(Point center, int r)를 호출
}
Circle(Point center, int r) {
this.center = center;
this.r = r;
}
// Shape 클래스를 상속받아 draw() 메서드를 재정의함. color도 상속 받아 사용함.
// 조상클래스에 정의된 메서드와 같은 메서드를 자손클래스에 정의하는 것을 '오버라이딩'이라고 함.
void draw() { // 원을 그리는 대신에 원의 정보를 출력하도록 했다
System.out.printf("[center=(%d, %d), r=%d, color=%s]%n", center.x, center.y, r, color);
}
}
class Triangle extends Shape {
Point[] p = new Point[3]; // 3개의 Point 인스턴스를 담을 배열을 생성한다
Triangle(Point[] p) {
this.p = p;
}
// Shape 클래스를 상속받아 draw() 메서드를 재정의함. color도 상속 받아 사용함.
void draw() {
System.out.printf("[p1=%s, p2=%s, p3=%s, color=%s]%n", p[0].getXY(), p[1].getXY(), p[2].getXY(), color);
}
}
출처: 자바의 정석
'자바' 카테고리의 다른 글
인터페이스가 가지는 객체지향 특징 (0) | 2023.10.21 |
---|---|
객체 지향의 특징 4가지 (0) | 2023.10.20 |
자바의 변성 - 공변/무공변/반공변 (0) | 2022.03.23 |
함수형 인터페이스 (0) | 2022.03.04 |
Comparable (0) | 2022.02.28 |