2009/05/21 13:55

문자열 뒤집기 떡밥.. 덥썩~ 물고 몇 마디 더 붙여보자면... eNg + iNe +eEr

어제부터 계속 IT 밸리에 꾸준히 문자열 뒤집기에 관련된 글들이 올라오고 있다. 시작은 우리나라의 컴공 교육에 대한 생각이 들게 하는 면접이라는 글이었다. 그러면서 뒤이어 C언어가 어떻고, 포인터가 중요하고, 문자열은 메모리를 직접 다루는 흔치 않은 경우기 때문에 중요하고, 전산과 대학원을 나왔다는데 이것도 못 하면 곤란하다는 둥 많은 얘기들이 오가고 있다. 그리고 꽤 많은 분들이 직접 코드를 순식간에 짜서 올려주고 있다. 

사실 나는 저 첫 포스팅에 나온 문자열 뒤집는 함수를 만들라고 했을 때 순간적으로 수 많은 고민을 했다. 내가 한 고민들 몇 가지만 소개 하려고 한다.

1. "문자"열을 뒤집으라고? 그럼 2-byte 문자(한글 같은 것)들도 고려해야 하나? 그렇게 되면 홀수면 어떻게 하지? 특수 문자는...?
2. 입력을 보존해줘야 하나? 그럼 새로 메모리 할당하고, 그에 상응해서 reverse_done(xxx) 같은 해제 함수도 만들어야겠지.
3. 사실 조금 더 실용적이 되려면 length도 받는 것이 좋겠지?
4. 입력을 보존하고 새로운 것을 넘겨준다면, 그냥 전역으로 포인터 하나를 두고 쓸까?
5. 아, 4번처럼 하면 reentrant하지 못하니, 안될듯.. 아니면 그냥 reverse_r() 하는 식으로 두 버전을 만들어야 하나..?

그런데 이런 고민들을 하다보니, 이거 밑도 끝도 없이 고려할 것이 늘어나는 것이다. 물론 처음 글에 있는 면접관의 입장에선 이런 고민을 하라고 던진 질문이 아니었을 것이고, 이 문제가 논란이 된 것도 좀 삽질스럽게 대답한 사람의 탓이 크겠지만, 정말 제대로 누군가 라이브러리 안에 저런 함수를 넣겠다고 생각하면(아니.. 잠깐, 원래 표준 라이브러리에 뒤집기가 있던가? 가물가물...) 저런거 다 고민하고 만들어야 할 것이다. 안 그러면 갖다 쓰는 사람만 골치 썩을테니 말이다.

그런 의미에서 양파(누)님이 올린 내가 이래서 개발일 하기 싫어 -_-에 간단히 언급한 방법이 가장 좋아보인다. 물론 C적이지 못하기에 C언어로 짜라고 했던 질문의 답은 될 수 없겠지만, 입력 문자열을 처음부터 읽으며 한 "문자"(not one byte, but one character) 단위로 읽어서 스택에 넣어두고, 하나씩 pop해서 새롭게 할당된 문자열에 넣어서 주는 것이 좋을 것 같다. 논리적으로도 아무 문제가 없고, 추후 디버깅에도 유리할 것이고, 더 해서 아무래도 input을 manipulate해야 하는 함수는 영 마음에 안 드는 일이니 말이다. 

사실, 그 질문을 받은 면접자는 어설프게 아는 C로 굳이 짤 것이 아니라(사실 이력서에 C언어를 잘 안다고 했으니 빠져나갈 길이 없었겠지만) 그 상황에 대한 논리적인 알고리즘을 설명하는 것이 훨씬 나았을 것이다. 아니, 사실 저렇게 논리적으로 설명할 수 있었다면 당연히 그것을 일부 에러가 있더라도 C언어로 옮길 수 있었을테니, 어차피 저 면접자는 그날 면접에는 붙을 운이 아니었나 싶기도 하다.

어쨌든, 써니(형)님이 S/W 개발에 있어서 기본 자질이란...에서 말한 것처럼 C언어로 문자열 뒤집기 못한다고 해서 사람 병신 취급하지 말자. 저거 바로 즉석에서 백점 답 못했다고 개발 못하는 것도 아니고 병신도 아니고, 저거 제대로 못 풀었다고 저걸 순식간에 풀어내는 사람보다 개발을 못한다는 보장도 없고 소프트웨어 개발 및 연구에 대한 지식이 부족하다는 것도 아니니까 말이다.

덧. 아, 이건 정말 몰라서 그러는데, 표준 C에서 char가 1바이트가 아니라 2바이트인 와이드 타입으로도 되게 컴파일 할 수 있나요? 아니면 혹시 새롭게 추가된 data type이 있나요? 궁금합니다 :) 정말 한글이 (거의) 전혀 안 쓰이는 환경에서 개발만 해봐서 한글 처리 및 multi-byte character는 도통 감이 안와요.

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://engineered.egloos.com/tb/2323885 [도움말]

덧글

  • 가짜집시 2009/05/21 14:26 # 답글

    wchar_t 를 쓰세요.

  • 자라 2009/05/21 21:39 #

    아, 그래요. 이거였군요! 감사합니다.
  • 써니 2009/05/21 15:38 # 답글

    큭... 가짜집시님이 간결히 답을 주셨네요.
  • 자라 2009/05/21 21:39 #

    그러게요 :)
  • 양파 2009/05/21 19:08 # 답글

    아흑. 갑자기 누님이라니까 막 가슴이 따뜻해졌어요 ;ㅁ;
  • 자라 2009/05/21 21:39 #

    사실 모르시겠지만, 예~~~전 포스팅 하나에서도 몰래 "누님"이라고 부른 적이 있답니다.
  • 써니 2009/05/21 23:01 #

    저는 그 포스트를 기억합니다. ^^;
  • 고스 2009/05/21 20:16 # 답글

    헉 전 wchar_t라는걸 처음 보는거 같네요.. -_-
    c로 밥 먹고 사는데...

    실무에 들어와서는 c 라이브러리를 써본적이 없군요;;
  • 자라 2009/05/21 21:43 #

    저도 한동안 밥은 C언어로 지어 먹었는데, UI가 거의(아예) 없는 것을 만들다보니 사실 multi-byte character 같은 건 딱히 고민해 본 적이 없어요. 사실 single-byte character건 multi-byte character건 이미지던 동영상이던 음성이던 모든 것은 사실 bit일 뿐이니 말이죠 :)
  • 세시링 2009/05/21 20:52 # 답글

    C와 C++로 먹고 살다가 한국에 돌아와서 MFC를 하고 있는데 이건 완전 신세계군요 ㅡㅡ 머가 이렇게 많은지..

    저도 머 뛰어난 개발자는 아니지만 이 일을 시작한 이상 평생 공부하며 살아야 한다고 느껴서; 열심히 공부하고 있습니다.
    개인적인 생각이지만 대학교 4년동안 배운거보다 실무에 투입돼서 프로젝트 진행하면서 1년간 배운게 훨씬 더 많았던 것 같습니다 -_-; 그저 공부하는 자세가 중요한거겠죠.
  • 자라 2009/05/21 21:44 #

    찬성입니다. 공부 안 하면 남을 수 없는 분야에 발을 담군 것 같아서 일켠 좋기도 일켠 두렵기도 하네요.
  • 네코 2009/05/21 22:03 # 답글

    2byte 멀티바이트 캐릭터는 unsigned short 입니다.
    wchar_t도 unsigned short형을 typedef로 정의해 둔걸 쓰는거죠.
    MFC에선 WCHAR로 정의해서 쓰입니다.
  • kurome 2009/05/22 12:15 #

    마찬가지로 WCHAR 가 wchar_t 를 typedef 한 것이죠..
  • highseek 2009/05/21 22:18 # 답글

    MFC에서 저는 TCHAR를 씁니다. 귀찮거든요 ( ..)
  • 승네군 2009/05/21 23:52 # 답글

    음? 멀티 바이트라는건 utf8같은거 이야기 하는거 아닌가요? 지 맘대로 사이즈가 늘었다 줄었다 하는거...

    wchar_t는 고정 2바이트 아닌가요? utf16...

    음.. 잘못알고 있나???
  • 써니 2009/05/22 00:17 #

    '지맘대로' 라는 표현을 쓰다니.. 엄연히 규칙이 있거늘, 이러니 승네군 네가 무서워...
    utf-8 코드는 전송용으로 사용하고, 프로그램 내부에서는 주로 고정된 UTF-16을 사용한다.

    아유 제발 말 조심 좀 해라... 학교 망신 시킬 일 있나...
  • kurome 2009/05/22 12:17 #

    ascii 기반에 한글을 사용할 땐 multibyte 가 될 것이고 euc-kr 같은.. 2byte 문자죠

    utf-8 은 영문은 1byte 그대로 한글 같은 경운 3byte unix 계열쪽에서 사용하고

    ucs2 가 ms 쪽 windows에 주로 쓰죠.. utf-16과는 약간 또 다릅니다.

  • 스팟 2009/05/22 00:38 # 답글

    여태 본 포스트 중에 가장 댓글이 많다지요;;;;
  • 퓨리넬 2009/05/22 00:57 # 답글

    예전에 2학년 1학기 과목의 텀 프로젝트 과제로 휴대폰 문자입력을 구현하라고 나왔었습니다.
    C++에서 한글 입력 처리를 위해 비주얼 스튜디오 6.0에서 작업을 하려다 뭔가 막 복잡해서 DEV-CPP로 작업했던게 생각나네요.
    C나 C++에선 한글에 대한 처리가 귀찮아요.(특히 C는 문자열 처리가 여러모로...;;)

    요즘에 저 '우리나라의 컴공~' 포스팅을 보면 '뜨끔'하는 부분도 있고 '설마 정말 저럴까?' 하는 부분도 있고...결국은 내가 잘되어야 하는게 중요하다!! 결론이...ㅡㅡa
  • kurome 2009/05/22 12:18 #

    widechar 쓰면 한방 해결.. 끝... 괜히 유니코드로 넘어가는게 아ㅣㄴ죠
  • 오린간 2009/05/22 01:43 # 답글

    우왕 리플들을 보니 전부 제가 여태까지 고생했던 모든 수순이 다 있네여.
    wchar얘기에서 TCHAR이랑 MFC랑 c/c++에 고민과 utf8과 멀티바이트 등등

    제가 소발로 쥐잡기 식으로 파봤는데, 제 기억이 맞다면
    wchar은 2바이트고 아마 위 리플중 하나에서처럼 short같은것을 이용하는거 맞을 겁니다.
    그리고 tchar은 #ifdef 같은걸 사용해서 상황에 맞추어 wchar와 char중 하나로 변화될겁니다.
    소스가 char형태에 따라 알아서 컴파일되게하는거죠. 그러니까 tchar쓰면 좀 고수같아보일지도...
    그리고 strcpy나는 scscpy 인가 머더라 . printf는 wprintf 라든가. 대응하는 함수가 각각 존재하죠.
    strcat이 scscat인가 하고....
    아무튼 저는 tchar은 아직 안써봐서 하수 인증 ㅠㅠㅠ

    utf8은 전송용이라죠. 그러다 핵사코드처럼 표현한걸 텍스트로 표현한것을 다시 바이너리로(머라는거야)
    바꾸고 뻘짓하는게 escape라나 머라나 하는 함수로...저도 잘은 모름. 쥐발로 소잡듯이(머라는거냐!!)
    공부해서.

    거기에 유니코드라는거 나오면서 c에서 L"abcd" 라는 표기법 나오고 하면 진짜 열받죠.
    그리고 유니코드2.0 이라나 머라나 ㅅㅂ ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
    조합형과 완성형과 초중종분리형까지 다루다 보면 머리가 핑 돌아요.

    mfc는 욕이 나와요. 진짜 욕이 많이 나와요. 보면서 이딴 구조로 라이브러리를 구성하다니 놀라워!
    하고 감탄했죠. 그래도 배우다보면 객체지향과 재사용성에 대해 좀 알게되서...


    아우 갑자기 고생했던 과거가 막 떠올라요 ㅠㅠㅠㅠㅠㅠㅠ
  • kurome 2009/05/22 12:20 #

    언제쩍... vs 를 사용하시는진 모르겠지만... 2005 부터는 그런 생각 안드실 겁니다....
  • 오린간 2009/05/22 16:48 #

    2005쓰고있습니다. ㅎㅎ 지금은 쫌 살만합니다.
    근데 6에서 작업했떤 조합형코드에 최적화된 코드들이 말썽을 일으키고 있습니다.
  • 승네군 2009/05/22 09:20 # 답글

    mfc 정말 잘만든 녀석 아닌가요? 제 수준에는 대단해 보여서...;
    tchar는 표준은 아니지만, define의 승리라고 해야할까..

    참, 보다보니 c+에서 쓰는 std::string도 wide타입이 있더군요. (타입이라고 하는게 맞으려나...)

    제가 utf8및 utf16은 정말 잘 이해를 못해서 그렇습니다.
    해당부분에 대해 헛소리한건 좀 이해좀 해주세요. 철모르는 애가 헛소리 한거로 쳐 주세요 ㅎㅎ : )
    (그리고 혹시나, 자라나는 새싹에 물좀 주고 싶으시다면, 관련 url하나 -초심자가 보기 쉬울정도롷ㅎ- 던져주시면 감사하겠습니다. ^^)
  • kurome 2009/05/22 12:22 #

    wstring 이 있죠 #include <xstring> 하면 쓸수 있습니다.

    string 과 차이는 없고 (어차피 클래스가 같으니..) template 에서 char 냐 wchar_t 정도 차이겠죠..
  • 자라 2009/05/22 17:17 # 답글

    와... 블로그 연지 4년만에 제 포스팅에 이렇게 댓글이 달리는것은 처음 봐요 ㅠㅠ 댓글 리스트만 봐도 배울 것이 참 많다는 생각이 절로 드는군요.

    승네군님, 써니님, kurome님, 스팟님, 퓨리델님, 오린간님/ 덧글 감사합니다. 하나 하나 달아야 하는데, 제가 잘 몰라서 쉬이 껴들었다가 망신 당할 내용들(특히 한글 및 다국어 처리 관련 부분들)이 있어서 이렇게 하나로 묶어서 감사하다는 말로 끝내야겠네요 :)
  • 우주괴물 2009/05/22 18:49 # 답글

    utf-32 가 기본인 요즘 unix gcc에선 wchar_t 는 4바이트 입니다. ㅋㅋ
    2바이트로 바꾸는 옵션이 있긴 합니다.
  • 써니 2009/05/22 22:59 #

    오~ 몰랐던 정보 감사합니다. utf-32도 새로운 대세인가요?
  • 승네군 2009/05/23 00:07 # 답글

    조엘 블로그 책에 보면, 4바이트는 너그러운 텍사스(맞나?) 아저씨들도 참지 못할만큼 메모리 낭비가 많다고... 뭐 비슷한 언급이 있었던걸로 압니다.

    제가 보기에도 4바이트는 좀 심하게 낭비...;;
  • 자라 2009/05/23 00:18 # 답글

    우주괴물님, 써니님, 승네군님/ 사실 처음부터 C에 char 대신 byte라는 이름의 변수형이 있었으면 덜 헷갈린텐데 말이죠. 사실 처음에 1바이트를 char로 잡아버린 바람에 wchar_t(wide character)라는 요상한 변수형도 생기고 하는군요. utf-32이라.. 글자 하나에 4바이트면 슬슬 이쯤에서 서야 되는거 아닌가 싶군요..
덧글 입력 영역