boolean을 flag처럼 사용하고 싶다면 enum을 사용하자

8412 단어 JavaJava



chess 미션 중에, 절대값으로 계산할지, 단순 계산을 할지 정해야하는 로직이 필요해 boolean 태그를 사용하였다.

그런데, boolean 값을 flag처럼 사용하는 것이 좋은 방법이 아니고 enum을 통해 관리하는 것이 좋다는 리뷰를 받고 이에 대해 알아보았다.

Prefer enums over booleans

위의 글에서 설명하는 내용을 좀 더 풀어서 정리해보려 한다.

boolean flag의 문제

1. 이분법적인 표현만이 가능하다.

public void addItem(final Item item, final boolean deliveryComplete) {
		
}

배송 완료면 deliveryComplete가 true, 배송이 완료되지 않았다면 deliveryComplete가 false로 구현하는 코드이다.

그런데, 만약 배송에 대한 상태가 배송완료, 배송중, 배송준비중, 출고처리중 등 여러 가지로 바뀐다면 어떻게 할까? 아래와 같이 구현할 것인가?

public void addItem(final Item item, 
					final boolean deliveryComplete, 
					final boolean isDelivering) {
		
}

위보단 아래처럼 enum으로 관리하는 것이 요구 사항 변경에 유연하게 대응할 수 있다.

public enum DeliveryState {
		COMPLETE,
		DELIVERING,
		//RELAESING,
		//ORDER_ACCEPTING, 필요할 때 마다 추가
		;
}

2. 모호한 해석을 낳을 수 있다.

public void addItem(final Item item, final boolean deliveryComplete) {
		
}

deliveryComplete가 false라면 어떤 상태일까? 주문 접수중? 출고 처리중? 배송중?

이렇게 boolean 태그는 이분법적인 표현이기 때문에 여러 가지로 해석 될 수 있다.

3. 실수를 유발한다.

public void addItem(final Item item, 
					final boolean deliveryComplete, 
					final boolean isClothes) {
		
}

위와 같이 두 개의 boolean 태그를 사용하는 메소드가 있다.

addItem(new Item(), false, true); // 배송되지 않은 옷

위와 같은 구조는 개발자가 실수할 여지를 줄 수 있는(?) 코드이다. 아래와 같이 개발자가 실수로 boolean 변수의 순서를 바꿔서 넣었을 시에, 심각한 버그를 유발한다.

addItem(new Item(), true, false); // 배송된 옷이 아닌

하지만 enum으로 표현할 시에는

public void addItem(final Item item, 
					final DeliveryState deliveryState, 
					final ItemKind itemKind) {
		
}
addItem(new Item(), DeliveryState.COMPLETE, ItemKind.CLOTHES);
//아래와 같이 컴파일 에러가 발생하기 때문에 실수할 여지가 없다.
addItem(new Item(), ItemKind.CLOTHES, DeliveryState.COMPLETE);

4. enum에 비해 가독성이 떨어진다.

addItem(new Item(), true);
//vs
addItem(new Item(), DeliveryState.COMPLETE);

좋은 웹페이지 즐겨찾기