항목 36. 인터페이스 계승과 구현의 차이점을 이해해라

2008/07/09 14:14 추가
이 이야기의 전제 조건은 어떤 클래스가 부모클래스가 될때, 그 부모클래스의 멤버 함수 선언함에 있어 주의해야 할점을 설명하는 것이다.

인터페이스 계승이란?
1. 메소드의 선언(int class::hehehe(int a);
이것을 계승한다는 뜻으로, 일종의 명령어(이런 이런 함수의 선언만 말한다)만 계승하는 것 이다.
2008/07/09 14:14 추가
2판이라 그런지 단어가 3판하고 좀 차이를 본다. 인터페이스 계승이란 함수의 정의만 계승하는것을 뜻한다.

여기서의 구현이란?
이 메소드들의 내부 동작 즉 메소드 정의(이런 이런 함수의 내부 동작을 말한다.)를 말한다.

이유
1. 각각의 차이점을 모르면 효율적인 설계를 못하니까!

해결 방법
1. 각각의 차이점과 역활을 이해 해라!
2. 계승 방법을 익힌다.
- 인터페이스만은                         순수 가상함수로 계승한다.
- 인스페이스와 기본 구현의 필요는 가상함수로 계승한다.
- 인터페이스와 기본 구현의 의무는 비가상 함수로 계승한다.

차이점 2008/07/09 14:14 수정 필요 없기 때문에
1. 인터페이스는 명령이고 구현은 그 명령의 진행이다.

역활
1. 순수 가상 함수는 인터페이스의 제어권을 객체에게 맞김으로써 객체 고유의 동작이 필요할 때 쓴다.
2. 가상 함수는 부모클래스의 기본동작이 필요할 때  사용 한다. 2008/07/09 14:14 수정
2. 가상 함수는 부모클래스의 기본 동작이 필요할 경우가 있을 때 사용 한다.
3. 비가상 함수는 모든 객체들이 동일한 작업이 필요할 때 사용한다.

초보자가 하는 실수
1. 모든 함수를 비가상 함수로 선언하는 것이다.
- 부모클래스는 절대적으로 소멸자를 가상함수로 만들어야 한다.(그 이유는 메모리 릭의 염두때문이다.)

2. 모든 멤버 함수를 가상 함수로 선언하는것이다.
(모든 함수를 재정의하면 내가 만든 클래스는 모든 사람들이 어떠한 일에도 사용 할수 있는 함수이다. ... 이런건 .. 내가 유치원이였을 때 만들수도 있다!)


개인적인 생각
1. 역활의 경우를 잘 한다면, 어떤 특수한 객체를 추가할 때, 그 특수한 객체를 처리하는 메소드의 추가만 하면 될 것이다.(기존 메소드들의 변경이 아닌 추가 만이다! 꿈의 설계다..)

2. 필자는 80-20 규칙을 설명할 때, 어느정도 동감하게 된다. 예전 프로그램에서 .. 대부분은 정말 50 mse 로 충분하다못해 남아 돌기 때문이다.

3. 만약 어떤 부모클래스 파생클래스 에서도 동일한 방식으로 동작해야 하는것이 있다면, 비가상함수로 써야 한다!

80-20 규칙(경험적인것이라고 한다.)
프로그램 실행시간의 80%는 코드의 20% 부분에서 소모된다.

필자의 한마디 요약
클래스를 선언함에 있어서 비가상함수를 선언하는 것은 파생 클래스의 사양이 달라지더라도 동일한 기능을 해야만 할 때 이다.





신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요