한 번 값을 지정하면 변경할 수 없는 변수
선언 시 final 키워드를 사용
상수는 일반적으로 대문자로 표기하고, 단어 사이는 밑줄(_)로 구분합니다
final int MAX_USERS = 100;
final String COMPANY_NAME = "OpenAI";
상수도 결국 변수이므로, 모든 데이터 타입이 상수로 사용 가능합니다. 다만, 용도에 따라 자주 사용되는 데이터 타입이 있습니다.
타입 |
설명 |
예시 |
---|---|---|
int |
정수형 상수, 개수나 ID 값 등 |
final int MAX_COUNT = 50; |
long |
큰 범위의 정수 상수 |
final long LIMIT = 1_000_000L; |
float |
소수점 숫자 상수 (접미사 f 필수) |
final float PI = 3.14f; |
double |
정밀한 실수 상수 (기본 실수 타입) |
final double RATE = 0.05; |
char |
문자 상수 |
final char GRADE = 'A'; |
boolean |
논리형 상수 (참/거짓) |
final boolean DEBUG = true; |
byte, short |
특수한 목적에 사용되는 작은 정수 타입 |
final byte FLAG = 0x01; |
타입 |
설명 |
예시 |
---|---|---|
String |
문자열 상수 |
final String APP_NAME = "MyApp"; |
배열 |
변하지 않는 배열 참조 (내용은 변경 가능) |
final int[] SCORES = {90, 80, 70}; |
클래스 |
변하지 않는 객체 참조 (내용은 변경 가능) |
final User user = new User(); |
참고: 참조형 상수는 참조(주소)는 변경 불가하지만, 그 객체의 내부 상태는 변경 가능합니다. 이를 **불변 객체(immutable object)**로 만들고 싶다면, 클래스 자체가 불변성(immutability)을 갖도록 설계해야 합니다.
final 변수는 한 번만 초기화할 수 있음
선언과 동시에 초기화하거나, 생성자에서 초기화 가능
final int A = 10; // 선언과 동시에 초기화
final int B;
B = 20; // 나중에 초기화 (한 번만 가능)
클래스 멤버 변수로 선언된 final은 반드시 생성자에서 초기화하거나, 선언 시 초기화해야 합니다.
클래스 전체에서 공유할 상수는 static final로 선언합니다. 이것이 일반적으로 말하는 “자바 상수”입니다.
public class Config {
public static final int TIMEOUT = 30;
public static final String URL = "https://example.com";
}
클래스 이름으로 접근 가능: Config.TIMEOUT
메모리에 한 번만 로딩됨 (정적 변수)
여러 개의 연관된 상수들을 선언할 때는 enum을 사용하는 것이 더 적절합니다.
public enum Day {
MONDAY, TUESDAY, WEDNESDAY
}
enum도 클래스이며 내부적으로 final static 상수처럼 동작합니다.
final을 붙여도 참조형 객체 내부 값은 변경 가능하므로, 불변 객체 사용 또는 방어적 복사(defensive copy) 고려
상수 값은 의미 있는 이름으로 선언하여 매직 넘버(Magic Number) 제거
여러 곳에서 사용되는 상수는 public static final로 선언하여 재사용성 증가
항목 |
설명 |
---|---|
키워드 |
final, static final |
사용 가능한 타입 |
모든 기본형과 참조형 |
자주 사용되는 타입 |
int, double, String, boolean |
상수 표기법 |
대문자 + 언더스코어 (MAX_SIZE) |
선언 위치 |
지역 변수, 클래스 멤버, 인터페이스 등 |
상수 집합 관리 |
enum으로 처리 가능 |