
final은 “끝”이라는 의미 그대로, 더 이상 변경할 수 없음을 뜻한다.
public class FinalLocalMain {
public static void main(String[] args) {
final int data1;
data1 = 10; // 최초 한 번만 할당 가능
// data1 = 20; // 컴파일 오류
final int data2 = 10;
// data2 = 20; // 컴파일 오류
method(10);
}
static void method(final int parameter) {
// parameter = 20; // 컴파일 오류
}
}
final 지역 변수는 최초 한 번만 값을 할당할 수 있다.final을 붙이면 메서드 내부에서 값 변경이 불가능하다.public class ConstructInit {
final int value;
public ConstructInit(int value) {
this.value = value; // 생성자를 통해 최초 한 번 초기화
}
}
public class FieldInit {
static final int CONST_VALUE = 10; // static final
final int value = 10; // 인스턴스별 고정 값
}
static final : 클래스 차원에서 단 하나만 존재하며 변경 불가능하다.변하지 않고, 프로그램 전체에서 공유되는 고정된 값을 상수라 한다.
자바에서는 static final 키워드로 정의한다.
public class Constant {
public static final double PI = 3.14;
public static final int HOURS_IN_DAY = 24;
public static final int MINUTES_IN_HOUR = 60;
public static final int SECONDS_IN_MINUTE = 60;
public static final int MAX_USERS = 1000;
}
_ 사용 (MAX_USERS) 기본형과 참조형에 final을 적용했을 때 동작이 다르다.
public class Data {
public int value;
}
public class FinalRefMain {
public static void main(String[] args) {
final Data data = new Data();
// data = new Data(); // 컴파일 오류: 참조값 변경 불가
data.value = 10; // 참조 대상 내부 값은 변경 가능
data.value = 20;
}
}
final Data data : 다른 객체를 가리킬 수 없다. (참조값 변경 불가) data.value는 final이 아니므로 내부 데이터 변경은 가능하다. 고객의 id와 같이 절대 바뀌면 안 되는 값에 final을 적용한다.
public class Member {
private final String id; // 변경 불가
private String name;
public Member(String id, String name) {
this.id = id;
this.name = name;
}
public void changeData(String id, String name) {
// this.id = id; // 컴파일 오류
this.name = name;
}
public void print() {
System.out.println("id:" + id + ", name:" + name);
}
}
public class MemberMain {
public static void main(String[] args) {
Member member = new Member("myId", "kim");
member.print();
member.changeData("myId2", "seo");
member.print();
}
}
실행 결과
id:myId, name:kim
id:myId, name:seo
id는 생성자에서만 초기화 가능, 이후 변경 불가name은 자유롭게 변경 가능