오라클자바커뮤니티/자바

상속과 컴포지션

sus 2014. 10. 12. 04:42
 
1. Point를 상속하는 경우
원은 반지름 값을 갖는 하나의 점이다(a Circle is a Point with a radius.)
class Point {
	private double x, y;

	Point(double x, double y) {
		this.x = x;
		this.y = y;
	}

	double getX() {
		return x;
	}

	double getY() {
		return y;
	}
}


class Circle extends Point {
	private double radius;
	
	Circle (double x, double y, double radius) {
		super (x, y); // Call Point (double x, double y)      
		this.radius = radius;
	}
	
	double getRadius () {
	    return radius;   
	 }
}




2. 포인트를 상속하지 않고 Circle안에서 new 하는 경우
(원은 한 점과 반지름을 가지고 있다(a circle has a point and a radius))

==> 아래 코드는 Point의 getX, getY를 다시 만듦으로 redundant code 로 인한 유지보수 어려움(코드의 재사용 실패)
문제가 있고 


class Point {
	private double x, y;

	Point(double x, double y) {
		this.x = x;
		this.y = y;
	}

	double getX() {
		return x;
	}

	double getY() {
		return y;
	}
}


class Circle {
	private Point p;
	private double radius;

	Circle(double x, double y, double radius) {
		p = new Point(x, y);
		this.radius = radius;
	}

	double getX() {
		return p.getX();
	}

	double getY() {
		return p.getY();

	}

	double getRadius() {
		return radius;
	}
}



[예제]

package day3;
class Point {
	private double x, y;
	Point(double x, double y) {		this.x = x;		this.y = y;	}
	double getX() {		return x;	}
	double getY() {		return y;	}
}
//상속
class Circle1 extends Point {
	private double radius;	
	Circle1 (double x, double y, double radius) {
		super (x, y); // Call Point (double x, double y)      
		this.radius = radius;
	}	
	double getRadius () {
	    return radius;   
	 }
}
//컴포지션
class Circle2 {
	private Point p;
	private double radius;

	Circle2(double x, double y, double radius) {		p = new Point(x, y);		this.radius = radius;	}
	double getX() {		return p.getX();	}
	double getY() {		return p.getY();	}
	double getRadius() {		return radius;	}
}
public class CircleTest {
	public static void main(String[] args) {
		Circle1 c1 = new Circle1(1,1, 10);
		System.out.println(c1.getX());
		System.out.println(c1.getX());
		System.out.println(c1.getRadius());
		
		Circle2 c2 = new Circle2(1,1, 10);
		System.out.println(c2.getX());
		System.out.println(c2.getX());
		System.out.println(c2.getRadius());	
		
	}
}