불변 객체
이전 포스팅에서 발생했던 문제들은 공유하면 안되는 객체를 여러 변수에서 공유함으로써 발생한 문제이다.
사이드 이펙트가 발생한 근본적인 원인을 생각해보면, 객체를 공유하는 것이 문제가 아니다. 문제의 직접적인 원인은 공유된 객체의 값을 변경한 것에 있다.
객체의 상태(내부의 값, 필드, 멤버 변수) 가 변하지 않는 객체를 불변 객체(Immutable Object)라 한다. 앞서 만들었던 Address 클래스를 상태가 변하지 않는 불변 클래스로 다시 만들어보자.
public class ImmutableAddress {
private final String value;
public ImmutableAddress(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return "ImmutableAddress{" +
"value='" + value + '\'' +
'}';
}
}
=> 내부 값이 변경되지 않도록 final로 선언한다.
이 클래스는 생성자를 통해서만 값을 변경할 수 있고, 이후에는 값을 변경하는 것이 불가능하다.
final 키워드를 넣지 않아도 setValue를 제거했기 때문에 값을 변경할 수 없으나, final을 넣는 것이 더 의미가 명확해진다.
public class RefMain2 {
public static void main(String[] args) {
//참조형 변수는 하나의 인스턴스를 공유할 수 있다.
ImmutableAddress a = new ImmutableAddress("서울");
ImmutableAddress b = a;
System.out.println("a = " + a);
System.out.println("b = " + b);
b.setValue("부산");
System.out.println("b -> 부산");
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
=> setValue가 없으므로 값을 변경할 수 없다.
불변이라는 단순한 제약을 사용해서 사이드 이펙트라는 큰 문제를 막을 수 있다.
* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.
'프로그래밍언어 > Java' 카테고리의 다른 글
[Java 중급] String 클래스 (0) | 2024.08.12 |
---|---|
[Java 중급] 불변 객체 - 값 변경 (0) | 2024.08.12 |
[Java 중급] 공유 참조와 사이드 이펙트 (0) | 2024.08.08 |
[Java 중급] 기본형과 참조형의 공유 (0) | 2024.08.08 |
[Java 중급] equals() (0) | 2024.08.08 |