뿱스런 나의 GDI+ 사용기

이번에 상당히 황당스런, 하지만 결과를 알고보니 그럴것도 같다는 문제성 코드 때문에 또 하루의 수십%에 해당하는 시간을 소비해 버렸다.

Need는 OpenGL의 텍스쳐맵핑 소스로 BMP, JPG, PNG, GIF등 다양한 이미지 포멧을 사용하기 위해 GDI+의 Bitmap 클래스를 사용하게 되었는데, 이상하게도 Bitmap 클래스를 new 연산자를 통해 Heap에 할당하고 당연이 소멸자에서 delete를 하면 메모리 충돌이 나는 것이였다. delete를 어디선가 두번해 주는 것이 아닌가 하는 의문이 들었으나 그런 부분은 없는 듯 하였다. 또한 분명히 delete 하기전에 클래스의 참조 포인터가 NULL인지를 확인하는 조건까지 따져 코딩했었고….. 오늘은 포기하고 낼 맑은 머리로 해야지 싶어 포기할때쯤, 그 원인이 잡혔다.

프로그램이 시작되면 GDI+ 초기화가 일어나고 종료되면 GDI+ 정리가 일어난다. 문제는 Bitmap 클래스의 해제가 GDI+ 정리 이후에 호출되어져 메모리 충돌이 일어나는 것이였다. 즉, GID+ 관련 클래스들의 생성과 해제는 반드시 GDI+의 초기화와 정리의 중간에 발생해야 한다는 것..! 알고보니 당연한듯도 하다.

하지만 정말 당연한 것일까? 혹시 이런 것은 아닌가..

일단 한번 GDI+ 관련 클래스가 만들어지면 GDI+는 자신의 Namespace의 클래스 중, 생성된 인스턴스를 모두 관리하고 있다는 것. .NET 프레임워크에서 GDI+는 기존의 GDI를 완전이 새롭게 대체하는 요소이다. .NET 하면 GC, 즉 가비지 컬렉션이라는 개념이 존재하는데, 개발자가 생성한 객체를 따로 delete와 같이 직접 메모리에서 해제하지 않아도 알아서 해제를 해주는 참으로 편리한 개념이다. 혹시 이러한 .NET의 중요한 일부를 차지하는 GDI+가 GC를 위해 자신의 Namespace 하의 모든 클래스의 생성을 알고 있기 때문이 아닐까?

이것이 사실이라면 GDI+의 클래스들을 생성하고 직접 해제하지 않아도 GDI+의 정리코드를 호출하면 자동으로 해제된다는 개념이다. 그런데 실제로 GDI+ 클래스를 직접 delete하지 않아도 메모리의 누수가 발견되지 않았고, GDI+를 해제하는 즉시, GDI+ 클래스의 인스턴스의 아무리 사소한 맴버변수나 함수의 호출에 실패한다. 즉, GDI+의 해제시 GDI+의 클래스들의 모든 인스턴스는 무효화 되며 자동적으로 delete 되는 것 같다. Managed가 아닌 개발 환경에서도 말이다.

오전 시간 전부와 오후 시간 조금을 갉아 먹은 코드.

퇴근하기전에 해결하지 못한 코드를 다음 날로 미루고 퇴근한 바로 그 다음날인 오늘, 다시 문제의 코드를 살펴보는데, 도무지 모르겠더라.. 여차저차 해서 문제가 발생하는 방향과 문제가 발생하지 않은 방향은 알게 되었는데.. 그 원인이 무엇인지는 여전히 모르겠더라..

Need는 3DS 파일을 로딩하여 화면상에 표시하는 어느 외국(DigiBen, digiben@gametutorials.com)인 잘만들어 공개해 놓은 소스 코드를 사용하려고 하는데.. 핵심적인 사용은 클래스 하나와 구조체 하나를 조합하여 사용하는 것이었다.

문제는 시험차원에서 만들어 놓은 코드는 잘작동을 하는데, 실제 프로젝트에 적용을 해보면 프로그램이 뻗어 버렸다. 여차저차해서 겨우 문제가 발생하는 경우와 발생하지 않는 경우를 알게되었는데..

문제가 발생하지 않는 경우는 제공되는 클래스 하나와 구조체 하나를 전역으로 선언해 놓고 사용하는 경우고, 문제가 발생하는 경우는 지역이나 힙에 할당해서 사용하는 경우였다.

OOP의 규칙중에 최대한 전역적인 요소를 제거해야 하는 바 절대 전역으로 선언해서 사용해서는 않되었기에 new에 의한 힙 할당으로 사용하려고 했지만 계속 뻗어 버리고.. 뭐가 원인인지도 모르고, 나중에는 제작자의 불순한 의도가 아니겠는가하는 의심까지 들고… 역시 세상에 꽁짜가 없다느니하는 생각이 들더랬다.

제작자의 불순한 의도로 방향을 몰고 가던중에, 소스 코드까지 제공했다면 그 불순한 의도 역시 소스 코드 어디엔가 나를 비웃고 있겠지 하는 생각에.. 반듯이 잡아 족치리라 생각하고 코드 한줄 한줄 디버깅 해 들어갔다. 문제를 발생시키는 함수는 asm 소스로 된 memcpy라는 Ansi C 함수였다. 다시 memcpy가 받은 인자의 값을 살펴보니 웬 쓰레기값?

불현듯… 몽롱한 과거 까까머리로 C/C++을 학습하던 시절에 전역 변수는 자동으로 초기화가 되지만 그외의 경우는 자동으로 초기화가 되지 않는다는 성경말씀이 생각나.. 이것이구나! 라는 생각에 제공되는 클래스와 구조체 중에 구조체의 맴버 변수의 값들을 모두 0으로 설정하고 다시 돌려보니 잘되더라는…. 원인을 알고보니 참으로 어처구니가 없더라는… 하지만 원이 무엇이듯 잘해결이 되니 참으로 감격스러웠다..

이런 감격에 오늘의 교훈을 잊지 않고자 기록에 남긴다. 역시 90%의 오류는 오직 내 안에 있다는 것을… 또한 다른 이의 선행을 확실한 근거 없이 오해하지 말자라고….

행복한 부부생활 8계명

1. 아내와 남편에게 포상 휴가를 줘라. 1년 중 하루, 혹은 며칠만이라도 가정을 떠나 혼자 있는 시간을 만들어주자. 특히 남자는 동굴을 선호하는 존재다.

2. 잊지 말자 기념일. 기념일은 사소한 분쟁의 불씨. 처갓집 식구의 기념일은 휴대폰에 특별관리 해두자.

3. 돈 관리는 투명해야 한다. 남편과 아내가 딴 주머니를 차는 순간 비밀이 생긴다. 주머니 돈=쌈짓돈??

4. 싸워도 외박은 금물. 홧김에 내뱉은 욕이나 외박은 돌이킬 수 없는 상처가 돼 돌아온다.

5. 교환 일기를 쓴다. 서로 공유할 수 있는 일기장을 만들어 글로 대화하면 말 못할 고민이 줄어든다. 글은 말 보다 강하다.

6. 작은 선물에 인색하지 말자. 머리핀이나 휴대폰줄 등 저렴하지만 상징적인 액세서리 선물을 안겨준다.

7. 운동에 돈을 아끼지 않는다. 건강한 신체는 행복한 부부 생활의 기본. 함께 땀 흘릴 수 있는 운동을 위해 지갑을 열자.

8. 끝으로 잘 싸워야 한다. 자주 싸우라는 뜻이 아니라 적극적으로 의견 교환을 해야 한다는 얘기다.

최수종-하희라, 차인표-신애라 부부를 통해 녹슬지 않는 부부생활 유지 비법을 들어봤다. 이들은 “노력하지 않으면 남남이 될 수 있는 게 바로 부부”라고 강조했다. 연예계 잉꼬 커플인 이들이 귀띔한 행복한 부부 생활 `하우 투(How to) 8`.

피겨 요정, ‘김연아’


2006 국제빙상연맹(ISU) 세계 주니어 피겨선수권에서 우승을 차지하며 한국 피겨스케이팅 사상 첫 금메달을 따낸 김연아(16, 군포 수리고)

넘넘 이쁘고 귀엽고, 나랑 같은 김(金)씨로써 뿌듯함 백만배~

[펌글] 대범함과 세심함

면접 장소에 종이뭉치 하나가 떨어져 있었다. 아무도 이를 줍지 않았는데 한 사람만이 이를 발견하고 주웠다.

그러자 면접관이 종이를 펼쳐보라고 얘기했다. 종이에는 이렇게 쓰여 있었다. “우리 회사에 입사한 것을 환영합니다.” 몇 년 후 종이뭉치를 주웠던 지원자는 사장이 되었다.

1961년 4월 12일, 구 소련의 우주비행사 가가린은 4.75톤의 보스토크 1호를 타고 89분간 우주를 비행하여 세계 최초의 우주비행사가 되었다.

당시 그는 19명의 지원자와 경합을 벌였는데 선발요인은 뭔지 아는가. 다른 사람들은 모두 신발을 신은 채 우주선에 올랐는데 그 만은 신발을 벗고 우주선에 올랐기 때문이다.

이처럼 별 것 아닌 것 같은 세심함이 사실은 개인과 조직의 성패를 좌우한다. 우리는 늘 2%가 부족해 일을 그르친다. 크게 일을 잘 벌이기는 하지만 언제나 마무리가 약하고 그런 사소한 것 때문에 성과를 내지 못하는 경우가 많다.

사업도 대범함만으로는 안 된다. 이런 세심함이 필수 조건이다. 대만 제일의 갑부 왕융칭 포모사 회장이 그렇다. 그는 어려운 집안 형편 때문에 쌀 가게로 사업을 시작했다. 하지만 위치도 안 좋았고, 경쟁도 심했다. 당시는 길에서 도정을 했기 때문에 쌀에 돌이 무척 많았다.

그는 두 동생을 동원해 이물질을 일일이 골라낸 후 판매했다. 또 노인들이 주로 쌀을 사러 왔는데 운반이 문제였다. 왕융칭은 직접 쌀을 배달하기 시작했다. 좋은 쌀을 편하게 살 수 있으니 당연히 가게는 손님으로 북적이게 되었다.

그는 배달 과정을 활용해 손님을 파악했다. 그 집의 쌀독 크기는 어떤지, 식구는 몇 명인지, 식사량이 어느 정도인지, 언제쯤 쌀이 떨어질 것인지…. 그리고 그 때가 되면 미리 알아서 배달을 했다. 사업이 크게 확장된 후에도 그의 세심함은 계속된다.
그의 말이다. “나는 거시적인 부분에도 관심을 가지지만, 세부적인 관리에 더 심혈을 기울입니다. 세부적인 것을 연구하고 개선하여 2명이 할 일을 1명이 할 수 있으면 생산력이 2배가 늘어나는 셈이고, 한 사람이 2대의 기계를 작동할 수 있다면 생산력이 4배가 되는 것 아니겠습니까?”

요리의 지존 중국에서 토종기업 룽화지가 KFC에 밀린 이유도 디테일에서 뒤졌기 때문이다. 룽화지는 KFC가 가는 곳이면 룽화지도 간다는 캐치프레이즈를 내걸고 선전포고를 했다. 처음에는 제법 선전을 했는데 어느 순간 무너지기 시작해 사업 6년 만에 종지부를 찍었다. 도대체 이유가 무엇일까. 룽화지를 만든 신야그룹의 분석결과이다.

“경쟁에서 제품은 전제 조건일 뿐이다. 실제는 관리기술에서 승패가 결정된다. KFC의 경쟁력은 제품을 둘러싼 엄격한 관리제도에 있다. 전략이 매우 상세하고 구체적이며 세계 어느 매장에서나 동일하게 적용되고 있다. 원료입고, 제품생산, 서비스에 이르는 모든 과정에 엄격한 품질기준을 적용한다. 하지만 우리는 이를 실천하지 못했다. 위생상태와 서비스 질도 떨어졌다. 고객이 보는 앞에서 파리채로 파리를 잡고, 볶음밥과 프라이드 치킨도 뚜껑을 덮지 않은 채 진열대에 놓고 팔았다. 우리는 관리에서 그들에게 진 것이다.”

디테일의 중요성은 아무리 강조해도 지나치지 않는다. 노자도 비슷한 말을 했다. “큰 나라를 다스리는 것은 작은 물고기를 요리하듯 해야 한다. 양념과 불의 세기가 적당해야 한다. 초조한 마음에 물고기를 자주 뒤집으면 살이 모두 부서지고 만다. 세심함과 신중함이 필수적이다.”

20세기 최고의 건축가로 손꼽히는 독일의 미스반 데어 로에도 비슷하다. “신은 언제나 디테일 속에 있다. 아무리 거대한 규모의 설계라도 디테일한 부분이 잘못되면 좋은 작품이 될 수 없다.” 원자바오 총리도 비슷하다. “중국에는 13억의 인구가 있습니다. 아무리 작은 문제라도 13억을 곱하면 아주 커다란 문제가 됩니다.”

멋진 비전만으로는 꿈을 이룰 수 없다. 그 꿈을 이루기 위해서는 수없이 세세한 일을 생각하고 챙길 줄 알아야 한다. 아니 그것이 비전보다 오히려 더 중요할 수 있다.

 

서울과학종합대학원 교수