상수(constant)란 값이 고정되어 있고 프로그램 전체에서 단 하나의 복사본만 존재하는 변수를 말합니다. 상수 변수를 선언하고 값을 할당한 후에는 프로그램이 실행되는 동안 그 값을 다시 변경할 수 없습니다.
다른 언어와 달리 자바는 상수를 직접적으로 지원하지 않습니다. 하지만 변수를 static과 final로 함께 선언하면 상수처럼 활용할 수 있습니다.
static과 final의 역할
static – 변수를 static으로 선언하면 컴파일 시점에 메모리에 로드되며, 프로그램 전체에서 단 하나의 복사본만 존재하게 됩니다.
final – 변수를 final로 선언하면 한 번 값을 할당한 이후에는 더 이상 그 값을 수정할 수 없습니다.
따라서 인스턴스 변수를 static과 final로 함께 선언하면 자바에서도 정의에 맞는 상수를 만들 수 있습니다.
예제 코드
class Data {
static final int INTEGER_CONSTANT = 20;
}
public class ConstantsExample {
public static void main(String args[]) {
System.out.println("INTEGER_CONSTANT 값: " + Data.INTEGER_CONSTANT);
}
}실행 결과
INTEGER_CONSTANT 값: 20
static 없이 final만 사용하면 어떻게 될까?
static 키워드 없이 final 변수만 선언하면 값은 변경할 수 없지만, 새 객체를 생성할 때마다 해당 변수의 별도 복사본이 만들어진다는 점에 주의해야 합니다.
예제 코드
class Data {
final int integerConstant = 20;
}
public class ConstantExample {
public static void main(String args[]) {
Data obj1 = new Data();
System.out.println("integerConstant 값: " + obj1.integerConstant);
Data obj2 = new Data();
System.out.println("integerConstant 값: " + obj2.integerConstant);
}
}실행 결과
integerConstant 값: 20
integerConstant 값: 20
위 예제에서는 final 변수를 선언한 뒤 두 개의 서로 다른 객체를 통해 값을 출력했습니다. 두 경우 모두 출력된 값은 같지만, 각기 다른 객체를 사용했기 때문에 실제 변수의 복사본을 참조하는 셈입니다.
상수의 정의에 따르면 변수는 프로그램(클래스) 전체에서 단 하나의 복사본만 가져야 합니다.
따라서 정의에 부합하는 진정한 의미의 상수를 만들려면 반드시 static과 final을 함께 사용해야 합니다.