용로그
article thumbnail
Published 2023. 2. 27. 15:46
[Java] 매직 넘버 잘 처리하기 Java

매직 넘버 줄이기


프로그래밍에서 상수(static final)로 선언하지 않은 수나 문자열을 매직 넘버 또는 매직 리터럴이라고 한다. 단지 상수로 선언하지 않았다고 해서 매직 넘버나 매직 리터럴이 되는 것은 아니다.

 

게임으로 예를 들어보자 아래는 게임 플레이어의 체력을 감소시키는 메서드다. 근데 30과 100이 무엇을 뜻하는지 알 수 있겠는가?

 

public void decreaseStrength() {
	this.health -= 30 * 100;
}

 

잘 모르겠다면 아래의 메서드를 다시 보자. 훨씬 직관적이고 읽기 쉬운 코드가 되지 않았는가? 최소한 30과 100이 무엇을 뜻하는지 알 수 있게 되었다.

 

30과 100이 뭘 뜻하는지 안다면 플레이어의 체력을 감소시키는 메서드가 어떤 공식으로 계산되어 적용되는지도 곧장 파악할 수 있다는 것이다.

private static final int MONSTER_LEVEL = 30;
private static final int MONSTER_OFFENSIVE_POWER = 100;

public void decreaseStrength() {
	this.health -= MONSTER_LEVEL * MONSTER_OFFENSIVE_POWER;
}

 

이렇게 코드에서 매직넘버만 제거해주었을 뿐인데 클래스와 코드의 흐름을 이해하게 되는 시간과 노력이 확실히 줄어들었다는게 체감될 정도다. 

 

의미없는 상수 변환


아래 예시는 상수를 잘못 사용한 예시이다.

private static final String COMMA = ",";

private void splitComma(String playersName) {
	Arrays.asList(playersName.split(COMMA));
}

 

이 메서드는 입력 받은 Players의 이름들을 입력받아서 ,(쉼표)단위로 분할하는 메서드다. 하지만 쉼표라는 문자가 다른 사람이 봤을 때 이해할 수 없는 리터럴일까?

 

그건 아니다. 위 코드는 누가 봐도 playersName을 ,(쉼표)단위로 분할해준다. 이 ,(쉼표)를 COMMA와 같은 식으로 매직넘버를 상쇄하는 것은 의미없는 상수를 추가하는 것과 같다.

 

차라리 다른 사람이 ,(쉼표)를 보았을 때 무엇을 뜻하는지 알려주고 싶다면 PLAYERS_NAME_DELIMITER과 같은 네이밍이 더 적절할 수 있다.

 

예외 메세지


이것은 내가 매직 넘버에 대해서 다시 생각하게된 리뷰다.

 

 

아래 상수에 관해서 받은 피드백이었는데 지금 생각해보면 매직 넘버의 의미를 너무 단순하게 생각했던것이 아닐까?라는 생각도 든다. 

 

private static final String VALIDATE_LADDER_HEIGHT_MESSAGE = "사다리의 최소 높이는 1이상이어야 합니다.";

 

1이라는 숫자를 매직넘버로 간주한 것이 아닌 "사다리의 최소 높이는 1이상이어야 합니다."라는 문구 자체를 매직넘버로 보고 이 짓을 저질러 버린 것이다.

 

무작정 상수화시키겠답시고 저렇게 빼버린 내 잘못이다.. 그럼 위 예외 처리 메세지는 어떻게 처리하는 것이 좋을까? 지금 나로썬 가장 괜찮다고  생각하는 방법은 아래와 같다.

 

private static final int MINIMUM_LADDER_HEIGHT = 1;
private static final String VALIDATE_LADDER_HEIGHT_MESSAGE = "사다리의 최소 높이는 " + MINIMUM_LADDER_HEIGHT + " 이상이어야 합니다.";

 

1이라는 매직 넘버를 MINIMUM_LADDER_HEIGHT라는 상수로 주어서 사다리의 최소 높이라는 의미를 부여하고 예외 메세지는 따로 빼서 MINIMUM_LADDER_HEIGHT와 조합한 것이다.

 

이렇게하면 코드에서 하드 코딩 된 숫자와 문자열이 모두 사라지고 가독성 또한 증가되었다. 그리고 1이라는 매직넘버에 대해서 따로 처리할 수 있게 되었다.

profile

용로그

@용로그

벨덩보단 용덩 github.com/wonyongChoi05