• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

불변 제약 대체

23.07.04 14:37 작성 조회수 255

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

안녕하세요! 불변 객체를 공부하다 궁굼점이 생겨 문의드립니다.

부작용 차단을 위한 불변 제약을 두는 대신

Member.class

public void setAddress(Address address) {
        this.address = new Address(address);
    }

 

Address.class

public Address(Address address) {
        this.city = address.city;
        this.street = address.street;
        this.zipcode = address.zipcode;
    }


와 같이 항상 새로운 객체를 생성하여 할당하는 방식을 사용한다면 값 변경에도 자유로울 수 있을 것 같은데 문제될 수 있는 부분이 있을까요?

답변 2

·

답변을 작성해보세요.

1

안녕하세요. 문 현필님

생각하신 내용이 바로 불변을 다루는 방법입니다^^

불변의 경우에는 새로 객체를 생성해서 할당해야 하니까요.

감사합니다.

문 현필님의 프로필

문 현필

질문자

2023.07.10

답변 감사합니다!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.06

안녕하세요, 인프런 AI 인턴이에요.

불변 객체를 다루기 위해 부작용 차단을 위한 불변 제약을 두는 방법 대신 새로운 객체를 생성하여 값을 변경하는 방식을 사용하는 것은 일반적인 방법 중 하나입니다. 이러한 방식을 사용하면 객체를 변경할 때마다 새로운 객체를 생성하므로 원래의 객체는 그대로 유지됩니다.

이 경우에는 객체의 값이 변경되어도 원래의 객체는 그대로 유지되기 때문에 값이 변경되었다는 사실을 다른 코드에서 인식할 수 없습니다. 따라서, 값이 변경됨에 따라 발생할 수 있는 문제나 예기치 않은 동작을 예방할 수 있습니다.

하지만 이 방식은 객체를 변경할 때마다 새로운 객체를 생성하므로 메모리 사용량이 늘어날 수 있습니다. 또한 객체가 복잡하고 깊게 중첩되어 있다면 객체를 복사하는 비용이 증가할 수 있습니다. 따라서, 이 방식을 사용할 때는 객체의 크기와 복잡성을 고려해야 합니다.

또한, 새로운 객체를 생성하여 값을 할당하는 방식을 사용할 때는 주의해야 할 점이 있습니다. 예를 들어, 참조 타입의 객체가 있다면 주소(reference)를 공유하는 문제가 발생할 수 있습니다. 이 경우 원래의 객체와 새로운 객체가 동일한 주소를 참조하게 되면 값이 변경될 때 예상치 못한 동작이 발생할 수 있습니다. 따라서, 이러한 경우에는 깊은 복사(deep copy)를 수행하여 새로운 객체를 생성해야 합니다.

따라서, 불변 객체를 다룰 때는 객체를 변경하는 방식에 따른 장단점과 주의해야 할 점을 고려하여 적절한 방법을 선택하는 것이 중요합니다. 추가적인 궁금한 점이 있으시면 언제든지 물어보세요. 감사합니다.