티스토리 뷰

이펙티브 자바 Effective Java 2/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이병준역
출판 : 인사이트 2014.09.01
상세보기

때로는 두 가지 이상의 기능을 가지고 있으며, 그 중 어떤 기능을 제공하는지 표시하는 태그(tag)
가 달린 클래스를 만날 때가 있다.
예를 들어, 아래의 클래스는 원을 표현할 수도 있고 사각형을 표현할 수도 있다.

class Figure { enum Shape { RECTANGE, CIRCLE }; //어떤 모양인지 나타내는 태그 필드 final Shape shape; //태그가 RECTANGLE일 때만 사용되는 필드들 double length; double width; //태그가 CIRCLE일 때만 사용되는 필드들 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); default: throw new AssertionError(); } } }

태그 달린 클래스의 문제점
1. 사용하지 않는 필드가 늘어난다.
2. 새로운 기능을 추가할 때마다 switch, if 문 같은 태그를 구분해 주는 조건문이 필요하다.
3. 가독성이 떨어진다.
4. 객체의 자료형만 봐서는 무슨 역할을 하는 클래스인지 알 수 없다.

클래스 계층을 이용해서 개선할 수 있다.
추상 클래스에 태그 값에 따라 다르게 동작하는 메서드를 추상 메서드로 정의한다.
각각의 기능을 하위 클래스로 정의한다.

abstract class Figure { abstract double area(); } class Circle extends Figure { final double radius; Circle(double radius) { this.radius = radius; } 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; } double area() { return length * length; } }


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함