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

Minsu._.Lighting·2023년 11월 23일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" 사용자가 저지를 만한 실수의 종류를 머리에 넣어 두자! "

  • 인터페이스를 만들 때는 제대로 쓰기에 쉬우며 엉터리로 쓰기에 어렵게 만들 수 있도록 고민하고 또 고민하자!

💡 인터페이스 설계

  • 사용자가 인터페이스를 잘못 사용했을 경우에 인터페이스는 최소한의 항의의 몸 부림이라도 보여줘야 한다.
    - 컴파일 되지 않게 설계, 컴파일 된다면 그 코드는 원하는 동작을 보여줘야 함.


📌 예시 1, 날짜를 나타내는 클래스를 설계하던 중...

class Date
{
public:
	date(int Month, int Day, int Year);
};
  • 매개 변수의 전달 순서에 의한 문제 발생
    Date d(21, 4, 1999);
    - Month와 Day가 바뀜!

  • 매개 변수의 값이 터무늬 없는 경우 문제 발생
    Date d(4, 210, 1999);
    - 4월 210일은 없다...

📢 새로운 타입을 정의 해 상당수의 실수를 막을 수 있다!

[Month 타입 정의]
struct Month
{
	exlicit Month(int m)
    : iVal(m) {}
    
    int iVal;
}

[Day 타입 정의]
struct Day
{
	exlicit Day(int d)
    : iVal(d) {}
    
    int iVal;
}

[Year 타입 정의]
struct Year
{
	exlicit Day(int y)
    : iVal(y) {}
    
    int iVal;
}
  • Datd d(21, 4, 1999);
    - int형 변수와 새로 정의한 타입은 맞지 않음, 에러!
  • Datd d(Day(21), 4, 1999);
    - Month타입과 Day타입이 서로 바뀌어 맞지 않음, 에러!
  • Datd d(Month(4), Day(4), Year(1999));
    - 깔끔!

📢 적절한 타입이 준비되면 값에 제약을 가하더라도 괜찮은 경우가 생김

  • Month가 가질 수 있는 유효한 값은 12개
    - enum을 사용할 수 있지만 int 형식으로도 쓰이는 등 타입 안정성이 떨어짐.
    - 해당 Month 값을 반환하는 함수 정의
class Month
{
public:
	static Month Jan() { return Month(1); }
    static Month Feb() { return Month(2); }
}

📌 예시 2, 특별한 이유가 없다면 사용자 정의 타입은 기본 제공 타입처럼 동작하게 만들자

if (a * b = c) ... // 비교 연산자를 사용하려다 나온 실수
📢 a와 b가 int라면 a*b에 대입을 하는건 말도 안되는 코드이다, 이런 int처럼 기본 제공 타입과 굳이 다르게 만들 필요가 없다면 사용자 정의 타입도 위 코드가 말이 안되게 만들자

  • 일관성 있는 인터페이스 제공을 위함
    - STL 컨테이너의 경우 완벽하진 않지만 일관성을 가짐.
    - 자바의 경우 string은 Length를, list는 size 등을 써 헷갈릴 수 있음.

📌 예시 3, 사용자가 외워 사용해야하는 인터페이스는 실수하기 쉽다.

Investment* createInvestment();
📢 자원 누출을 피하기 위해 얻어낸 포인터를 나중에라도 삭제 해야 한다.

  • 스마트 포인터를 사용하자
    shared_ptr<Investment> createInvestment();
    - 스마트 포인터를 사용해 포인터 삭제를 깜빡하는 일이나, 똑같은 포인터에 delete가 두 번 이상 불리는 경우를 방지하자.
    📢 shared_ptr은 교차 DLL 문제를 방지해 준다.
    - shared_ptr은 생성된 DLL과 동일한 DLL에서 delete가 사용 됌.
profile
오코완~😤😤

0개의 댓글

관련 채용 정보