개발하는 두더지

[Effective Java 규칙20] 태그 기반 클래스 대신 클래스 상속을 활용하라 본문

Java,Android

[Effective Java 규칙20] 태그 기반 클래스 대신 클래스 상속을 활용하라

덜지 2018. 9. 26. 18:09

[Effective Java 규칙20] 태그 기반 클래스 대신 클래스 상속을 활용하라

Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다.


첫번째 태그 기반 클래스란 무엇일까?

간단하다. 원을 표현할 수도 사각형을 표현할 수도 있는 모양의 넓이를 구하는 클래스가 있다고 생각해보자

태그 기반 클래스는 아래의 코드와 같다.


public class Figure {
enum Shape { RECTANGLE, CIRCLE };
final Shape shape;

double length;
double width;

double radius;

Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}

Figure(double length, double width) {
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);
}
}
}


이런 코드는 오류 발생 가능성이 높고, 비효율적이다. 서로다른 기능이 모여있어서 가독성이 좋지 않고, 객체를 만들 때마다 필요 없는 필드들이 생성되므로 메모리 사용량도 늘어나고, 잘못된 필드를 초기화할 경우 실행도중 프로그램이 죽어버릴 가능성이 있다.


태그 기반 클래스는 문제점이 많으므로 추상클래스를 만들어 이 클래스를 상속하는 클래스들을 구현하는 방법을 사용해야 한다.


abstract class Figure {
abstract double area();
}

public class Circle extends Figure {
final private double radius;
Circle(double radius) { this.radius = radius; }
double area() { return Math.PI * (radius * radius); }
}

public class Rectangle extends Figure {
final private double length;
final private double width;

Rectangle(double length, double width) {
this.length = length;
this.width = width;
}

double area() { return length * width; }
}


단순하고 기능이 명확하며 원래 클래스에서 너저분하게 구현되어있는 보일러플레이트 코드도 없고, 각각의 기능은 별도 클래스로 구현되어 있고, 각 클래스에 필요없는 필드도 존재하지 않는다.
















Comments