Rootable의 개발일기
final 키워드 본문
📌 final 변수
final 키워드가 붙은 변수는 초기화 후 변경할 수 없다.
final int a = 10;
a = 50; //compile error
📌 final arguments (인자)
인자를 선언할 때 final 키워드를 붙일 수 있다. final로 선언된 인자는 메서드 내에서 변경할 수 없고, 읽기만 가능하다.
public void method(final String arg) {
System.out.println(arg);
//arg = "not changing"; compile error
}
📌 final class
클래스에 final을 붙이면 다른 클래스가 상속할 수 없는 클래스가 된다.
final class A {
...
}
class B extends A { //compile error
}
📌 final method
final이 붙은 메서드는 Override를 할 수 없다.
class A {
final int method() {
return 10;
}
}
class B extends A {
@Override
int method() { //compile error
...
}
}
📌 final collection
final이 붙은 컬렉션의 경우, 선언은 됐지만 변경될 수 있다. 하지만 새롭게 다른 참조값을 지정할 수는 없다. 즉 불변 상태가 아닌 것이다.
final List<String> list = new ArrayList();
list.add("sccess"); //기능 동작
list = new ArrayList(); //compile error
만약 해당 컬렉션을 불변으로 만들고 싶다면 unmodifiable을 사용하면 된다.
final List<String> list = Collections.unmodifiableList(Arrays.asList(100, 200, 300));
list.add("failed"); //Exception 발생
📌 Effective final
Java 8에서 추가된 기능으로 final이 붙지 않은 변수의 값이 변경되지 않았다면 컴파일러가 그 변수를 final로 취급하는 것을 말한다.
int num = 10;
Runnable runnable = new Runnable() {
@Override
publid void run() {
System.out.println("number : " + num);
}
};
runnable.run();
위 코드를 보면 num 변수는 선언과 동시에 할당된 값이 객체가 소멸될 때까지 변경되지 않았다. 그래서 num은 Effectively final이다.
그래서 Runnable에서는 final 상수밖에 사용하지 못하지만, num 변수를 사용할 수 있다. 이것은 Java 8부터 추가된 Effective final로 취급했기 때문이다.
반면, 아래 코드처럼 num 변수에 변경이 발생한다면, 더는 Effective final로 보지 않고 컴파일 에러가 발생한다.
int num = 10;
Runnable runnable = new Runnable() {
@Override
publid void run() {
num++;
System.out.println("number : " + num); //compile error
}
};
runnable.run();
Reference:
https://codechacha.com/ko/java-effectively-final-vs-final/
https://codechacha.com/ko/java-final-keyword/
'Java' 카테고리의 다른 글
래퍼 클래스(Wrapper Class) (0) | 2023.09.13 |
---|---|
추상 클래스와 인터페이스 (0) | 2023.09.13 |
try-with-resources (0) | 2023.09.13 |
자바 리플렉션 API (0) | 2023.09.12 |
자바언어의 특징 (0) | 2023.09.09 |