이번 항목에선 클래스의 접근 권한에 대한 이야기이며, 이런 권한이란 전제가 깔리기 때문에 "위조범, 사기꾼, 소매치기, 도둑"이 생기고, 이들을 찾고 검거하는 방법들도 소개 된다.


1 ) 클래스의 다음 부분들에는 어떤 코드가 접근할 수 있는가?

( a ) public

( b ) protected

( c ) private


나는 이 질문에 답하기 위해서, 먼저, "어디에서 접근 할 때의 접근 권한이지?" 라는 생각이 들었다. 상속된 클래스 내부에서의 접근 권한인가? 클래스의 객체의 사용 접근 권한인가?  로 나뉘는데, .. 불필요한 생각 없이, 그냥 해 보자.

a. public

공개 멤버를 정할 때 쓰는 키워드로, 어떠한 경우에도 접근할 수 있다.

b. protected

1단 보호가 걸친 멤버를 정할 때 쓰는 키워드로, 생성된 객체에선 이 멤버들에 접근할 수 없다. 상속된 클래스 내부에선 접근 할수 있고, friend 선언된 함수나 클래스에서도 접근 할 수 있다.

c. private

2단 보호가 걸친 멤버를 정할 때 쓰는 키워드로, 당연히 생성된 객체에선 이 멤버엔 접근할 수 없다. 그리고 상속된 클래스 내부에서도 접근 할 수 없다! 자신의 클래스 내부와, friend 선언된 함수나 클래스 만이 오직 접근 할 수 있다.


나는 이렇게 배웠다. 아니. 이것만 배웠다. 하지만, 이번 항목에선, 이런 답이 통하지 않는다고 한다. 아니 또 뭐가 있길래..


2 ) 다음의 코드를 살펴보고 다음의 질문에 답하라.

X 클래스의 private_ 에 접근하기 위한 생각을 해보라.

a. 표준을 만족하지않으며, 이식성이 없는 편법을 생각해 보라.

불법적인 방법이야, 메모리 접근이라고 생각했고, 메모리 셋팅하는 함수를 이용해서, 값을 변경시켰다. 다음 코드를 보자.

여기서 몇가지 사실을 알게 됬는데, 처음에는 마지막 끝 부분에 2를 썼는데, 매우 큰 값이 들어갔다. 그래서 제일 처음 메모리 번지에 2를 썻더니 정상적(?)으로 값이 들어 갔는것을 확인 할 수 있었따.

이것은 아마도, 메모리 4byte의 첫번째 메모리 번지의 값부터 읽지 않을까? 란 생각이 든다. 이것은 좀 더 공부 할 때, 찾아봐야 할 것 같다. 아무튼 윈도우 XP SP3 + MSVC2005 에선 이런 것이니, 다른 플랫폼에선 다를 것이라고 생각도 되니, 이럴 수도 있다고 생각하고 넘긴다.

책을 보니, 이런 위법적인 방법들이, 위조범, 소매치기, 사기꾼, 도둑이 있다고 한다.


그 중 위조범을 예제로 만들고, 테스트를 해 봤다. 위의 코드중 X 의 정의를 x.h 로 따로 만들었다는 전제이다.

위조범 예제(재정의 예제)

MSVC2005 에선, 재정의로 인한 문제로, 컴파일이 되지 않는다. 즉, MSVC2005 에선 위조범이 있을 수 없다는 것인데, 다른 컴파일러에선 될 수 있다고 지적하고 있는 것을 보면, 무슨 편법이 있는 거 같다.

이 편법을 책에선 "X가 여러번 재정의 되었을 경우, 단일 정의 규칙에 의하여, 모두 동일한 X의 정의를 따라야 한다고 하지만, friend 선언의 경우, 객체 내부가 변경되는것이 아니므로, 컴파일러는 이것은 인지하지 못하고, X의 정의에 friend를 추가 한다" 로 이야기 하고 있다.

참 신기하다. MSVC2005에선 안되니, 다른 컴파일러가 있다면 테스트 해야 될 것 같다.


소매치기 예제

정말 벙벙한 방법이다. 매크로가 엄청나게 위험하다고 .. 느껴지는 이유도 이 때문이다. .. 진짜 영악하다. MSVC2005 에선 .. 잘 된다. 아마도 모든 컴파일러가되지 않을까?


사기꾼 예제

정말 이 예제를 보는 순간 웃었다. 왜냐하면 진짜 사기꾼 이기 때문이다. ㅋㅋ

MSVC2005 에선 잘 된다. 오랜만에 코드보고 웃었다. 멤버 객체의 위치가 동일하다고 보장은 못하지만, 그 가능성이 크기 때문에, 사기 당할 가능성 역시 크다.

reinterpret_cast 자체가 컴파일러에게 강력한 명령을 내리는거와 같기 때문에, 대부분의 컴파일러에선 잘 작동 될 것으로 보인다.

여기까지가 컴파일러에 따라 이식성이 없으며, 위법적인 방법을 소개 한것이다. 다음은 표준에 적법하면서, 도둑질하는 예제를 봐보자.

b. 표준을 완전히 만족하며 이식성 있는 방법을 생각해 보라.

이것도 꽤 웃었다. 이렇게 도둑질 하는구나 싶기도 했기 때문이다.

도둑 예제

템프릿이라는 창으로 들어가서, 집안을 홀라당 털어버리는 도둑질이라 할 수 있는 예제였다. 정말 표현하나 잘하는것이 이렇게 재미를 줄 지는 몰랐다.


3 ) 이것(도둑예제) C++의 접근 제어 메카니즘의 구멍, 따라서 C++ 캡슐화의 구멍인가?

구멍이라 할 수 있다. .. 도둑질 하는 문이면, 구멍이라 칭 할수 있기 때문이다. 중요한 것은, 캡슐화의 구멍을 악용하든, 우발적인 오용이든, 하지 말라는 것이다.


총평

정말 재미있게 웃으며, 읽었던 항목이다. 도둑 예제는 가끔 써먹으면, 웃을 수 있겠다.


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

댓글을 달아 주세요

  1. Favicon of http://semicolon238.com 잉제 2010.11.10 22:55 신고  Addr  Edit/Del  Reply

    푸하하핫
    오랜만에 재밌는걸 봤네요
    신기하면서도 유쾌한 접근코드들을 보고 많이 웃었습니다
    감사합니다~