이번엔 클래스에 대하여 알아 보는 항목이다.
클래스란?
이제 질문의 시간을 갖어 보자. ① 어떤 함수들이 클래스의 "일부"일까? 그리고 ② 클래스의 인터페이스는 무엇으로 만들어 졌을까?
힌트
예제 1 (a)
이 코드에서 Draw() 함수는 CTEST 클래스의 일부라고 봐야 하나? 아마도 열에 여덞명은 "아니오" 라고 대답을 할 것이다. 그리고 어떤 사람은 기본적으로 중요한 것을 께달게 된다. 만약 예제 1 (a) 의 int main() 함수를 제외하고 한 파일에 있다면 다음과 같은 코드와 두드러지게 다르지 않을 것이다.
예제 1 (b)
...
..
.
잠시동안 생각을 해보면, 한 파일에 이런 Draw()같은 것들이 제공되어 졌을 때, 예제 1 (a) 예제 2 (b)는 CTEST를 제공 받거나 언급되어지게 된다면, 모두 CTEST의 일부라고 봐도 될 것이다.
Effective C++ 에 보면, 진정한 OOP는 클래스안에 함수를 두는 것이 아닌, 클래스 외부에 둠으로써, 상속이나 기타 변경사항들에 있어, 좋은 점들을 설명하는 항목이 있으니 한번 참조 바란다.
다시 본론으로 들어와서, 이런 개념이 C 형식의 개체지향 프로그래밍에 어떻게 적용 시킬수 있을까? 다음 코드를 보도록 하자.
이 코드를 볼수 있듯이 fopen fclose fseek, ftell 은 FILE의 인터페이스라 볼수 있으며, 이렇게 사용 할 수 있을 것이다. 우리는 알게 모르게 OO적인 마인드로 코딩을 하고 있었던 것이다.
이런 "제공" 되거나, "언급" 되는 것을 "일부" 라고 봤을 때 p.176 ~ p.177과 항목 31은 Exceptional Koenig 이 어떻게 적용 되는지를 알려준다.
요약하자면, 컴파일러는 강제로 둘 사이에 강한 관계를 맺게 해준다는 것이다. Koenig 검색에 의하여 ㅋㅋ
하지만 이것을 좋게만은 바라 볼수가 없다. Myers 예를 든다면, "오히려 더 모호해 져서 햇갈리지 않느냐?"를 의미하는것 으로 보인다. 하지만, 여전히 독립적이고, 예상되는 사용들에 알맞다는 의미도 있다.
예상되는 사용들은 항목 31을 보는게 더 빠를 것이다.
요약하자만, 인터페이스 원칙(언급 되거나 제공 되어 졌다면 일부로 볼 수 있다.)이 Koenig 검색과 완전히 같은 방법으로 동작하는 것은 우연아니며, 매우 쓸만하다.
정리 하고 나니, 클래스를 만들 때 좀 더 생각을 하게 된다.
클래스란?
"클래스는 연관되어진 데이터와 데이터 처리 함수들의 모음을 정의한 것이다"
이제 질문의 시간을 갖어 보자. ① 어떤 함수들이 클래스의 "일부"일까? 그리고 ② 클래스의 인터페이스는 무엇으로 만들어 졌을까?
힌트
- 확실히 non-static 멤버 함수들은 단단히 클래스와 연결되어 졌다. 그렇다면 static 멤버 함수들은과 자유(free) 함수들의 경우는 어떠한가?
- 항목 31의 함축적 의미를 시간을 두어 생각해 보자.
분석
①,② 이 두 질문들의 대답을 좀더 심화 시켜 본다면,- 이 대답이 C 형식의 개체지향 프로그래밍에 어떻게 적용 될까?
- C++의 Koening 검색이 어떻게 적용될까?, Myers 예는?
- 클래스 의존성을 분석하고 개체 모델을 디자인하는 방법에 어떻게 영향을 미칠까?
예제 1 (a)
이 코드에서 Draw() 함수는 CTEST 클래스의 일부라고 봐야 하나? 아마도 열에 여덞명은 "아니오" 라고 대답을 할 것이다. 그리고 어떤 사람은 기본적으로 중요한 것을 께달게 된다. 만약 예제 1 (a) 의 int main() 함수를 제외하고 한 파일에 있다면 다음과 같은 코드와 두드러지게 다르지 않을 것이다.
예제 1 (b)
...
..
.
잠시동안 생각을 해보면, 한 파일에 이런 Draw()같은 것들이 제공되어 졌을 때, 예제 1 (a) 예제 2 (b)는 CTEST를 제공 받거나 언급되어지게 된다면, 모두 CTEST의 일부라고 봐도 될 것이다.
Effective C++ 에 보면, 진정한 OOP는 클래스안에 함수를 두는 것이 아닌, 클래스 외부에 둠으로써, 상속이나 기타 변경사항들에 있어, 좋은 점들을 설명하는 항목이 있으니 한번 참조 바란다.
다시 본론으로 들어와서, 이런 개념이 C 형식의 개체지향 프로그래밍에 어떻게 적용 시킬수 있을까? 다음 코드를 보도록 하자.
이 코드를 볼수 있듯이 fopen fclose fseek, ftell 은 FILE의 인터페이스라 볼수 있으며, 이렇게 사용 할 수 있을 것이다. 우리는 알게 모르게 OO적인 마인드로 코딩을 하고 있었던 것이다.
이런 "제공" 되거나, "언급" 되는 것을 "일부" 라고 봤을 때 p.176 ~ p.177과 항목 31은 Exceptional Koenig 이 어떻게 적용 되는지를 알려준다.
요약하자면, 컴파일러는 강제로 둘 사이에 강한 관계를 맺게 해준다는 것이다. Koenig 검색에 의하여 ㅋㅋ
하지만 이것을 좋게만은 바라 볼수가 없다. Myers 예를 든다면, "오히려 더 모호해 져서 햇갈리지 않느냐?"를 의미하는것 으로 보인다. 하지만, 여전히 독립적이고, 예상되는 사용들에 알맞다는 의미도 있다.
예상되는 사용들은 항목 31을 보는게 더 빠를 것이다.
요약하자만, 인터페이스 원칙(언급 되거나 제공 되어 졌다면 일부로 볼 수 있다.)이 Koenig 검색과 완전히 같은 방법으로 동작하는 것은 우연아니며, 매우 쓸만하다.
총평
사실 Koenig 검색법이 무척이나 안좋다고 생각하고 있었다. 하지만, 내가 요구하는 사용법에 딱 맞는 방법이고, 심하게 네임스페이스를 깨뜨리는 것이 아니므로, Koenig 검색 법은 쓸만하다.
책에선 클래스의 멤버 함수가 비멤버 함수보다 더 강한 관계를 맺고 있다고 설명하고 있다. 이 부분에 대해서 한번쯤 생각을 정리해 보는 것도 도움이 될 것이라 생각 된다.
정리 하고 나니, 클래스를 만들 때 좀 더 생각을 하게 된다.
'책 정리 > Exceptional C++' 카테고리의 다른 글
항목 28 : 컴파일 시간 의존성 줄이기 - 파트 3 (난이도 7) (0) | 2008.10.16 |
---|---|
항목 27 : 컴파일 시간 의존성 줄이기 - 파트 2 (난이도 6) (0) | 2008.10.16 |
항목 26 : 컴파일 시간 의존성 줄이기 - 파트 1 (난이도 4) (0) | 2008.10.16 |
항목 34 : 이름 검색과 인터페이스 - 파트 4 (난이도 9) (0) | 2008.10.16 |
항목 33 : 이름 검색과 인터페이스 - 파트 3 (난이도 5) (0) | 2008.10.16 |
항목 31 : 이름 검색과 인터페이스 - 파트 1 (난이도 : 9½) (0) | 2008.10.15 |
항목 25 : 개체지향 프로그래밍 (난이도 4) (2) | 2008.10.14 |
항목 36 : 메모리 관리 - 파트 2 (난이도 6) (0) | 2008.10.11 |
항목 37 : AUTO_PTR (난이도 8) (0) | 2008.10.10 |
항목 35 : 메모리 관리 - 파트 1 (난이도 3) (0) | 2008.10.08 |
최근댓글