자바에서 **상수(Constant)**는 값이 변하지 않는 변수를 의미하며, 선언 시 지정된 값을 프로그램 실행 중에 변경할 수 없습니다. 상수는 주로 final 키워드를 사용하여 정의하며, 의미 있는 이름을 붙여 코드의 가독성, 유지보수성, 안정성을 높이는 데 기여합니다.
자바에서 상수는 다음과 같이 선언합니다:
final 데이터타입 변수명 = 값;
예시:
final int MAX_SCORE = 100;
final double PI = 3.14159;
final String GREETING = "Hello";
final 키워드는 변수의 값을 한 번만 할당할 수 있도록 만듭니다.
변수명은 대문자와 언더스코어(_)로 구성하는 것이 관례입니다.
상수는 모든 데이터 타입에 대해 사용할 수 있으며, 크게 나누면 아래와 같습니다.
타입 |
예시 |
설명 |
---|---|---|
int |
final int DAYS = 7; |
정수형 상수 |
long |
final long TIME = 1000L; |
긴 정수. 접미사 L 필요 |
float |
final float RATE = 1.5f; |
실수. 접미사 f 필요 |
double |
final double PI = 3.14; |
실수. 기본 실수형 타입 |
char |
final char GRADE = 'A'; |
문자형 상수 |
boolean |
final boolean FLAG = true; |
논리값 상수 |
참조형도 final을 사용하여 상수처럼 사용할 수 있습니다. 하지만 객체의 내용은 변경 가능합니다.
final String NAME = "JAVA"; // 불변 객체
final int[] NUMS = {1, 2, 3}; // 배열 참조는 불변, 내용은 변경 가능
final String은 불변(immutable)이라 진짜 상수처럼 사용 가능
final 배열, final 객체는 참조는 상수지만, 내부 요소는 변경 가능
기본형 타입에 대응되는 **래퍼 클래스(wrapper class)**도 상수 정의에 사용됩니다.
기본형 |
래퍼 클래스 |
예시 |
---|---|---|
int |
Integer |
final Integer MAX = Integer.valueOf(10); |
double |
Double |
final Double PI = 3.14159; |
boolean |
Boolean |
final Boolean IS_ACTIVE = Boolean.TRUE; |
Wrapper 클래스는 null을 저장할 수 있기 때문에, 객체 기반 로직에서 활용됩니다.
final double GRAVITY = 9.8;
final double LIGHT_SPEED = 299_792_458;
final int ADMIN_ROLE = 1;
final int USER_ROLE = 0;
if (role == ADMIN_ROLE) {
System.out.println("관리자 권한");
}
public class MathConstants {
public static final double PI = 3.141592;
public static final int MAX_VALUE = 1000;
}
사용:
double area = MathConstants.PI * r * r;
static final 상수는 클래스 이름으로 접근할 수 있고, 인스턴스를 생성하지 않아도 됩니다.
상수를 여러 개 정의할 때는 enum을 사용하는 것이 더 안전하고 명확할 수 있습니다.
enum Direction {
EAST, WEST, SOUTH, NORTH
}
이런 식으로 의미 있는 이름으로 상수를 묶어서 사용할 수 있으며, 타입 안정성과 가독성이 뛰어납니다.
항목 |
설명 |
---|---|
선언 방식 |
final 데이터타입 변수명 = 값; |
변수명 관례 |
대문자 + 언더스코어 (MAX_LENGTH, PI) |
사용 가능한 타입 |
기본형, 참조형, 래퍼 클래스 모두 가능 |
변경 여부 |
final로 선언된 변수는 값 재할당 불가 |
static final |
클래스 상수로서 여러 곳에서 공유 가능 |
enum |
열거형으로 그룹 상수 표현 가능 |