2011. 9. 14. 17:38

[ 051 ] - 구조체 변수를 만들면 반드시 초기화하자.

구조체 변수를 만들면 그 변수가 포인터이든지 아니면 구조체 변수이든지 상관없이 반드시 초기화를 해주어야 합니다.

특히 고수들은 초기화 작업을 위해 구조체를 만들고 초기화하는 별도의 함수를 사용합니다.

이 장의 본문에서 예로 든 생성 및 초기화 함수의 코드를 실무에서 구조체를 사용하는

프로그램을 작성할 때 적용할 수 있도록 충분히 연습하세요.

 

[ 052 ] - 구조체 내부에서 포인터를 사용하면 내부 항목도 메모리를 할당해 주자.

구조체를 사용할 때 내부 항목으로 char *형을 사용하는 경우가 가끔 있습니다.

반드시 char *형이 아니더라도 포인터형을 내부 항목으로 사용하는 경우가 있죠.

이와 같은 경우에는 구조체의 내부 항목도 메모리 할당을 해주어야 합니다.

만약 내부 항목이 포인터임에도 메모리 할당을 하지 않으면 프로그램을

실행하는 중에 이 포인터를 사용할 때 오류가 생길 수 있습니다.

 

[ 053 ] - 구조체 포인터를 해제할 때는 철저하게 하자.

구조체 포인터로 할당받은 변수를 사용하고 나서 해제할 때는 반드시 해제하는 순서를 지켜야 합니다.

해제하는 순서는 구조체 내부 항목으로 할당받은 메모리 영역부터 해제한 후에 그 작업이 모두 끝나면 실제

구조체 포인터도 해제해 주는 것입니다. 특히 구조체 포인터의 메모리를 해제했다고 해서 해야 할 일이 모두

끝난 것이 아니라 반드시 구조체 포인터 자체를 NULL로 초기화해야 합니다. 구조체 포인터도 또한

포인터이기 때문에 NULL로 초기화하지 않고 사용하면 치명적인 메모리 에러가 일어날 수 있습니다.

 

[ 054 ] - 구조체 배열을 잘 사용하면 데이터베이스가 부럽지 않다.

데이터베이스는 수많은 데이터를 특별한 규칙으로 분류하여 체계적으로 저장해 놓고

사용자가 원할 때마다 꺼내어 빠르게 출력하는 것입니다. 이 장에서 다룬 구조체 배열을 사용하면

데이터베이스와 똑같은 기능을 낼 수는 없지만 이와 비슷한 기능을 흉내 낼 수는 있습니다.

물론 구조체 포인터를 이용해서 같은 기능의 작업을 할 수도 있지만 인덱스로 직접 메모리를 접근할 수 있다는

배열의 장점과 여러 가지 자료형을 하나로 묶는다는 구조체의 장점을 모두 살릴 수 있는 방법은

구조체 배열이 유일하기 때문에 익혀 두면 여러모로 유용합니다.

 

[ 055 ] - 구조체 안에 구조체를 선언하자.

구조체 안에 구조체를 선언하는 방법은 객체 지향 프로그래밍의 상속(Inheritance)과 비슷합니다.

객체 지향에서 상속은 부모 클래스에서 선언한 멤버 변수나 멤버 함수를 상속받아서 자식 클래스에서

그대로 사용할 수 있는 것입니다. 구조체 안의 구조체는 하나의 구조체 안에서 기존의 구조체를

하나의 항목으로 선언할 수 있습니다.

따라서 구조체 안의 구초제는 마치 레고 블록으로 건물을 짓듯이 기존의 구조체로 선언한 자료형을

사용하여 손쉽게 새로운 자료형을 만들 수 있다는 장점이 있습니다.

 

[ 056 ] - 배열과 구조체 포인터를 연결해 사용하는 고수들의 개발 노하우를 배우자.

본문에서 다룬 배열과 구조체 포인터를 연결하는 방법은 일반적으로 많이 알려진 방법은 아니지만

문자형 배열과 구조체 포인터를 연결하면 메로리를 공유할 수 있다는 장점이 있습니다.

다음 장의 공용체를 사용하는 부분에서도 다루지만 배열과 구조체 포인터를 연결하는 방법은

공용체를 사용하는 방법보다 훨씬 강력한 기능을 하는 기술입니다.

한 번에 잘 이해가 안 되면 몇 번이고 배운 내용을 반복하면서 완전하게 자기 것으로 만들기 바랍니다.

 

[ 057 ] - 공용체를 사용하자.

공용체를 구조체와 혼동하면 절대 안 됩니다. 구조체는 여러가지 자료형을 그룹으로 묶는 역할을 하는 반면,

공용체는 하나의 메모리 공간을 여러 가지 자료형이 공동으로 사용하는 역할을 합니다.

따라서 공용체를 사용하면 하나의 메모리 공간을 두 개 이상의 자료형이 공유할 수 있기 때문에

하나의 데이터를 여러 가지 자료형에 맞게 사용할 수 있는 장점이 있습니다.

 

[ 058 ] - 공용체와 구조체를 함께 사용하자.

공용체와 구조체를 함께 사용하는 방법은 임베디드 프로그래밍 분야에서는 기본적인 노하우입니다.

특히 구조체를 사용하여 비트 단위로 각 항목을 설정하고 공용체로 바이트 단위로 접근하면

비트 처리와 바이트 처리를 모두 할 수 있기 때문에 임베디드처럼 비트 처리와 바이트 처리가

모두 필요한 프로그래밍 분야에서 필수라고 할 수 있습니다.

 

[ 059 ] - 고수들이 사용하는 전처리기의 기능을 알아 두자.

전처리기는 컴파일 과정 전에 일부 과정을 처리하기 위해서 실행되는 일종의 애벌빨래와 같은 기능입니다.

전처리 과정에서 처리하는 내용은 다음과 같습니다.

 

① #define

필요한 표현을 미리 정의해 둘 수 있습니다.

② #pragma

하나의 헤더 파일을 여러 소스 파일에서 사용하는 경우에 일어날 수 있는 중복으로 인한 링크 오류를 막습니다.

③ #ifdef(또는 #ifndef) ~ #else ~ #endif

컴파일과 실행되는 코드들을 그룹으로 나눌 수 있습니다. 주로 디버깅용과 릴리스용으로 나눌 때 사용합니다.

④ 매크로 함수

작은 연산을 하는 경우라면 일반 함수 대신 #define 문을 사용하여 매크로 함수를 만들 수 있습니다.

 

[ 060 ] - Make를 알아 두자.

Make는 흔히 리눅스나 유닉스에서만 사용하는 도구로 알고 있는데,

유닉스나 리눅스에서 Make 도구를 자주 사용하는 것은 맞지만

그렇다고 윈도우 프로그램에서 사용하지 못하는 것은 아닙니다.

단지 윈도우 프로그래밍을 할 때는 비주얼 C++나 비주얼 베이직이라는 통합 개발 환경에서

전용으로 사용하는 도구가 있기 때문에 굳이 Make 도구를 사용할 필요가 없는 것이죠.

비주얼 C++의 전신인 마이크로소프트 C 7.0만 하더라도 Make 도구를 사용했습니다.

리눅스나 유닉스 프로그래밍을 하려면 반드시 Make 도구와 Makefile을 작성하는 방법을 알고 있어야 합니다.

 

[ 061 ] 디버깅을 잘하는 사람이 진짜 고수다.

아무리 프로그래밍 실력이 좋은 개발자라고 해도 프로그래밍을 하면서 디버깅을 하지 않는 경우는 없습니다.

처음 프로그램을 설계할 때부터 완벽하게 설계하고 프로그래밍을 하는 사람일지라도 결국 오류가 생기게 마련입니다.

어떤 언어이든지 상관없이 디버깅을 얼마나 효율적으로 빨리 할 수 있느냐는

개발자가 어느 정도 레벨의 프로그래머인지 판단하는 데 중요한 요소입니다.

지금까지 이 책에서 다룬 수많은 프로그래밍 노하우 가운데 최고는 디버깅입니다.

디버깅을 잘하는 사람이야말로 최고의 고수라고 할 수 있기 때문에 효율적으로

디버깅을 할 수 있도록 꾸준하게 연습하기 바랍니다.

Posted by devanix