class Figure {
enum Shap { RECTANGLE, CIRCLE };
final Shape shape;
double length;
double width;
double radius;
Figure(double radius) {
this.shape = Shape.CIRCLE;
this.radius = radius
}
Figure(double length, double width) {
this.shape = Shape.RECTANGLE;
this.length = length;
this.width = width;
}
double area() {
switch(shape) {
case RECTANGLE;
return length * width;
case CIRCLE;
return Math.PI * (radius * radius);
default:
throw new AssertionsError(shape);
}
태그 달린 클래스의 단점 : 열거 타입 선언, 태그 필드, switch 문 -> 메모리 많이 사용
태그 달린 클래스는 장황하고, 오류를 내기 쉽고, 비효율적이다.
태그 달린 클래스를 클래스 계층 구조로 바꾸는 방법
태그 달린 클래스를 클래스 계층 구조로 변환
abstract class Figure{
abstract double area();
}
class Circle extends Figure {
final double radius;
Circle (double radius) {this.radius = radius; }
@Override
double area() { return Math.PI * (radius * radius); }
}
class Rectangle extends Figure {
final double length;
final double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
double area() { return length * width; }
}