벌써 몇 년이 지난 이야기다. 교육을 받던 분이 굳이 C언어를 배워야 할 필요가 있냐고 물어보셨다. 그에 대한 개인적인 생각을 적어보도록 하겠다.

(이 글은 컴관련 전공자에 한하여 유효한 이야기이다. 비전공자라면 굳이 꼭 C언어를 배울 필요는 없다. 물론 개인적인 공부 방향이 컴관련 하부구조이거나 혹은 나중에 컴관련 대학원을 진학하려면 C언어 공부는 필수다.)



1. 체계화된 프로그래밍 순서를 익힐 수 있다.

모든 프로그래밍은 기본적으로 연산에 필요한 데이터를 메모리에 적재(load)하고 일련의 계산 결과를 저장(store)하게 된다. 이 후에 결과 데이터를 특정 위치로 전송하거나 복제하기도 한다. 이런 기본적인 계산 단위가 논리적으로 분기되고 복합적으로 연결된 것이 바로 프로그래밍이 되겠다.


그러나 가장 중요한 연산의 기본 단위는 읽고 계산하고 쓰는 작업이라는 점은 변하지 않는다.


프로그래밍 언어의 발전은 바로 이 읽고 계산하고 쓰는 작업을 편리하게 하거나 빠르게 하는 목적으로 발전해왔다. 편리함을 목적으로 하는 인터프리터 언어나 자바와 같은 언어들은 언어적인 측면에서 위 작업들을 간소화시켜준다. 예를 들어 A라는 위치에 있는 메모리를 B라는 변수로 복사한다고 치자. 몇몇 인터프리터 언어는 간단하게 '=' 기호로 이를 가능하게 한다.


# python같은 인터프리터는 다음과 같이 선언된다.
# B에 A를 저장한다.
B = A


위와 같이 인터프리터 언어는 한 줄로 메모리를 읽을 수 있다. 그러나 한 줄의 코드에는 많은 내용이 함축되어있다. 예를 들어 B 변수에 메모리가 할당되어있지 않다면 할당해주고, 변수의 길이를 체크하여 부족하다면 재할당해주는 것도 포함된다. 또한 변수의 타입이 숫자인지 문자인지 변환하는 것도 가능하다.


그러면 위와 똑같은 작업을 C언어로 한다고 치자.

먼저 B의 메모리의 할당 여부 및 크기를 확인해야 할 것이다. 만일 작다면 reallocation으로 overflow를 막아야 하기 때문이다. 이를 위해 realloc을 사용해야 하며, 메모리 크기를 내부 로직에서 관리해야만 한다.


그 다음은 뭘 또 해야 할까? 음... A의 타입이 문자열인지, 문자열로 표시되는 숫자인지 다양한 검사를 해야 하는 경우도 있다. 데이터 오류를 막기 위해 여러 복잡한 검사를 해야 할지도 모른다. 이를 위해 정규표현식(REGEX)이나 바이트 단위로 데이터를 읽어야 하는 일까지 생길 수 있다.


결국 "B=A"의 한 줄로 표현되는 간단한 인터프리터 코드가 C언어에서는 수십줄이 넘어가게 된다는 것이다. 이 과정에서 버그도 심심찮게 일어날 수 있다. 이렇듯 인터프리터는 복잡한 작업을 간단하게 해주는 장점이 있다.


하지만 인터프리터 언어는 장점외에 단점도 분명히 존재한다!!


장점은 위와 같이 편리한 코딩, 즉 생산성이 높다는 점은 확실하다. 단점은 그와 반대로 너무 편리해서 어려운 프로그래밍을 못하게 된다는 점이다. 인터프리터 언어와 같이 언어가 대신해주는 작업이 많을수록 프로그래머는 쉬운 것에 익숙해지고 성능을 높이기 위해서 해야 하는 메모리, 연산기법들에 대해 둔감해지게 된다.


좀 멋진 말로 포장하면 transparency 때문에 하부 구조를 제대로 이해하지 못하게 된다는 것이다.


왜 메모리의 데이터 타입이나 경계를 검사해야 하는지? 즉 오버플로우를 신경써야 하는지 생각하지 않아서 편리하겠지만 그와 반대로 제한적인 메모리와 자원으로 프로그래밍 하는 환경에 적응하지 못할 수 있다는 점이다. 더군다나 aligned memory나 page 단위등을 이해해야 하는 raw data를 다루다보면 적응하기 힘들어진다.


또한 인터프리터와 같은 언어는 데이터를 옮길 때마다 메모리의 검사와 재할당 등이 발생하는 경우가 많으므로 생각보다 오버헤드가 커지기 십상이다. 이 때문에 일정 성능 이상 퍼포먼스를 올릴 수 없는 구조적 문제도 따라온다.


물론 고급 레벨의 프로그래밍이 전혀 필요하지 않은 프로그래머라면 방금 한 말은 무시해도 된다. 하지만 전문적으로 프로그래밍을 하려고 한다면 언젠가는 고급 레벨을 접근해야만 하고, 그것은 메모리, 하드웨어에 대한 지식이 필요하다는 것을 의미한다.



2. 왜 어려운 프로그래밍 언어를 알아야 하는가?

C언어는 어려운 프로그래밍 언어다. 물론 과거에 사용되던 기계어나 어셈블리어보다는 쉽겠지만 평균적으로는 어려운 언어다. 이에 비해 다른 쉬운 언어들은 빠르게 익힐 수 있지만 덜 고민하게 되고 추상화된 프로그래밍 모델로 인해 쉬운 인터페이스에 집착하는 프로그래밍 스타일을 만들게 된다.


하지만 추상화나 쉬운 인터페이스에만 병적으로 집착하면 성능은 뒷전으로 내팽개치게 되는 성향이 생길 수 있기 때문에 조심해서 접근해야 한다. 이런 말을 하면 성능 문제는 하드웨어의 발전으로 커버할 수 있다고 말하는 사람도 있지만 비용 대비 성능으로 볼 때 단순히 하드웨어의 발전만으로 커버되지 않는다. (하드웨어의 발전이 더뎌진 것도 하나의 이유가 된다.[2])


이런 연유로 인해 추상화되지 않은 프로그래밍 언어, 사람보다 컴퓨터가 어떻게 작동하는지 알 수 있는 언어와 컴퓨터 구조를 알아 둘 필요가 있는 법이다. [각주:1]


물론 십수년이 지나면 이런 환경도 사라지고 새로운 패러다임이 나올 지도 모르겠지만, 아직까지 C언어가 쌓아 올린 컴퓨팅 환경은 견고하고, 컴퓨팅 환경을 이해하는데 있어 C언어를 대체할 만한 것도 없기 때문에 C언어는 꼭 배워두면 좋은 언어라고 생각된다. (C언어를 배운 뒤에 다른 언어를 배워두는 것은 강력 추천한다. 개인적으로 파이썬은 정말 매력적인 언어다.)

  1. Memory Hierarchy, Memory Wall and Memory Mountian. http://bart7449.tistory.com/224 [본문으로]
저작자 표시
신고
  1. Denial 2012.08.14 10:08 신고

    최근 파이썬을 공부하고 있는데 정말 매력적인 언어인듯해요. 혹시 괜찮은 파이썬 커뮤니티 아시나요?

    • sunyzero 2012.08.15 00:00 신고

      파이썬은 워낙 간단해서 그런지 전문적인 커뮤니티가 발전하지는 않는 것 같습니다. 왠만한 것은 오피셜 사이트에도 대부분 있는 것 같고요 ^^

    • 터프 프로그래머 2013.03.19 22:56 신고

      너무 늦은 답장에 보실지 모르겠지만
      페이스북에 파이썬 사용자 그룹이 있습니다.
      http://www.facebook.com/groups/pythonkorea/

    • sunyzero 2013.03.20 14:33 신고

      @JuHong 나중에라도 smart dolphin님이 보시면 좋아하실겁니다.

  2. 메리앤 2012.08.29 20:45 신고

    이 분야에 대해 잘 모르지만 정말 배워보고 싶긴 합니다... ㅜㅜ
    그리고 html에 대해서도 능숙하게 익히고 싶어요, ^^;
    잘 보고 갑니다. 좋은 시간 되세요.

  3. TY 2013.03.19 22:34 신고

    와 제가 하고 싶은 말이 일목요연하게 정리되어있는 글이에요. 너무 많은 사람들이 물어봐서 맨날 대답할 말이 없었는데, 이렇게 설명해줘야겠어요! :) 블로그 링크 좀 담아갈께요 ^^

  4. yh 2013.12.27 14:55 신고

    C언어가 python으로 작업하는 일보다 '어려운' 프로그래밍이라 말씀하신건 어떤 한 상황(제한된 머신 환경이나 마이크로 최적화가 필요한)에 국한된 시각 같습니다.
    python을 쓰는 프로그래머들은 비교적 쉬운 작업을 하는 것일까요? 저는 어떤 작업을 하느냐에 따라 어려운 문제(집중할 대상)가 다르기 떄문에 C로 얻는 마이크로 최적화보다 생산성을 택할 수 있다고 생각하지 어느쪽이 어려운 프로그래밍이다라고 말하긴 어려운것 같습니다.
    몇천대의 장비를 관리하고 데이터 분석이나 머신러닝을 돌리는것도 python이나 java등을 쓴다고 해서 쉬운건 아니지 않겠습니까 ^^
    참고로 해외 python 커뮤니티는 규모가 엄청납니다. 각종 라이브러리 개발이나 다양한 인터프리터(pypy등) 개발, 함수형 언어 요소나 최신 언어 발전방향에 대한 토론도 상당히 활발하게 이루어지는 커뮤니티가 python 커뮤니티라서요..

    좋은 글 잘 읽었습니다만 글쓴이님이 놓치고 계신 포인트가 있는것 같아 고민끝에 댓글을 달아 봤습니다 ~

    • sunyzero 2013.12.28 18:18 신고

      좋은 의견 감사합니다.

      yh님이 지적해주신 것에 대한 제 생각은 언어의 복잡도와 업무의 복잡도는 다르다고 봅니다.
      예를 들어 몇 천대의 장비를 관리하고 데이터 분석을 하는 것은 업무의 복잡도이지 언어의 복잡도와는 다른 이야기겠죠.

      업무가 복잡해지는 것은 어떤 언어를 사용하든 그 업무 자체가 쉬워지지는 않는다고 봅니다.

      그리고 파이썬에 대해서는 윗 글에 썼다시피 매력적인 언어라고 생각합니다. 생산성도 높죠. 데이터 분석을 하는데 있어서 C보다 파이썬을 쓰는 것은 당연히 효율적일 것입니다. 이를 부정하는 글이 아니라, 본 글은 운영체제나 하드웨어 시스템을 이해하기 위해서는 시스템을 만든 언어를 이해하는 것이 필수라는 것을 알리기 위해서 입니다.

      만일 C/C++언어로 구구단만 짜는 경우라면 파이썬을 배우는 게 백 배 나을 거라고 생각합니다.

      그리고 저도 파이썬 좋아합니다. ^^

  5. 테디베어 2016.02.13 17:08 신고

    컴퓨터 비전공이며 백지상태입니다.
    얼마전까진 php의 p자 즉 < ? 이 무엇인지도 몰랐습니다.

    ------------------------------------------
    1차 학습목표
    *파싱 및 저장 그리고 재가공
    *리눅스 서버관리
    ------------------------------------------

    (문의1)
    1차 학습목표를 달성하기위해 php,파이썬 및 그외의 언어중
    상대적으로 좀더 효과적인 언어는 무엇이 있을까요?

    (문의2)
    문의1에 추천해주신 언어에 대한 책 추천 부탁드립니다.(책두께는 두려워하지 않습니다.)

    (문의3)
    쓰신글중 "파이썬은 인터프리터 언어로 편리한 코딩, 즉 생산성이 높다는 점" 문구를 보았습니다.
    파이썬 책 추천 부탁드립니다.

    • sunyzero 2016.02.12 21:41 신고

      php는 웹 전용에 가깝습니다. 그냥 실행할 수도 있지만 거의 대부분은 웹프로그래밍용으로 사용합니다.

      파이썬은 현재는 파이썬 완전 정복이라는 책이 가장 낫습니다. 다만 라이브러리 사용법이 많아서 책이 두꺼우니 앞 부분을 빠르게 보고 필요한 라이브러리 부분을 목차에서 찾아서 보는 방식이 좋습니다.

  6. 테디베어 2016.02.13 17:08 신고

    친절한 답변 감사합니다..

    그런데 추천해주신 "파이썬 완전 정복이라는 책"을
    온라인 서점 및 온라인 중고서점에서 검색해도 나오질 않습니다.

    해당책을 판매하는 사이트 좀 부탁드려봄니다.

  7. 2016.10.05 15:36 신고

    서점가서 c기초플러스를 봣는데 모르는 용어가 너무 많아 읽기에 지장이 있네요ㅠ 구조화프로그래밍이라던지 모듈이라던지 비전공자가 봣을땐 좀 그런데 차라리 윤성우님 c언어책을보고 c기초플러스를 다보고 난 후 원서책을 읽는게 좋은거같은데 괜찮나요? 책에 오류가 있긴하겠지만 윤성우 인강을 들으면서 하면 오류는 잡아줄거같은데

    • sunyzero 2016.10.05 22:52 신고

      비전공자라면 대학원을 컴쪽으로 진학하는게 아니라면 C언어 공부를 비추천하는 편입니다.
      (비전공인 경우에는 제대로 배우기도 어렵고, 배워도 써먹을 곳이 별로 없습니다. 따라서 공부하는데 들인 시간 대비 효용이 작습니다.)

      결론 : 비전공자에게 C언어는 그다지 좋은 프로그래밍 언어가 아닙니다.

티스토리 툴바