[Java] Immutability

민지·2024년 3월 14일
0

Java

목록 보기
7/9
post-thumbnail

오늘의 질문

커스텀 불변 클래스를 어떻게 만드나요? 그리고 JAVA에서 불변 클래스의 예는 무엇인가요?

Immutability

불변성으로, 객체가 생성된 이후에 객체 상태에 대해 변경할 수 없도록 하는 디자인 패턴.

왜?

객체는 참조형(reference type)이다.
이는 의도하지 않는 곳에서 객체가 변경될 수 있기 때문에 불변 객체로 선언한다.

Immutable Class

Java의 불변 클래스 종류

String, Integer, Character, Double 등 래퍼 클래스.

커스텀 불변 클래스 만들기

  1. final 로 필드를 선언한다.
    해당 필드의 자료형도 기본형이거나 불변 객체여야 함.
  2. 접근 할 수 있는 setter 메서드를 구현하지 않는다.

예제코드1: String으로 만든 불변 객체

public class ImmutableString {
	
	private final String name;
	
	ImmutableString(String name){
		this.name = name;
	}
	
	@Override
	public String toString(){
		return this.name;
	}

}

이렇게 name에 concat(String str) 을 해준다고 하더라도
이미 불변 객체로 지정해준 immutableString은 여전히 Hello 이다.

예제코드2: StringBuilder로 만든 불변 객체

하지만 StringBuilder와 같은 가변 클래스는 차이가 있다.
이 경우를 살펴보자.

class Solution {
    public static class ImmutableString {

        private final StringBuilder name;

        ImmutableString(StringBuilder name){
            this.name = name;
        }

        @Override
        public String toString(){
            return this.name.toString();
        }

    }
    
    public static void main(String args[]) throws Exception {
        StringBuilder name = new StringBuilder("Hello");
        ImmutableString immutableString = new ImmutableString(name);
        name.append(" World");
        System.out.println(immutableString);  //결과값: Hello World

    }
}

왜 이런 일이 발생하냐?

  • immutableString는 new를 통해 만든 새로운 인스턴스이지만 그 파라미터인 name은 가변 객체이다.
  • 따라서 이 아이가 참조하고 있는 주소값은 name을 가리키고 있는 거임.
  • name을 수정하게 되면 immutableString > name > 변경됨 에 따라서 immutableString도 변함!

그럼 어떻게 해야 가변 객체로 커스텀 불변 클래스를 만들 수 있지?

예제코드3: 생성자를 건드려라!

위의 코드에서 한 군데만 변경해주면 된다.
생성자에서 그대로 가져다 쓰는 것이 아닌 새로운 객체를 만들도록 한다.

ImmutableString(StringBuilder name){
    this.name = new StringBuilder(name);
}

전체코드와 결과

오늘의 대답

커스텀 불변 클래스는 두 가지의 조건으로 만들 수 있습니다.
첫번째로 final 키워드를 필드에 붙입니다.
두번재로 setter와 같은 접근 가능한 메서드를 생성하지 않습니다.
Java에서 불변 클래스로는 String, Integer, Long과 같은 Wrapper 클래스가 존재합니다.

profile
한 발 짝

0개의 댓글