[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개의 댓글

관련 채용 정보