꾸준한 스터디
article thumbnail

불변은 변하지 않는 뜻을 가지고 있다. Immutable Class는 객체를 만들게 되면 상태값을 변경할 수 없는 클래스이다.

클래스 시그너쳐에 final 키워드를 사용하여 다른 클래스에서 상속받지 못하게 하여 하위 클래스에서 메서드 오버라이딩이 안되게 막고 필드도 final 키워드로 선언하여 객체 생성하여 인스턴스화 -> 초기값 세팅이 되면 더 이상 수정할 수 없게된다.

 

Math 클래스 안에 PI 값이 변경된다면? Math 클래스 안에 최대값, 최소값, 반올림 등 메서드들이 상속받은 곳에서 오버라이딩 하여 로직이 변경된다면?

 

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는  가변클래스로 초기 문자열 세팅 이후로도 메서드를 통해 문자열 변경시 같은 인스턴스를 참조한다.

profile

꾸준한 스터디

@StudyRecord

포스팅이 유익하셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!