![[Java, 자바] 불변 객체에 대하여](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6hzRg%2FbtsIeHYEbQ8%2FqUkn8KmpkkTPSlcicbwPM0%2Fimg.jpg)
클래스를 불변으로 설계하는 이유
자바에서 클래스를 불변으로 설계하는 이유는 캐시의 안정성, 멀티 쓰레드의 안정성, 엔티티의 값 타입 등 다양한 이유에서 클래스를 불편으로 설계하고 있습니다. 하지만 모든 클래스를 불변으로 만드는 것은 아닙니다.
대부분 의 클래스는 값을 변경할 수 있게 만들어지는 가변 클래스가 일반 적이고, 불변 클래스는 값을 변경하면 안되는 특별한 경우에 만들어서 사용한다고 생각하시면 됩니다 !
캐시, 멀티 쓰레드 등에 대해 해당 글에서 깊이 설명하지 않지만 앞으로의 포스팅을 통해 하나하나 알아가보겠습니다 :)
기본형과 참조형의 공유
먼저 자바의 데이터 타입을 가장 크게 기본형(Primitive Type)과 참조형(Reference Type)으로 나눌 수 있습니다.
- 기본형 : 하나의 값을 여러 변수에서 절대로 공유하지 않는다.
- 참조형 : 하나의 객체를 참조값을 통해 여러 변수에서 공유할 수 있다.
기본형과 참조형에 대해 간단하게 알아보고 가겠습니다 !
기본형
int a = 10;
int b = a;
b = 20;
위와 같이 코드를 작성했을 때 a는 10, b는 20이라는 값을 갖게됩니다 !
기본형 변수 a와 b는 절대로 하나의 값을 공유하지 않습니다. 따라서 값을 변경해도 변수 하나의 값만 변경되게 됩니다 !
참조형
public class Address {
private String value;
public Address(String value) {
this.value = value;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
//////////
Address a = new Address("서울");
Address b = a;
b.setValue("부산");
위와 같이 코드를 작성했을 때 a는 부산, b도 부산 이라는 값을 갖게됩니다.
참조형 변수는 참조값을 통해 같은 객체(인스턴스)를 공유하게 됩니다.
공유 참조와 사이드 이펙트
사이드 이펙트(Side Effect)는 프로그래밍에서 어떤 계산이 주된 작업 외에 추가적인 효과를 일으키는 것을 의미합니다.
위의 예제와 같이 b의 값을 부산으로 변경했을 때 a도 부산으로 값이 변경되었을 때 사이드 이펙트가 발생했다고 말합니다.
사이드 이펙트 해결 방안
Address a = new Address("서울");
Address b = new Address("서울");
해결 방안은 단순하게 a와 b가 처음부터 다른 인스턴스를 참조하면 사이드 이펙트가 발생할 일이 없습니다 !
하지만 여러 변수가 하나의 객체를 공유하는 것을 막을 방법이 없습니다. 'Address b = a' 와 같이 코드를 작성했을 때 자바 문법상 이상이 없기 때문입니다. 이를 막기 위한 방법으로 불변 객체를 도입해보겠습니다 !
불볍 객체 도입
객체의 상태(객체 내부의 값, 필드, 멤버 변수)가 변하지 않는 객체를 불편 객체(Immutable Object)라고합니다.
public class ImmutableAddress {
private final String value;
public ImmutableAddress(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
참조형에서 작성했던 Address 클래스를 불편 클래스로 작성했습니다.
내부 값이 변경되지 않도록 value의 필드를 final로 선언했고 값을 변경할 수 있는 setValue()를 제거했습니다. 이 클래스는 생성자를 통해서만 값을 설정할 수 있고, 이후에는 값을 변경하는 것이 불가능합니다 !
정리
객체의 공유 참조는 막을 수 없습니다. 그래서 객체의 값을 변경하면 다른 곳에서 참조하는 변수의 값도 함께 변경되는 사이트 이펙트가 발생하는데 사이트 이펙트가 발생하면 안되는 상황이라면 불변 객체를 만들어서 사용하면됩니다 !
가변(Mutable) : 처음 만든 이후 상태가 변경될 수 있다는 뜻입니다. (사전적으로 사문의 모양이나 성질이 달라질 수 있는 뜻)
불변(Immutable) : 처음 만든 이후 상태가 변하지 않는다는 뜻입니다.(사전적으로 사물의 모양이나 성질이 달라질 수 없다는 뜻)
'프로그래밍 > Java' 카테고리의 다른 글
[Java, 자바] Wrapper Class에 대하여 (1) | 2024.07.14 |
---|---|
[Java, 자바] String 클래스에 대하여 (0) | 2024.07.02 |
[Java, 자바] Object클래스에 관하여 (0) | 2024.06.23 |
[Java, 자바] @JsonProperty, @JsonNaming이란? (0) | 2024.06.20 |
[Java, 자바] 추상클래스와 추상메소드 (0) | 2024.06.19 |
개발의 모든 것 !
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!