인프런 커뮤니티 질문&답변

duswjdhh님의 프로필 이미지
duswjdhh

작성한 질문수

김영한의 실전 자바 - 중급 1편

불변객체 질문있습니다

작성

·

72

0

public class ImmutableMain1 {
    public static void main(String[] args) {
        ImmutableObj obj1 = new ImmutableObj(10);
        ImmutableObj obj2 = obj1.add(20);

        //계산 이후에도 기존값과 신규값 모두 확인 가능
        System.out.println("obj1 = " + obj1.getValue());
        System.out.println("obj2 = " + obj2.getValue());
    }
}
public class ImmutableMain2 {
    public static void main(String[] args) {
        ImmutableObj obj1 = new ImmutableObj(10);
        obj1.add(20);

        //계산 이후에도 기존값과 신규값 모두 확인 가능
        System.out.println("obj1 = " + obj1.getValue()); //
        System.out.println("obj2 = " + obj1.add(20).getValue()); //Q.이렇게 하면 안되는지??
    }
}

Main1에서 했던것처럼 obj2를 하나 새로 만들지 않고 2에서 obj1.add(20).getValue() 이렇게 해도 원하는 결과값이 나오는데 새로 obj2를 만드는것과 어떤 차이가 있나요??

Main2에서 저렇게 코드를 쳤을때 인스턴스값을 확인해보니 1과 2가 각각 다른 값이 나오더라고요 ImmutableObj에서 이미 return new ImmutableObj(result);을 사용하고 있어서 이때 인스턴스가 이미 생성되어서 그렇다고 생각하는데 맞을까요?? 그러면 이미 생성되었는데 또 obj2를 다시 만드는 이유는 무엇인가요??

답변 2

0

안녕하세요. duswjdhh님, 공식 서포터즈 y2gcoder입니다.

ImmutableMain2ImmutableMain1 에서 obj1.add(20); 의 반환 값인 새로운 인스턴스를 변수로 지정해주지 않았을 때의 상황을 보여주기 위해 만든 것입니다!

image.png

실제로 duswjdhh 님께서 짜주신대로 하면 첫번째 obj1.add(20)의 반환 인스턴스와 두번째 obj1.add(20)의 반환 인스턴스는 서로 다른 객체입니다. 두 객체 안에 있는 값 리터럴 자체는 동일하나 서로 다른 인스턴스를 가리키기 때문에 한 객체를 조작해도 다른 객체에 영향을 주지 않습니다. 이 부분이 불변 객체의 주요한 특징이라고 생각합니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

duswjdhh님의 질문에 대해 답변 드리겠습니다. 불변 객체를 다루고 있는 Java 코드에서 복사본을 만드는 방법에 대한 고민을 해주셨군요.

먼저, 두 코드(ImmutableMain1ImmutableMain2)의 차이를 설명드리겠습니다:

  1. 불변 객체의 개념: 불변 객체는 한 번 생성되면 그 상태가 바뀌지 않는 객체를 의미합니다. 따라서, 객체의 값을 변경하는 메소드(add 메소드)는 기존 객체를 변경하는 대신, 새로운 객체를 반환하는 방식으로 설계됩니다.

  2. ImmutableMain1의 방식:

    ImmutableObj obj2 = obj1.add(20);
    

    이 방식은 add 메소드 호출 시 새로운 객체(obj2)를 생성하고, 이를 obj2에 할당하여 기존의 obj1 값과 분리하여 유지하려는 경우 유용합니다. 이러한 방법은 코드에서 명확한 객체 상태 관리를 가능하게 해줍니다.

  3. ImmutableMain2의 방식:

    obj1.add(20).getValue();
    

    이 방식은 add 메소드 호출로 생성된 새로운 객체를 즉시 사용합니다. 즉, 결과값만 필요하거나 하여 중간 변수를 명시적으로 나타낼 필요가 없다고 판단될 때 사용될 수 있습니다.

결국, 두 방식은 같은 결과를 얻을 수 있지만, 어떤 방식이 더 적절한지는 코드의 맥락과 의도에 따라 다릅니다. obj2를 명시적으로 만들어 두는 것은 코드의 가독성을 높이거나 객체의 분명한 상태 변화를 나타내기 위해 일반적으로 사용됩니다. 반면에, 단순히 결과를 일시적으로 참조할 필요가 있을 때는 obj1.add(20).getValue()와 같이 직접 호출할 수 있습니다.

마지막으로, obj2를 새롭게 생성하는 이유는 명확성각 객체의 독립성을 보장하기 위함입니다. 각기 다른 작업을 하는 경우에 객체 상태가 명확하게 변경되었음을 보장할 수 있으며, 의도하지 않은 객체에 대한 변경을 예방할 수 있습니다.

관련 질문들을 참고하시기 원하실 경우, 다음 링크를 추천드립니다:
- “불변 객체 코드 리뷰 좀요.”

이 자료들은 불변 객체와 관련된 다양한 질문을 다루고 있어, 여러분의 궁금증을 해결하는데 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

duswjdhh님의 프로필 이미지
duswjdhh

작성한 질문수

질문하기