2021 시작

클래스를 만든다는 것은 새로운 타입을 만든다는 것이나 다름이 없다. 그러기에 '잘' 만들어야 한다. 잘 만들기 위해서 다음과 같은 항목이 제대로 내 코드에 적용이 됐는지 확인해 보자

 

1. 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가?

이 부분이 어떻게 되느냐에 따라 클래스생성자 및 소멸자의 설계가 바뀐다. 그리고 만약 메모리 할당함수를 operator new, operator new[], operator delete, operator delete[])직접 작성한 경우에도 이들 함수 설계에 영향을 끼친다.

 

2. 객체 초기화는 객체 대입과 어떻게 달라야 하는가?

클래스의 초기화와 대입은 호출되는 함수부터가 다르다. 완전 다른개념이니 잘 구분하자

 

3. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가?

값에 의한 전달을 구현하는 쪽은 복사생성자이다.

 

4. 기존의 클래스 상송 계통망에 맞출 것인가?

이미 갖고 있는 클래스로부터 상속될 경우 기존 클래스에 의해 제약을 받을 것이다. 특히 멤버 함수가 비가상인가 가상인가의 여부가 가장 큰 요인이 된다. 소멸자도 그렇다.(가상 소멸자 말하는 건가?)

 

5. 어떤 종류의 타입 변환을 허용할 것인가

T1객체가 T2 타입 객체로 암시적 형 변환이 되려면 T1 클래스에 타입 변환 함수를 넣던가(operator T2) T2클래스에 인자가 하나인 비 명시(non-explicit) 호출 생성자를 넣어야 한다.

명시적으로(explicit)만 타입 변환을 허용하고 싶을 경우, 변환을 해 줄 함수를 만들되 타입 변환 연산자(자동으로 형 변환돼버림)나 비 명시 호출 생성자는 만들어선 안된다.

 

6. 어떤 연산자와 함수를 두어야 의미가 있을까?

편리 기능 함수 : 비멤버 비프 랜드 함수를 namespace에

타입 변환이 모든 매개변수에 대해 적용되어야 할 경우 비멤버 변수로 만들지만 이것을 일반화(template) 할 경우에는 멤버 함수로 바꿔주어야 한다.

 

7. 표준 함수들 중 어떤 것을 허용할 것인가.

쓰지도 않는데 컴파일러가 자동으로 만드는 함수는 삭제하거나 막자(예 : 복사 생성자, 복사 대입 연산자)

 

8. 새로운 타입의 멤버에 대한 접근권한을 어느 쪽에 줄 것인가?

어떤 클래스 멤버를 public, protected, private영역에 둘 것인가를 경정하는 데와 프렌드로 만들어야 할 클래스 및 함수를 정할 때와 클래스를 다른 클래스에 중첩시켜도 되는가에 대한 결정을 내릴 때 이 질문을 생각해보자

 

9. 선언되지 않은 인터페이스로 무엇을 둘 것인가?

만들어갈 타입을 위해 우리는 자원사용(잠금 및 동적메모리) 그리고 수행성능 및 예외 안전을 보장하는 것을 제공해주어야 한다.

이들에게 보장을 제공한다고 결정하면 클래스 구현에 있어 제약으로 작동할 것이다.

 

10.  새로 만드는 타입이 얼마나 일반적인가

실상은 타입 하나를 정의하는 것이 아닐지도 모른다. 우리가 정의하는 것이 동일 계열의 타입군(family of types) 전체일지도 모른다. 진짜 그렇다면 우리들이 원하는 것은 '새로운' 클래스가 아니라 '새로운' 클래스 템플릿을 정의해야 할 것이다.(뭐라 하는지 이해 못하겠어서 그냥 책에 나온 그대로 적어봤어 ㅎㅎ;; 위의 질문인 '일반적'이 템플릿에 대한 이야기인 거 같은데 흠.......)

 

11. 정말로 필요한 타입인가?

기존의 클래스에 대해 기능 몇 개가 아쉬워 파생클래스로 만들어 기능을 추가하는것보다 간단하게 비멤버 함수나 템플릿을 몇개 더 정의하는 편이 낫다.

 

12. 새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 잡을 것인가?

불변 속성은 주로 무언가를 "검사"할 때 쓰는 것 같다. (문자 길이가 어느 정도 선을 넘어가면 프로그램을 종료해버린다거나)그리고 이 불변 속성을 가진 것들은 생성자에서 초기화를 하자.

 

 

 

이것만은 잊지 말자!

1. 클래스 설계는 타입 설계이다. 새로운 타입을 정의하기 전에 이번 항목에 나온 모든 고려사항을 빠짐없이 점검해 보자

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading