[코드리뷰 스터디 - 🚗 자동차 경주] 매직 넘버 (Magic Number)

Hyunjoon Choi·2023년 9월 26일
0

코드리뷰 스터디

목록 보기
1/5
post-thumbnail

개요

우아한테크코스에서 백엔드로 공부 중이신 학교 선배님께 너무 감사하게도 코드리뷰를 받는 스터디에 들어갔기에, 이제부터 코드리뷰를 받으며 알게 된 개념, 키워드, 실수 등등을 기록해두려고 한다.

매직 넘버 (Magic Number)

매직 넘버 (Magic Number)의미 있는 이름의 상수로 대체될 수 있는 숫자를 뜻한다.

매직 넘버는 코드에서 제거해야 할 안티 패턴 중 하나이다.

클린 코드 (Clean Code)에는 다음과 같이 기록되어 있다. (387p)

3.141592653589793과 같은 숫자 역시 유명하기에 독자가 금방 이해한다. 하지만 그냥 숫자로 남겨두려니 오류가 발생할 가능성이 너무 크다. 독자가 3.141592753589793이라는 숫자를 볼 때 마다 π라 간주하고 면밀히 살펴보지 않는다. (숫자 하나가 다르다는 사실을 눈치챘는가?) 게다가 3.14, 3.14159, 3.142 등과 같은 근사값을 사용하면 오차가 발생한다. 다행스럽게 Math.PI가 정의되어 있으므로 Math.PI를 사용하면 된다.
‘매직 숫자’라는 용어는 단지 숫자만 의미하지 않는다. 의미가 분명하지 않은 토큰을 모두 가리킨다.

실제 예시

코드리뷰를 진행하며 작성했던 예전 코드를 보면 다음과 같이 작성했었다.

public class Car {

    private final String name;
    private int distance;

    private Car(String name) {
        this.name = name;
        this.distance = 0; // 직접 0으로 할당했다.
    }
    ...
}

적용 이후

의미 있는 이름의 상수를 적용하면 (매직 넘버 제거) 다음과 같이 적용할 수 있다.

public class Car {

    private static final int START_DISTANCE = 0; // 시작 거리를 나타내도록 했다.
    private final String name;
    private int distance;

    private Car(String name) {
        this.name = name;
        this.distance = START_DISTANCE;
    }
    ...
}

장단점 (feat. ChatGPT)

그렇다면, 매직 넘버를 없애는 것은 장점만 있을까? 궁금한 마음에 ChatGPT에게도 답변을 물어보았다.

장점

가독성 향상

매직 넘버를 상수로 정의하면 코드의 가독성이 향상됩니다. 코드를 읽는 사람들은 숫자가 아닌 의미 있는 이름을 보고 그 의미를 이해할 수 있습니다.

유지보수성 개선

매직 넘버를 사용한 모든 부분을 변경해야 할 경우, 상수로 정의된 값을 한 곳에서만 수정하면 됩니다. 이로써 유지보수가 훨씬 용이해집니다.

버그 예방

상수를 사용하면 잘못된 값 또는 상수를 잘못 수정하는 등의 실수를 방지할 수 있습니다. 이로써 버그가 줄어들고 코드의 신뢰성이 향상됩니다.

코드 재사용

매직 넘버를 상수로 정의하면 같은 값을 여러 번 사용할 수 있으므로 코드 재사용성이 증가합니다.

협업 용이성

여러 개발자가 협업하는 프로젝트에서 상수를 사용하면 개발자 간의 의사 소통이 더 원활해지고 표준화된 규칙을 적용하기가 쉬워집니다.

단점

추가 오버헤드

매직 넘버를 상수로 정의하는데 추가적인 시간과 노력이 필요할 수 있습니다. 매우 작은 프로젝트나 빠른 프로토타이핑 작업에서는 이러한 오버헤드가 미미할 수 있습니다.

중복성

상수를 정의할 때 중복된 값이나 비슷한 값을 여러 개 만들 수 있으므로, 상수의 관리와 네이밍 규칙을 잘 정의해야 합니다.

오버사용

상수화를 과도하게 사용하면 코드가 더 복잡해질 수 있습니다. 모든 값을 상수로 정의할 필요는 없으며, 가독성을 해치지 않는 선에서 적절하게 사용해야 합니다.

결론

매직 넘버를 없애는 것은 숫자, 문자를 의미 있는 상수로 변경함으로써 버그의 발생률을 낮추고, 가독성을 향상시키며, 개발자들 간의 협업 능력을 증진시키는 데 있음을 알았다. 다만, 지나치게 상수화를 한다면 그에 따른 문제점 (상수 정의의 비용, 매번 각 상수가 어떤 값인지 파악 등)들도 있기에 적절히 상수화를 해야겠다고 깨닫게 되었다. 뭐든지 과한 것은 좋지 않다!

부족하거나 보완할 점이 있다면 댓글 부탁드립니다 😃

profile
개발을 좋아하는 워커홀릭

0개의 댓글