Coding 공부/Java

[Java] final List, final 객체의 개념

CBJH 2024. 6. 11.
728x90
반응형

final List? 변경 불가능한 리스트? 🧐 스프링 부트 개발자를 위한 핵심 개념 정리

개발하다 보면 final List<UploadResultDTO> list = new ArrayList<>();처럼 final 키워드를 사용하는 코드를 자주 마주하게 됩니다. 특히, 스프링 부트 환경에서 파일 업로드 결과를 저장하는 리스트에 final을 붙이는 경우가 많죠. 그런데, final 리스트는 정말 변경이 불가능할까요? 🤔

핵심 개념: final은 재할당 금지, 내부 수정 허용

final 키워드의 핵심은 "재할당 금지"입니다. 즉, 한 번 생성된 리스트 객체 자체를 다른 객체로 바꿀 수는 없습니다. 하지만 리스트의 내부 요소를 추가하거나 삭제하는 것은 얼마든지 가능합니다.

 
final List<String> list = new ArrayList<>();
list = new LinkedList<>(); // ❌ 불가능 (재할당)
list.add("Spring"); // ✅ 가능 (내부 수정)
 

final List, 왜 사용할까? 🤔

  1. 불변성 보장: 의도치 않은 재할당을 막아 코드 안정성을 높입니다. 여러 스레드가 동시에 리스트에 접근하는 상황에서 특히 중요합니다.
  2. 코드 가독성 향상: final 키워드는 "이 리스트는 변경되지 않을 것이다"라는 의도를 명확하게 드러냅니다. 코드를 읽는 다른 개발자에게 유용한 정보를 제공하죠.
  3. (약간의) 성능 최적화: 컴파일러가 final 변수를 최적화할 가능성이 있습니다. 하지만 성능 개선 효과는 미미하므로 큰 기대는 하지 마세요. 😅

스프링 부트 파일 업로드와 final List 활용 예시 📂

 
final List<UploadResultDTO> uploadResults = new ArrayList<>();

// ... 파일 업로드 처리 ...

uploadResults.add(new UploadResultDTO(filename, fileSize, uploadTime)); // 결과 추가

// ... 이후 uploadResults는 변경되지 않음 ...
 

위 코드에서 uploadResults는 파일 업로드 결과를 저장하는 리스트입니다. final 키워드 덕분에 업로드 결과가 안전하게 보호되고, 실수로 리스트 자체가 변경되는 일을 방지할 수 있습니다.

결론: final List는 안전하고 가독성 좋은 코드를 위한 선택 🔒

final 키워드를 리스트에 사용하는 것은 재할당을 막아 코드 안정성을 높이고, 가독성을 향상시키는 효과적인 방법입니다. 특히 스프링 부트 환경에서 파일 업로드 결과를 저장하는 리스트처럼 중요한 데이터를 다룰 때 더욱 빛을 발합니다.

 

 

그럼 final String s = "abc"; s="xyz"; s=new String("xyz"); 이건 될까 ?

 

아니요, final String s = "abc"; 이후에 s = "xyz";s = new String("xyz");는 모두 불가능합니다.

 

이유:

  • final 키워드: final 키워드는 변수에 재할당을 금지합니다. 즉, 한 번 값이 할당된 final 변수는 다른 값으로 변경할 수 없습니다.
  • String 특징: 문자열(String)은 Java에서 특별한 취급을 받는 불변(immutable) 객체입니다. 한 번 생성된 문자열은 그 내용을 변경할 수 없고, 새로운 문자열을 생성해야 합니다.

예시:

 
final String s = "abc"; // s는 "abc"를 가리키는 String 객체를 참조
s = "xyz"; // ❌ 불가능 (재할당 시도)
s = new String("xyz"); // ❌ 불가능 (재할당 시도)
 

위 코드에서 s = "xyz"s가 새로운 문자열 리터럴 "xyz"를 가리키도록 재할당하려는 시도이므로 컴파일 에러가 발생합니다. 마찬가지로, s = new String("xyz")도 새로운 문자열 객체를 생성하고 s가 이를 참조하도록 재할당하려는 시도이므로 컴파일 에러가 발생합니다.

참고:

  • 만약 문자열의 내용을 변경하고 싶다면, StringBuilder 또는 StringBuffer 클래스를 사용해야 합니다. 이들은 가변(mutable) 문자열 객체를 다루기 위한 클래스입니다.

댓글