Final 키워드가 붙으면 더이상 값을 변경할 수 없다.
public class FinalLocalMain {
public static void main(String[] args) {
final int data = 10;
//data=20; 컴파일 오류
}
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;
final int value =10;
}
final 필드를 필드에서 초기화하면 이미 값이 생성되었으므로 생성자를 통해서도 초기화 할 수 없다.
public class FinalFieldMain {
public static void main(String[] args) {
System.out.println("생성자 초기화");
ConstructInit constructInit1 = new ConstructInit(10);
ConstructInit constructInit2 = new ConstructInit(20);
System.out.println(constructInit1.value);
System.out.println(constructInit2.value);
System.out.println("필드 초기화");
FieldInit fieldInit1 = new FieldInit();
FieldInit fieldInit2 = new FieldInit();
FieldInit fieldInit3 = new FieldInit();
System.out.println(fieldInit1.value);
System.out.println(fieldInit2.value);
System.out.println(fieldInit3.value);
System.out.println("상수");
System.out.println(FieldInit.CONST_VALUE);
}
}
생성자 초기화를 하면 value값이 10,20으로 할당이가능하다. 물론 변경은 불가능하지만 원하는 값을 넣어서 초기화 가능하다.
그러나 필드 초기화에서 보면, 객체를 3개를 생성하더라도 이미 필드에서 초기화를 끝냈기 때문에 10이 어느 객체에서나 동일하다.
어느 객체를 생성하던지, 필드의 코드에 해당 값이 정해져 있으므로 모든 인스턴스가 같은값 10을 사용한다. => 메모리 낭비
고로 static을 사용하여서 동일한 값일 경우에는 공유를 하는것이 더 효율 적이다.
이런 이유로 필드에 final + 필드 초기화 하는 경우 static을 붙여서 사용하는것이 효과적이다.
상수는 변하지 않고 일정한 값을 가지는 수를 말한다.
static final키워드를 사용한다.
중앙에서 관리하고 여러군데에서 공용으로 사용하는 경우 static final을 사용한다.
일반적으로 전체 대문자 구분은 _로 하는것이 관례이다.
필드를 직접 접근해서 사용한다.
MagicNumber가 해결된다. -> 단순히 숫자로 적어놓으면 뭔지 감이 안잡힐때 static final로 문자로 의미를 이해
public class Constant {
static final int MAX_USERS = 1000;
}
public class ConstMain1 {
public static void main(String[] args) {
System.out.println("프로그램 최대 참여자 수 "+1000);
int currentUserconst = 999;
process(currentUserconst++);
process(currentUserconst++);
process(currentUserconst++);
}
private static void process(int i) {
System.out.println("참여자 수 "+i);
if(i>Constant.MAX_USERS){
System.out.println("대기자로 등록합니다.");
}else{
System.out.println("게임에 참가합니다.");
}
}
}
만약 process의 if문에서 단순히 i>1000으로 작성했으면 의미가 한번에 와닫지 않을수 있다.
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 = 20;
}
}
참조형 변수 data에 final이 붙었다. 변수 선언 시점에 참조값을 할당하였으므로, 참조값을 변경할수는 없다.
다만, 참조 대상의 객체의 필드값은 변경이 가능하다.
x002로 새로운 인스턴스를 참조하지 못함