불변은 변하지 않는 뜻을 가지고 있다. Immutable Class는 객체를 만들게 되면 상태값을 변경할 수 없는 클래스이다.
클래스 시그너쳐에 final 키워드를 사용하여 다른 클래스에서 상속받지 못하게 하여 하위 클래스에서 메서드 오버라이딩이 안되게 막고 필드도 final 키워드로 선언하여 객체 생성하여 인스턴스화 -> 초기값 세팅이 되면 더 이상 수정할 수 없게된다.
String 클래스 역시 불변 객체로 한 번 할당된 문자열은 변경할 수 없다. 하지만 같은 문자열을 literal 형식으로 생성하면 String Constant Pool(Fly Weight Pool)에 담겨 같은 곳을 참조해 메모리 낭비를 줄이는 방식을 사용한다.
public class StringTest {
public static void main(String[] args) {
// 새로운 인스턴스 생성
String str = new String("홍길동");
String str2 = new String("홍길동");
// 결과 false 참조하는 해시코드 다름
System.out.println(str == str2);
System.out.println(System.identityHashCode(str));
System.out.println(System.identityHashCode(str2));
// 같은 곳을 참조하는 인스턴스
String str3 = "홍길동";
String str4 = "홍길동";
// 결과 true 참조하는 해시코드 같음
System.out.println(str3 == str4);
System.out.println(System.identityHashCode(str3));
System.out.println(System.identityHashCode(str4));
}
}
Mutable Class
인스턴스 생성 이후 상태변경이 가능한 클래스를 가변 클래스라고 한다. StringBuffer와 StringBuilder는 가변클래스로 초기 문자열 세팅 이후로도 메서드를 통해 문자열 변경시 같은 인스턴스를 참조한다.
'Effective Java > 키워드' 카테고리의 다른 글
직렬화 역직렬화 (Siriallizable Desirializable) (0) | 2023.01.04 |
---|---|
공변 반환 타입 (Covariant Return Type) (0) | 2023.01.04 |
열거 타입 (Enum) (0) | 2023.01.04 |
싱글턴 (Singleton) (0) | 2023.01.04 |
정적 팩터리 메서드 (Static Factory Method) (0) | 2023.01.04 |