언어/JAVA

[JAVA] 상수의 여러 관리법

steadyMan 2022. 12. 11. 00:56

조건을 걸거나 반복문을 제어할 때 등 특정 문자, 숫자 등을 직접 입력(하드코딩)해서 사용하게 되는데

해당 값이 어떤 이유로 정해진건지 처음 접하는 사람은 알 수 없고,  여러 코드에서 사용할 경우 유지보수성도 떨어집니다.

 

만약 이를 의미있는 이름의 변수에 할당하고 변경하지 못하는 상수화 하여 사용하면 코드를 이해하는데 더욱 도움이 되고,

유지보수성이 증가될것입니다. 그리하여! 상수를 관리하는 여러 방법들을 찾아본 결과를 작성해보려 합니다. 


상수란? 


상수란 변하지 않는 수를 말합니다. 자바에서는 변하지 않는 고정된 값을 담는 변수를 의미하고 상수를 선언할 때

final 예약어를 붙여서 명시합니다. 

public class Constant {
	public final int CAR_GOING_MIN_NUMBER = 4;
}

상수 관리 방법


1. 클래스 상수 

클래스 안에 사용할 상수 필드를 선언하여 사용하는 방식 필드에 static을 붙여 접근성을 높인다. 

주의점은 private 생성자를 선언하여 인스턴스화를 방지하여 사용자에게 명확하게 클래스의 역할을 전달한다. 

public class Constant { 

    private Constant() {

    };

    public static final String RACING_RESULT_ANNOUNCEMENT = "실행결과";	

    public static final int CAR_GOING_MIN_NUMBER = 4;
    public static final int CAR_NAME_MAX_LENGTH = 5;			
    public static final String CARNAME_SPLIT_BORDER = ",";
    public static final String CAR_POSITION_INDEX = "-";	
}

class에 final 키워드를 붙여서 상속을 방지할 수 있지만 private 생성자를 선언하면 어차피 상속받아도 사용하지 못한다. 

2. 인터페이스 상수 

인터페이스 내에 상수를 선언하여 사용하는 방식 인터페이스내에 선언된 변수는 public static final이 붙기 때문에

생략할 수 있다.

문제는 상속을 막을 방법이 없고 물론 상속을 해서 사용해도 무관하지만 그럴 경우 같은 이름의 변수를 선언해서 사용한다면 값이 변경된다는 문제가 있다. 

public interface ConstatntInterface {

    String RACING_RESULT_ANNOUNCEMENT = "실행결과";

    int CAR_GOING_MIN_NUMBER = 4;
    int CAR_NAME_MAX_LENGTH = 5;

    String CARNAME_SPLIT_BORDER = ",";
    String CAR_POSITION_INDEX = "-";
}

//사용 예시 
import study.raceGame.ConstatntInterface;
public class Main {
    public static void main(String[] args) {        
        System.out.println(ConstatntInterface.RACING_RESULT_ANNOUNCEMENT);
    }
}

// 상속 후 같은 이름의 변수 선언 가능성 
import study.raceGame.ConstatntInterface;
public class Main implements ConstatntInterface{
    public static void main(String[] args) {
        String RACING_RESULT_ANNOUNCEMENT = "여기서 할당한 값을 변경된다.";
        System.out.println(RACING_RESULT_ANNOUNCEMENT);
    }
}

3. Enum 클래스 

Enum 클래스의 경우 따로 정리하고 싶고, 이걸 상수라고 할 수 없다는 생각이지만 변하지 않는 값을 사용할 수 있다는 공통점에 명시하겠습니다.

enum Expression {
    PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/");

    private String expression;

    Expression(String expression) {
        this.expression = expression;
    }
}