SIRINI`s Blog

life, saying, developing, . . . and so on

왜 do { } while(0); 문을 쓰는 거죠?

아... 오늘은 정말 x1000000 간만에 코딩 관련 이야기를 하고자 합니다. 짧지만 깨우친 바가 크네요. 저의 무지에 놀라고, 코딩의 깊이에 또 한 번 놀라게 되었습니다. 지도 선배님에게 배운 것을 잊지 않기 위해 블로그에 기록해 두고자 합니다.

오늘 제가 본 코드는 아래와 같습니다.

do {
    // (1) 본문 내용 (어떤 함수 내부라고 가정)
    // (2) return
} while(0);
// (3) 뒷정리 코드



언듯 봐서는 아무런 의미 없는 do ~ while 문입니다. 왜냐면 while 문의 조건이 0, 즉 false 이기 때문에 반복은 일어나지 않고 do { } 블록 안의 코드만 실행되기 때문입니다. 마치 아무 것도 없이 그냥 { } 으로 감싼 코드와도 같고, 혹은 그 마저도 아닌 그냥 코드만 작성한 것과도 같아 보입니다.

하지만 저기엔 한 가지 놀랄 만한 트릭이 있었습니다. 주로 C언어를 사용하는 환경에서 쓰는 일종의 변형된 try ~ catch ~ finally 문으로 말이죠!

리눅스의 커널 코드에 보면 매크로를 정의할 때 저 do ~ while(0) 문을 사용합니다. 이는 여러 줄의 매크로를 줄바꿈에 신경 쓰지 않고 한 코드 덩어리로 묶기 위해서 사용하는데요, 이 경우 이외에도 do ~ while(0) 문은 일종의 try/catch/finally 문으로서 사용할 수 있습니다.

위의 코드를 조금 더 수정해 보겠습니다.

do {
    // (1) 본문 내용 (어떤 함수 내부라고 가정)
    if( someCondition == 0 ) break;
    // (2) return
    return 0;
} while(0);
// (3) 뒷정리 코드
free(somePointer);
somePointer = 0;


프로그램 로직을 진행하다가 어떤 조건이 제대로 설정되지 않으면 그 즉시 break 문을 통해서 do ~ while(0) 문을 빠져 나갑니다. 그리고 (3) 번의 뒷정리 코드로 진입하여 메모리 해제나 초기화 등의 작업을 해주고, 다음 번 실행 시에도 문제가 없도록 하는 코드를 넣습니다.

만약 모든 상태가 정상이고, 코드 동작이 제대로 완료되었을 경우 코드는 (2) 번 return 문에 의해 (3) 번 코드로 가지 않은 채 바로 빠져 나갑니다. do { } 블록 안의 코드에서 간단한 키워드인 break 를 통해 즉시 로직을 이탈하여 정리 코드로 가는 것, goto 문의 효능과 동일하지만 goto 를 쓰지 않은 채 좀 더 우아하게 예외 처리를 할 수 있습니다!

C++ 이나 java 처럼 현대적인 언어에서 대부분 지원하는 try/catch/finally 와 같은 구문은 그 자체로 이해하기 직관적이고 훌륭한 문법이지만, 때론 C언어의 저러한 간단하면서도 심오한 트릭을 이용하여 코드를 구현해 보는 것도 좋은 습관일 것 같습니다. 어찌보면 남들 다 아는 거 뒤늦게 뒷북 친 걸 수도 있지만... 그래도 이 신선한 깨달음의 기쁨을 오래 느껴보고 싶네요. ^^

정말 C언어는 전설인 것 같습니다. 처음 만난 지 나름 시간이 좀 흘렀음에도 아직도 새로운 모습을 발견하네요. 스스로의 부족함에 부끄럽습니다... ^^;;;

Levitra Dosi Viagra For Men <a href=http://bestlevi.com>viagra cialis levitra combo packs</a> Buy Metformin No Persciption
Leave a comment here!
이 곳에 이름(닉네임)을 입력하세요
이 곳에 글 수정/삭제를 위한 비밀번호를 입력하세요
이 곳에 이메일 주소를 입력하세요 (선택)
이 곳에 웹사이트 주소를 입력하세요 (선택)