원시값 포장과 VO의 차이

사다리 미션을 진행하면서 모든 원시 값과 문자열을 포장한다 라는 요구사항을 받게 되었다.

원시 값을 포장하면서 "아 값을 객체로 포장하니까 값 객체 -> VO(Value Object)구나!" 라고 단순하게 생각했었다.

미션을 진행하면서 위치에 대한 값을 포장하여 vo 패키지에 넣었다. 위치는 변하는 값이다.
이때, 언뜻 보았던 VO는 불변성을 보장한다 라는 말이 생각났다. 그렇다면 원시값 포장과 VO는 다른 개념일까? 라는 생각을 하게 되었다.


먼저, VO와 원시값 포장의 정의에 대해 알아보고 어떠한 차이가 있는지 생각해 보자.

VO(Value Object)

값을 나타내는 객체로, 해당 객체의 상태를 변경하지 않는 불변 객체이며, 다음의 특징을 갖는다.

  1. equals & hash code 메서드를 재정의해야 한다.
    • 동등성을 보장해야 하기 때문에 equals & hash code 메서드를 재정의해야 한다.
  2. 수정자(setter)가 없는 불변 객체여야 한다.
    • 객체를 생성한 후 상태의 변경이 없다.

원시값 포장(Primitive value wrapping)

원시 타입(primitive type)의 데이터를 객체 형태로 감싸는 것을 말한다.

자바에서는 int, double과 같은 원시 타입을 객체로 감싸는 Wrapper 클래스를 제공한다. 이렇게 원시 타입을 객체로 감싸면, 해당 객체를 통해 데이터를 처리하는 로직과 데이터 자체를 나타내는 역할을 분리할 수 있다.

즉, VO는 값을 표현하기 위한 개념이고, 원시값 포장은 책임을 분리하기 위한 개념이다.

두 개념을 혼동하지 말자

디미터의 법칙

디미터의 법칙은 다른 객체가 어떠한 자료를 갖고 있는지 속사정을 몰라야 한다는 것을 의미하며, 이러한 이유로 Don’t Talk to Strangers(낯선 이에게 말하지 마라) 또는 Principle of least knowledge(최소 지식 원칙) 으로도 알려져 있다.

또는 직관적으로 이해하기 위해 여러 개의 .(도트)을 사용하지 말라는 법칙으로도 많이 알려져 있으며, 디미터의 법칙을 준수함으로써 캡슐화를 높여 객체의 자율성과 응집도를 높일 수 있다.

다음은 Player는 Name을 가지고 Name은 String을 래핑한 클래스다.

Public class Player {
    private final Name name;

    public Name getName() { return name; }
}

public class Name {
    private final String value;

    public String getValue() { return value; }
}

플레이어의 이름이 "maco"인지 비교하는 상황이라고 해보자.
이름을 꺼내서 사용하기 위해서는 player.getName().getValue().equals("maco"); 와 같이 사용해야 할 것이다.
player의 Name의 value를 꺼내와서 "maco"와 비교하라 라는 메시지로 볼 수 있는데, Player안의 Name이 있고 안에 value가 있다는 것을 알아야 한다.

이러한 경우에 객체 간의 결합도가 높아서 다른 객체에 대한 지식이 많아야 사용할 수 있다.
따라서 다음과 같이 메시지를 보내도록 수정함으로써 해결할 수 있다.

Public class Player {
    private final Name name;

    public boolean equalsName("String s") {
        s.equals(name.getName());
    }
}

player.equalsName("maco") 으로 내부적으로 Name이 어떻게 되어있는지 알 필요 없이 사용할 수 있게 되어 객체 간의 결합이 느슨해진 것을 볼 수 있다.

'회고 > 우아한테크코스' 카테고리의 다른 글

2023.02.27 일일 회고  (0) 2023.02.28
2023.02.23 일일 회고  (1) 2023.02.24
2023.02.21 일일 회고  (0) 2023.02.22
2023.02.20 일일 회고  (0) 2023.02.21
2023.02.17 일일 회고  (0) 2023.02.18

+ Recent posts