Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9의 Try-with-Resources에서 사실상 final(Effectively Final) 변수란?

Try-with-Resources 문에서 사용하는 변수는 Java 8까지 반드시 try 문 내부에서 직접 선언해야 했습니다. 하지만 Java 9부터는 이러한 제한이 제거되어, final 또는 사실상 final(effectively final)인 변수를 try 블록 안에서 자유롭게 사용할 수 있게 되었습니다.

여기서 '사실상 final'이란 변수가 한 번 초기화된 이후에는 값이 변경되지 않는 경우를 의미합니다. 즉, 명시적으로 final 키워드를 붙이지 않았더라도 초기화 후 재할당되지 않는 변수라면 사실상 final로 간주되어 try-with-resources에서 사용할 수 있습니다.

예제 코드

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class EffectivelyFinalTest {
   private static File file = new File("try_resources.txt");
      public static void main(String args[]) throws IOException {
      file.createNewFile();
      BufferedReader bufferedReader = new BufferedReader(new FileReader(file));

      try(bufferedReader) {
         System.out.println("Can Use Final or Effectively Final in Try with Resources!");
      } finally {
         System.out.println("In finally block");
      }
}
}

위 예제에서 bufferedReader 변수는 try 문 밖에서 선언되었지만, 초기화 이후 값이 변경되지 않으므로 사실상 final입니다. 따라서 Java 9 환경에서는 별도의 선언 없이 try 괄호 안에 그대로 넣어 자원을 관리할 수 있습니다.

실행 결과

Can Use Final or Effectively Final in Try with Resources!
In finally block

이 기능의 장점

이 개선 사항은 다음과 같은 이점을 제공합니다.

  • 코드 간결성: 이미 생성된 자원 객체를 그대로 재사용할 수 있어 불필요한 중복 선언이 줄어듭니다.
  • 유연성 향상: 조건에 따라 다른 자원을 할당한 뒤 try-with-resources로 처리하는 패턴을 쉽게 구현할 수 있습니다.
  • 자동 자원 해제: 기존과 동일하게 try 블록이 종료되면 자원이 자동으로 닫히므로 메모리 누수 위험이 감소합니다.