본문 바로가기

Effective Java 3rd/Chapter 4. 클래스와 인터페이스

Item 17. 변경 가능성을 최소화하라 (불변(immutable) 객체)

반응형

정의

객체 생성 이후에는 객체의 상태가 바뀌지 않는 객체

장점

  • 이해하기 쉽고 안정적인 서비스 개발에 도움이 된다.
  • immutable 객체는 map, set, cache에 쓰기에 적절하다.
  • (일반적으로) thread-safe 하다.
    • race condition 없이 여러 스레드에서 공유해서 사용할 수 있다.
  • 불변 객체를 필드로 쓰면 방어적 복사를 할 필요가 없다.
  • String 은 java의 대표적인 불변 객체

사용 방식

public final class Test {
	private final int parameter1;
	private final RGB rgb;
    
    public Test(String paramter1, RGB rgb) {
    	this.parameter1 = parameter1;
    	this.rgb = new RGB(rgb.r, rgb.g, rgb.b);
    }
    
    public String getParameter1() {
    	return parameter1;
    }

    public String getRGB() {
    	return new RGB(rgb.r, rgb.g, rgb.b);
    }
}
  • private final 키워드 사용
  • setter 제거
    • 값이 바뀌는 걸 막기
  • 자녀 클래스의 메서드 override 금지 -> 클래스 상속 금지
    • final class 적용
  • mutable 객체의 레퍼런스를 공유해서 사용하지 말 것, 이를 위해 방어적 복사를 활용
  • 필드가 List 일 경우
    • immutable한 값인 경우, 얕은 복사로 new ArrayList<>(); 를 사용
    • mutable한 값인 경우, 값 전체를 새로운 new 객체로 만들어 다시 새로 만들어야 함

 

참조: https://www.youtube.com/watch?v=EOGOJdBy2Rg

반응형