📜 제목으로 보기

불변 일급컬렉션의 장점

  • 호출시 복사된 새 객체를 제공해주니 DTO처럼 view에 막 던져도 안정적이다
    • 건들이고 싶어도 기존 객체는 불변이라 못건들이게 되니
    • view에서도 복사된 가변 새컬렉션새 객체로 넘겨주면 된다.
  • 불변객체를 map의 key로 사용하게 될 경우 식별자 변경의 문제가 발생하지 않는다.
    • key로 사용하는 객체는 불변객체여야한다.
  • 도중에 실패하는 경우, 일부만 달라질 수 있다.
    • 기존 객체는 불변을 유지하게 해줘서 그런 문제(실패 원자성)를 막자.

불변 일급컬렉션을 만드는 과정

  • 멋도 모르고 컬렉션<단일객체>을 생성자에 통채로 집어넣어 만든 일급컬렉션은 사실 상태 변화(setter/add 등) -> [변화된 상태의 새 객체]를 생성해서 반환하기 위해 생겨난 생성자임을 생각해야한다.
  1. 단일객체에 대한 복수형으로 final 불변의 일급컬렉션 클래스를 생성하고, Set으로 단일객체를 보유할 빈 컬렉션을 조합한 필드를 가지고 있는다.

    be034d02-8ef8-430e-a79b-aa6981b12351

    image-20220731155154252

  2. 필드에 대해서 setter(상태변화) / getter를 고민해야한다.

    • 단일객체가 외부에서 변수로 받아져 조작되는 객체라면, 객체 자체를 파라미터로 받는 setter로 만든다.
    • 컬렉션에 대한 setter는 add/remve등이다. add로 단일객체 파라미터를 받되
    • 상태변화의 setter(add)는 상태변화된 새 객체를 반환하여 불변성을 유지한다.

    f8c3e381-7d52-40d3-ab9f-1de7c9415775

    image-20220731155645815

    1. 2번에서 상태변화된 컬렉션으로 새 객체 생성해서 반환을 하기 위해컬렉션을 통째로 받아 생성하는 생성자가 필요했음을 생각한다.
    2. 즉, 필요에 의해 객체컬렉션을 받는 생성자가 생겼음을 인지한다.
  3. 컬렉션 필드의 상태변화는 기존 컬렉션필드가 변하지 않도록 사본으로 복사한 다음 상태변화시킨 후 새객체 생성을 해줘야한다.

    • 컬렉션필드를 수정할 땐, 항상 사본복사후 연산하자.
      • 생성자를 통한 복사는 객체요소는 같은 주소를 바라봐서 요소변화가 가능한상태로 복사이다.

    62548315-caf2-4b2b-826b-6cb4a66b516b

    image-20220731162206685

  4. 기본생성자외 컬렉션 필드의 생성자가 생성되는 순간, 빈컬렉션의 필드초기화는 의미가 없어진다. 최초의 시작은 빈컬렉션으로 될 수 있도록 부생성자로서 추가해줘야한다.

    70742dde-326d-48ef-9798-c10674e600c2

    image-20220731161528409

  5. 파라미터가 없는 생성자는 부생성자이므로 파라미터가 있는 주생성자를 this로 사용해줘야한다.

    7d75e887-f5ac-44ee-b68a-2ea0f0745aaf

    image-20220731161701801

  6. 불변의 일급컬렉션에 요소를 add하는 과정은 매번 재할당해줘야한다.

    • 불변 객체를 받는 변수는 재할당이 운명이다.

    • 일급컬렉션은 getter().size()가 아니라 .size()메서드를 정의해서 쓴다.

    image-20220731163156321