카테고리 없음

[Effective C++] Item18_인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자

해달 2018. 2. 1. 21:05

Item18_인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자

챕터 핵심 내용

  • 좋은 인터페이스는 제대로 쓰기에 쉬우며 엉터리로 쓰기에 어렵다.
  • 인터페이스의 올바른 사용을 이끄는 방법으로는 인터페이스 사이의 일관성 잡아주기, 그리고 기본제공 타입과의 동작 호환성 유지하기가 있다.
  • 사용자의 실수를 방지하는 방법으로는 새로운 타입 만들기, 타입에 대한 연산을 제한하기, 객체의 값에 대해 제약 걸기, 자원 관리 작업을 사용자 책임으로 놓지 않기가 있다.
  • tr1::shared_ptr은 사용자 정의 삭제자를 지원한다. 이 특징 때문에 교차 DLL 문제를 막아 주며, 뮤텍스 등을 자동으로 잠금 해제하는 데 쓸 수 있다.

- 좋은 인터페이스는 제대로 쓰기에 쉬우며 엉터리로 쓰기에 어렵다.

  • 사용자 쪽에서 뭔가를 외워야 제대로 쓸 수 있는 인터페이스는 잘못 쓰기 쉽다.

- 인터페이스의 올바른 사용을 이끄는 방법으로는 인터페이스 사이의 일관성 잡아주기, 그리고 기본제공 타입과의 동작 호환성 유지하기가 있다.

  • 기본제공 타입과 쓸데 없이 어긋나는 동작을 피해야 한다.
  • 그렇게 함으로써 일관성 있는 인터페이스를 제공할 수 있다.

- 사용자의 실수를 방지하는 방법으로는 새로운 타입 만들기, 타입에 대한 연산을 제한하기, 객체의 값에 대해 제약 걸기, 자원 관리 작업을 사용자 책임으로 놓지 않기가 있다.

  • 새로운 타입을 만들어 인터페이스를 강화하면 상당수의 사용자 실수를 막을 수 있다.
  • 적절한 타입이 준비되어 있다면 각 타입의 값에 제약을 가할 수도 있다.
  • 타입 안전성이 신경 쓰인다면 유효한 타입의 집합을 (지역) 정적으로 만들 수도 있다.
  • const를 이용해 연산을 제한시킬 수 있다.
  • RAII 객체를 반환하는 팩토리 함수를 이용해 사용자의 실수를 방지할 수도 있다.

- tr1::shared_ptr은 사용자 정의 삭제자를 지원한다. 이 특징 때문에 교차 DLL 문제를 막아 주며, 뮤텍스 등을 자동으로 잠금 해제하는 데 쓸 수 있다.

  • 교차 DLL 문제(cross-DLL problem) : new/delete 짝이 실행되는 DLL이 달라 발생하는 문제
  • tr1::shared_ptr은 생성된 DLL과 동일한 DLL에서 delete를 사용하도록 만들어졌다.

후기(postscript)

C++11부터는 tr1에 있던 shared_ptr이 표준으로 들어왔다.