본문 바로가기
도메인 주도 설계

왜 Enum을 아래와같이 작성했을까?

by simplify-len 2020. 7. 15.
/**
 * Created by joenggyu0@gmail.com on 4/7/20
 * Github : http://github.com/lenkim
 */

package net.slipp.moim.domain.model.recruit;

public enum Status {

    BEGIN {
        public boolean isBegun() {
            return true;
        }
    },
    WORKING {
        public boolean isWorking() {
            return true;
        }
    },
    FINISH {
        public boolean isFinished() {
            return true;
        }
    };

    public boolean isBegun() {
        return false;
    }

    public boolean isWorking() {
        return false;
    }

    public boolean isFinished() {
        return false;
    }
}

위 코드를 이해하기 앞서서 Status는 값으로 표현된다. 이는 엔티티와 상반되는 개념으로, 반버논 책에서는

값으로 표현되는 표준 타입 이라는 말을 썼다.

표준 타입 > 대상의 타입을 나타내는 서술적 객체. 대상(엔티티)이나 설명(값)은 그 자체로 존재하기도 하지만, 타입에 따라 해당 대상을 구분해주는 표준 타입이 존재할 수도 있음 = 열거형

예를 들어, PhoneNumber(값)이 있다면 이것은 "집(Home) 번호인가?", "휴대폰(Mobile) 번호인가?", "회사(Work) 번호인가?" 이렇게 전화의 표준타입을 나타낸다.

위 코드도 마찬가지다. Status 값이 있다면, 이건 "시작인가? 진행중인가? 마감되었는가?" 라는 형태의 표준타입을 사용하게 된 것이다.

열거형 선언의 가장 아래쪽에는 모든 상태의 기본값 행동을 구현한 두 메서드인 isBegun()과 isWorking(), isFinished()가 있다. 모든 메소드는 모두 기본값으로 false을 반환하는데, 이는 올바른 기본 행동이다. 그러나 이 메서드는 각 상태의 정의에서 자신의 특정 상태에 맞쳐 true를 반환하도록 재정의된다.

댓글