태그 달린 클래스?
해당 클래스가 어떤 타입인지를 나타내는 필드를 포함하는 클래스
태그 달린 클래스는 단점이 한가득이다. 장황하고 오류를 내기 쉽고 비효율적이다.
아래의 예시를 보자
class Figure{
enum Shape { RECTANGLE, CIRCLE };
final Shape shape;
// 사각형일 때만 사용
double width;
double length;
// 원 일 경우에만 사용
double radius;
Figure(double radius){
shape = Shape.CIRCLE;
this.radius = radius;
}
Figure(double length, double width){
shape = Shape.RECTANGLE;
this.width = width;
this.length = length;
}
double area(){
switch(shape){
case RECTANGLE:
return length*width;
case CIRCLE:
return MATH.PI * (radius * radius);
default:
throw new AssertionError(shape);
}
}
}
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 width * length };
}
class Square extends Rectangle{
Square(double side){
super(side, side);
}
}