final이 뭘까?final은 연상되는 뜻과 같이, 최종 진짜 찐 ㄹㅇ 최종으로 변수의 값을 더는 값을 변경할 수 없다는(불변) 뜻이다.
이후에 만약 변수의 값을 변경하면 컴파일 오류가 발생한다
final int value = 20;
// value = 19; -> value를 final로 이미 선언했으므로 변경할 수 없음.
final을 필드에서 사용하면 생성자에서 딱 한 번만 초기화할 수 있다.
public class FinalField {
final int value;
public FinalField(int value) { //생성자
this.value = value;
}
}
만약 위의 코드처럼 생성자를 이용해서 final필드를 만들었다면, main에서 각 인스턴스마다 final 필드에 각각 다른 값을 할당할 수 있다. (나중에 변경은 불가능)
public class FinalFieldMain {
public static void main(String[] args) {
//final 필드 - 생성자 초기화
System.out.println("생성자 초기화");
FinalField ff1 = new FinalField(10);
FinalField ff2 = new FinalField(20);
System.out.println(ff.value); //10 출력
System.out.println(ff.value); //20 출력
static fianl 활용하기만약 모든 곳에서 같은 값(하나의 값)을 사용하고 싶다면 어떻게 해야할까?
그냥 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;
}
이렇게 고정된 값(상수)를 사용하면, 중앙에서 값을 관리하기 때문에 편리하다.
final 변수 & 참조final 변수 는 바꿀 수 없다고 했다.
하지만 직접 변수를 참조해서 변경은 가능하다! 아래 코드로 한 번 이해해보자
public class Data {
public int value;
}
Data 클래스에 value 변수를 public으로 선언하고 활용해보자
public class DataMain {
public static void main(String[] args){
final Data data = new Data();
//data = new Data();
data.value = 20;
System.out.println(data.value);
data.value = 11;
System.out.println(data.value);
}
}
DataMain 클래스에서 data 변수를 final로 활용하고자한다.
물론 data에 직접 새로운 값을 할당하는 것은 불가능하다.
하지만, data.value처럼 직접 Data클래스를 참조해서 값을 변경하는 것은 가능하다.
(data 변수를 final로 선언했지, Data의 value는 final 변수가 아니기 때문)
참조형 "변수"에 들어있는 참조값만 변경하지 못한다. 이 변수 이외에 다른 곳에 영향을 주는 것이 아니다.
최종 진짜 찐 ㄹㅇ 최종 ㅋㅋ 직관적이네요