Java

final 키워드

dev-rootable 2023. 9. 13. 15:42

📌 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/

 

Java의 Effectively final이란 무엇인가?

Java8에서 final이 붙지 않은 변수의 값이 변경되지 않는다면, 그 변수를 Effectively final이라고 합니다. Effectively final은 익명 클래스 내부에서 접근할 수 있습니다. 개발자의 의도를 알 수 있게 명시

codechacha.com

 

https://codechacha.com/ko/java-final-keyword/

 

Java - Final 키워드에 대한 이해

클래스, 메소드, 변수에 final을 붙이면 시간이 지나도 처음 정의된 상태가 변하지 않는 것을 보장한다는 의미입니다. static 변수에도 final을 붙일 수 있으며, final 변수를 선언할 때 바로 초기화를

codechacha.com