_

Always be tactful

프로그래밍/배웠어, 자바

[Java] static final / 매직 넘버와 상수

funczun 2025. 1. 21. 01:21
매직 넘버

 프로그래밍에서 매직 넘버란 코드에서 의미를 명확히 알 수 없는 숫자 값을 말한다. 특정 숫자가 변수 없이 바로 사용되어 이 숫자가 어떤 의미를 가지는지 알기 어려운 경우 매직 넘버라고 부르는 것이다. 매직 넘버는 가독성을 저하시킬 뿐 아니라, 유지보수 측면에서도 매우 비효율적이므로 지양하는 것이 좋다. 그래서 이번에는 매직 넘버 문제를 해결하는 상수에 대해 포스팅하도록 하겠다.


상수 관례
public class Constant {
    // 수학 상수
    public static final double PI = 3.14159265358979323846;
    public static final double EPS = 1e-6;

    // 시간 상수
    public static final int HOURS_PER_DAY = 24;
    public static final int MINUTES_PER_HOUR = 60;
    public static final int SECONDS_PER_MINUTE = 60;

    // 애플리케이션 설정 상수
    public static final int MAX_USERS = 1000;
}

 

 1. 상수는 static final을 붙인다. (중복을 허용하지 않고 변하지 않는 값)

 2. 상수 이름은 모두 대문자로 표기한다. (낙타 표기법 대신 _ 사용)

 3. 상수는 보통 애플리케이션 전반에서 사용되기 때문에 public을 주로 사용한다.

 

 ▶ 이러한 상수는 중앙에서 값을 하나로 관리할 수 있다는 장점을 가진다.


상수 활용 예제
public class ConstantMain {
    public static void main(String[] args) {
        System.out.println("프로그램 최대 참여자 수 " + Constant.MAX_USERS);
        int currentUserCount = 999;
        process(++currentUserCount);
        process(++currentUserCount);
        process(++currentUserCount);
    }

    private static void process(int currentUserCount) {
        System.out.println("참여자 수: " + currentUserCount);
        if (currentUserCount > Constant.MAX_USERS) {
            System.out.println("대기자로 등록합니다.");
        } else {
            System.out.println("참여되었습니다.");
        }
    }
}

 

 ▶ 숫자 값 1000이 아닌 MAX_USERS를 사용하므로써, 매직 넘버 문제를 해결했고 유지보수 또한 쉽다.


final 이해 점검하기
public class Data {
    public int value;
}

 

 대충 위와 같은 Data 클래스가 있다고 치자. final을 제대로 이해하기 위해 일부러 참조형을 가져왔다.

public class FinalTestMain {
    public static void main(String[] args) {
        final Data data = new Data();
        data = new Data();
    }
}

 

 Data 클래스 data 객체에 final을 붙였다. 이 객체에 새로운 참조 값을 대입할 수 있을까?

 

 ▶ 당연히 불가능하다. (컴파일 에러 발생)

 

 그렇다면 참조 대상의 값을 변경하면 어떨까?

public class FinalTestMain {
    public static void main(String[] args) {
        final Data data = new Data(); // 참조 대상을 바꿀 수 없음

        data.value = 10;
        System.out.println(data.value);
        data.value = 20;
        System.out.println(data.value);
    }
}

 

 ▶ 가능하다.

 

 Data는 클래스이기 때문에 참조형이다. 참조형은 참조 값을 저장한다. 지금 final로 인해 바꿀 수 없는 건 '참조 값'이지, 참조 대상의 값이 아니다. 따라서 위 코드는 정상적으로 작동한다.

728x90