[OOP] 원시값 포장과 일급 컬렉션

calm0_0·2023년 11월 22일
0

OOP

목록 보기
6/6

원시값 포장


원시 값 포장이란 원시 타입으로 선언된 변수를 의미 있는 객체로 포장하여 선언하는 방법을 말한다.

class User {
  private name: string;
  private age: number;
  
  //...
}

위와 같이 원시 타입으로 선언된 변수 name, age 를

class User {
  private name: Name;
  private age: Age;
  
  constructor(name: Name, age: Age) {
  	this.name = name;
    this.age = age;
  }
}

class Name {
  private name: string;
  
  constructor(name: string) {
  	if(name.length < 2) {
      throw new Error('이름은 두 글자 이상');
    }
  }
}

public class Age {
  private age: number;
  
  constructor(age: number) {
    if (age < 0) {
      throw new Error('나이는 0살 이상');
    }
  }
}

객체로 포장하여 선언했다.

이렇게 하면 User 클래스는 사용자 그 자체 상태만 관리하고 이름, 나이 등 상태값은 Name, Age 클래스에서 스스로 관리할 수 있다.

원시값을 객체로 포장하면 자신의 상태를 객체 스스로 관리할 수 있어 책임이 명확해진다. 또한 코드의 유지보수에 도움이 된다.


일급 컬렉션


일급 컬렉션이란 Collection을 Wrapping하면서, Wrapping한 Collection 외 다른 멤버 변수가 없는 상태를 말한다.

interface Order {
  item: string;
  price: number;
}

class Orders {
  constructor(private orders: Order[]) {
    if (!orders.length) {
      throw Error('주문은 비어있을 수 없습니다.');
    }
  }

  get total() {
    return this.orders
      .map((order) => order.price)
      .reduce((previous, current) => previous + current);
  }

  add(item: string, price: number) {
    this.orders.push({ item, price });
  }

  printTotal() {
    console.log(`총 금액: ₩${this.total}`);
  }
}

const orders = new Orders([
  { item: '치킨', price: 18000 },
  { item: '콜라', price: 2000 },
  { item: '치킨무', price: 1000 },
]);

orders.add('피자', 15000);

orders.printTotal();

이렇게 일급 컬렉션을 사용하면 '주문 목록'이라는 비즈니스에 종속적인 자료구조를 만들 수 있다. 또한 주문 목록에 관련한 상태와 행위를 한 곳에서 관리할 수 있다.



Reference
https://tecoble.techcourse.co.kr/post/2020-05-29-wrap-primitive-type/
https://woonjangahn.gitbook.io/logs/typescript/oop/4

profile
공부한 내용들을 정리하는 블로그

0개의 댓글