자바에서 상수(Constant)란?
상수 변수는 값이 고정되어 있으며 프로그램 전체에서 단 하나의 복사본만 존재하는 변수를 의미합니다. 상수 변수를 선언하고 값을 할당하면 이후 프로그램 어디에서도 그 값을 다시 변경할 수 없습니다.
C 언어와 달리 자바는 상수를 직접적으로 지원하지 않습니다. 하지만 변수를 static과 final로 함께 선언하면 상수처럼 사용할 수 있습니다.
- 변수를 static으로 선언하면 컴파일 시점에 메모리에 로드되므로 프로그램 전체에서 단 하나의 복사본만 존재하게 됩니다.
- 변수를 final로 선언하면 값을 다시 수정할 수 없습니다.
예제
class Data {
static final int integerConstant = 20;
}
public class ConstantsExample {
public static void main(String args[]) {
System.out.println("value of integerConstant: "+Data.integerConstant);
}
}실행 결과
value of integerConstant: 20
자바에서 final 변수란?
변수를 final로 선언하면 그 값을 더 이상 변경할 수 없습니다. 만약 값을 변경하려고 시도하면 컴파일 타임 오류가 발생합니다.
예제
public class FinalExample {
public static void main(String args[]) {
final int num = 200;
num = 2544;
}
}실행 결과
FinalExample.java:4: error: cannot assign a value to final variable num
num = 2544;
^
1 errorfinal 변수와 상수의 핵심 차이
final 변수와 상수(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("value of integerConstant: "+obj1.integerConstant);
Data obj2 = new Data();
System.out.println("value of integerConstant: "+obj2.integerConstant);
}
}실행 결과
value of integerConstant: 20 value of integerConstant: 20
위 예제에서는 final 변수를 하나 만들고 서로 다른 두 객체를 통해 그 값을 출력했습니다. 두 경우 모두 출력되는 값은 20으로 동일하지만, 각각 다른 객체를 사용했기 때문에 실제 변수의 복사본을 참조하는 것입니다.
상수의 정의에 따르면 변수는 프로그램(클래스) 전체에서 단 하나의 복사본만 가져야 합니다.
따라서 정의에 맞는 진정한 상수를 만들려면 반드시 static과 final을 함께 사용하여 선언해야 합니다.