[Java] final에 대해서와 불변 객체인 String

코아·2024년 7월 7일

final 필드

final int number = 1; // final 리턴타입 필드명 [= 초기값];

final 필드의 초기값을 줄 수 있는 방법은 1. 필드 선언시 2. 생성자를 통해서 가 있다.

final 클래스

해당 선언이 최종 상태이고 수정될 수 없음을 뜻함 -> final이 지정되면 초기값 설정 후 더 이상 값 변경할 수 없다.
상속할 수 없는 클래스 = 부모 클래스가 될 수 없고, 자식 클래스를 만들 수 없다.

public final class 클래스명 { ... }

final 메서드

메소드를 선언할 때 final 키워드를 붙이면 이 메소드는 최종적인 메소드이므로 재정의 할 수 없는 메소드.
즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때, 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의(Overriding)할 수 없다. 자신이 만든 메소드를 변경할 수 없게끔 하고 싶을 때 사용하며, 시스템의 코어 부분에서 변경을 원치 않는 메소드에 많이 구현되어 있다.

즉, final 키워드를 사용하면 불변하며, 값이 수정될 수 없다라고 생각하면 될 것 같다.

final 클래스의 대표적인 예로는 자바 표준 API에서 제공하는 String 클래스가 있는데, 이것에 대해 간단히 정리해보겠다.

String vs StringBuffer vs StringBuilder

  • String : 불변한 문자열로 변경 작업을 할 때마다 새로운 String 객체가 생성되므로 메모리 공간과 성능 문제 발생 가능성이 있다.
  • StringBuffer : 가변 문자열로, 변경할 시 기존 객체 내부가 수정되며 문자열 작업이 빈번한 경우에 유용하며, 내부적으로 동기화되어 멀티 스레드 환경에서 유용
  • StringBuilder : StringBuffer와 마찬가지로 가변 문자열로 변경 작업 시 기존 객체 내부 수정. 하지만 내부적으로 동기화되지 않아 멀티 스레드보다 단일 스레드 환경에서 좋다.
profile
https://ldyble.tistory.com/ 에서 블로그 이전하였습니다.

0개의 댓글