이번 항목은 공용체란 무엇이고, 남용 될 수 있는 사례를 들어 보고, 생각해 보게 한다.


1 ) 공용체는 무엇이고 어떤 목적으로 쓰이는가?

공용체 union 은 같은 메모리 공간을 여러개의 객체들이 공유하는 구조체이다. 아래 코드를 봐 보자.

출력 값을 보게 되면, 몇가지 이상한 점을 볼 수 있을 것이다. u.i 에 값을 넣을 때는 u.f 값이 망가지고, u.f 에 값을 넣을 때는 u.i 값이 망가진다. 이것은 두 변수는 하나의 메모리 공간을 사용 한다는 것을 보여준다. ...사실 이거 가지고 증명해주지는 못한다.. 각 메모리 비트에 따라 어떻게 값이 변하는지 알아야 증명 될 수 있을 것이다. : ) .. 하긴 많은 책들이 다 설명하고 있으니 .. 굳이 증명하지 않아도...


2 ) 공용체의 멤버가 될 수 없는 형식들은 어떤 것인가? 그런 제한이 왜 존재하는가? 설명하라.

  1. 생성자, 소멸자, 복사 할당자, 복사 생성자를 정의한 객체 또는 그 객체의 배열은 멤버가 될 수 없다.
  2. 가상 함수나 가상 기반 클래스들이 없어야 한다.
  3. 그 클래스의 기반이나, 비정적 멤버들 역시 1번이나 2번을 조건에 해당하면 넣을 수 없다.

공용체는 C에서 이어저 내려온 것으로, C 스타일 구식 공용체가 C++ 에 위반되지 않기 위해서 도입 된 것이라고 한다.


3 ) 다음  코드를 비평하라.

a. 유효하지 않는 구문이나 이식 불가능한 관례 등의 기술적인 오류들은 무엇인가?

ㄱ. 일전에 Exceptional C++ 30 항목에서 이런 문제에 대해서 언급 된 적이 있었다. 바로 스택에 올린 char 배열은 바이트 정렬이 1바이트로 되어 있는데, LIST 나 STRING 의 경우 바이트 정렬이 1바이트가 아니므로, 이런 자료형으로 char 배열을 사용 하게 될 경우, BUS ERROR 를 일으킬 수 있다는 점 이다. 자세한 점은 http://www.ikpil.com/679 참조

이것을 피해가는 여러 방법들은 있지만, 이것들은 언어를 거스르려는 시도 이므로, 바람직하지 못하다고 말한다.


ㄴ. 복사 할당 및 복사 생성에 안전하지 못한다.

사용자가 정의해 준 것들이 없기 때문에, 매우 위험하다.


ㄷ. 그리고 여러가지 위험성 들이 있다.

하드 코딩, switch 문에서 형변환시키는 방법, default 가 단순 break 만 한다는 점, 불필요한 주석, _이름 을 짖는 형태 등이 있다.


4 ) 일반화된 가변 형식을 달성하는 더 나은 방법을 제안하고, 그런 방법이 가지는 절충들을 논하라.

boost::any 를 사용 하면 된다. 프로젝트에 적용해 보지는 못했지만, 참 재미있는 라이브러리였다. boost 의 any 를 한번 보면, 알 수 있을 것이다.


총평

이번 항목은 책을 보는게 더 도움이 될 것이다. 결론은 이상한 방법으로 언어를 사용하지 말라는 것인데, 언제나 쉽고 간단한게 제일 좋은 것이라고 느끼게 되었다. 그리고 template 을 좀 더 공부 해야 겠다는 생각 뿐.

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

댓글을 달아 주세요