본문 바로가기
C++ 200제/코딩 IT 정보

윤성우의 열혈 C 프로그래밍 별로야? C언어 하지마?

by vicddory 2019. 8. 23.

재밌는 글이 있어서 발췌합니다. 제가 쓴 건 아니고 디씨인사이드 치킨배달님이 윤성우의 열혈 C 프로그래밍에 관해 쓴 글입니다.



먼저 저자는 자바로 프로그래밍 입문했고, C언어만 7년 했으며 현재 프로그래머로 일하고 있음.

물론 일을 하는 곳에서 C를 사용하진 않지만 저만큼 C를 했을 정도로 C에 대한 애정이 많음.


일단 나는 프로그래밍을 처음 배우는 사람이 C언어 책으로 입문을 하는 것부터 추천하지 않음.

trust the programmer

가장 먼저, C언어의 정신 중 하나인 "trust the programmer" 이것만 들어보면,


프로그래머를 믿는대!!

와 이만한 언어 어디 있느냐??

진짜 좋은 언어네.


이런 생각을 할 수도 있는데, 저 뜻은 모든 책임을 프로그래머한테 떠넘긴다는 것.


즉, C보다는 비교적 현대적인 언어들의 경우 메모리 관련 문제들을 모두 컴파일러가 처리해줌. 하지만 C의 경우에는 포인터라는 개념으로 메모리 관리하는 것을 프로그래머가 할 수 있게 되어 있어.


물론 개발자가 메모리를 관리 함으로써 임베디드와 같은 분야에서는 극한까지 최적화를 시킬 수 있지만, 초보자한테 그런 일이 필요할까?


초보자한테는 속도보다는 편의성이 필요해.


저자 윤성우 프로필저자 윤성우 프로필


C는 쉬운 언어도 아니고, 현대적인 언어도 아니야

C언어가 훌륭하지 않은 언어라고 생각하지는 않아. 하지만, C는 현대 프로그래밍 언어 시장의 주 패러다임의 변화를 따라가지 못하고 있어.


이는 C의 정신 중 하나인 C를 작게 유지하자는 개념 때문인데, 그 때문에 C로 입문하게 될 경우 현대 언어들을 배우게 될 때 큰 혼란을 야기시킬 수 있어.


C의 문법이 발전하고 표준이 개정되어 C++11이 나왔으니 C도 충분히 현대적인 언어 아닌가요? 라고 반박할 수 있는데 11년도에서 기술이 멈춘 것도 아니고, 그 당시에도 타 언어에서는 당연히 제공해주는 것이 앞서 언급한 C의 정신 때문에 빠져있는 경우가 많았어.

또 위의 정신 때문에 지원하는 기능이 적어서 문법 자체는 단기간 익힐 수 있지만, 기능이 적다고 쉬운 언어라고 할 수 있을까?


프로그래밍이라는 것이 기능이 적다고 그 기능만 사용하는 것은 아니야. 없으면 만들어서 사용해야 하고, 그런 기능을 구현할 때 C 경우에는 수많은 트릭과 함정이 존재해서 이 트릭을 모를 때 독이 될 수도 있어.


C언어가 운영체제를 만들기 위해 만들어진 언어인 만큼 운영체제나 low level 혹은 메모리 개념을 익힐 때는 크게 도움이 돼.


하지만 특별한 목적이 없으면 굳이 지금 상황에서 저렇게 불친절한 C언어 책으로 입문을 할 필요가 없다는 게 내 의견이야.


프로그래밍 예제 많은 책이 좋아요프로그래밍 예제 많은 책이 좋아요


C++

혹시나 C++ 배우기 전에 C 배워야 하는 거 아닌가요? C++에서는 C의 내용을 모두 담고 있는데요? 빼애액 할 거면 그냥 이 글에서 나가.


C99가 업데이트되면서 C++과 C는 서로 다른 길을 걷기 시작했고, C++에는 없지만 C에는 있는 개념들도 있어.


이제는 더는 C가 C++에 포함되어 있지 않다는 거지.



이건 C++을 만든 사람이 C를 먼저 배운 다음 C++을 배울 필요가 없다고 말했던 건데, 만약 C++ 입문서에서 C를 이미 알고 있다고 생각해 기초 개념을 다 빼버리면 그 책이 잘못된 거야.


요즘 C++ 입문서는 C랑 C++이랑 다르다고 먼저 깔고 들어가거든.


그리고 만약에 C를 그래도 배우고 싶어. 그러면 윤성우 열혈 c 프로그래밍으로 입문하지 마.


쉬운 책인 건 알아. 그래서 윤성우의 열혈 C 프로그래밍이 베스트셀러고 인기도 많이 있는 거 알아. 너는 책 써본 적이나 있냐? 이런 말 할 수도 있는데 내가 직접 강의 pdf 파일 만들어서 과외해본 경험도 있고, 기회가 생겨서 아는 분 센터에서 프로그래밍 강의를 한 적도 있어.

이제부터 열혈 C언어 책의 문제점을 설명해보려고 해.


위에서 내가 적은 글들을 다 이해했으면 프로그래머가 되려는 사람이 굳이 C로 입문할 필요가 없고, C로 입문을 한다면 "잘" 입문해야 한다는 것을 알았을 거야.


하지만 윤성우의 열혈 C 프로그래밍은 C를 "잘" 입문하기에는 문제가 많아.


1. Visual Studio 한정의 코드를 작성

윈도우에서는 사실상 C를 버렸어. 비주얼스튜디오에서도 C를 지원을 안 해. C++ 언어로 들어가서 파일 확장자명을 .c로 바꾸면 되는데요?


그래 되는 것처럼 보이겠지 c++은 ansi c를 컴파일할 수 있으니까. 하지만 앞에서도 말했듯이 C99부터는 c++과 다른 길을 걷기 시작했고 비주얼스튜디오에서 지원하는 c는 ansi c를 포함해서 c++99, c++11에서 c99, c11이랑 겹치는 부분만 지원을 해줘.


즉, c의 모든 개념이 들어가 있지 않을뿐더러 내가 지금 쓰는 게 c에서 지원을 해줘서 쓰는지 c++에서 지원을 해줘서 쓰는지를 알 길이 없다는 뜻이야.


하지만 열혈 C의 경우 이런 상황을 다 배제하고 비주얼스튜디오에서만 돌아가는 코드를 적어.



2. 잘못된 개념 예제

솔직히 지금 다 생각이 안 나서 그러는데 하나는 확실히 기억이 나.

call by reference는 c에 없는 개념이야.


하지만 윤성우의 열혈 C 프로그래밍에서는 포인터를 통해 swap하는 함수를 "call by reference"라고 소개하고 있어. 이 때문에 네이버 블로그에 c call by reference라고 검색을 하면 너무 당연하게 c에 call by reference가 있다는 듯이 강좌를 적어놨던데 그럼 그게 다 틀린 거냐고?


응 맞아 그 글들은 다 잘못된 거고, 그 글을 적은 사람들은 C의 포인터 개념에 대해서 다시 공부할 필요가 있어.


이 글은 c의 포인터 개념을 적는 글이 아니기 때문에 이 부분에 대해서는 링크만 걸고 넘어갈게.



저 글을 요약하면 데니스 리치가 c에 call by reference가 없다고 말을 했다는 거야.


굳이 C언어 책으로 입문할 이유가 없으며 C를 입문해야 할 경우의 특수한 상황이면 C를 잘 배워야 하는데.


잘못된 개념을 적힌 책을 왜 프로그래밍 갤러리에서 추천을 하는지 알 수 없어서 글 적는데, 솔직히 C 입문서라면 C의 표준에 대해서 한 번쯤은 설명해주고 들어가야 한다고 생각해.


(인용 끝)


음 ... 메모리 관리를 컴파일러가 한다는 건 오타겠죠?

저도 책 쓰다가 완전히 잘못된 글을 써서 블로그에 해당 파트만 새로 올린 적이 있습니다.



어쨌든, 디씨인사이드에 올라왔던 글의 요지는, 굳이 입문용으로 C언어를 배울 필요는 없고, 배우더라도 윤성우의 열혈 C 프로그래밍을 배울 필요는 더더욱 없다는 겁니다.


저는 그 책을 본 적이 없어서 뭐라 할 말은 없네요. 다른 분의 블로그에 올라온 댓글을 소개하며 글을 마칩니다.


방문자

사람들이 이 글을 읽고, C언어는 할 필요 없다고 오해하는 일은 없었으면 합니다.


이 글의 요지는 C로 입문할 필요가 없다는 것이지 C언어를 하지 말란 이야기가 아님. 개발자로서 C언어를 한 번도 안 하고 지나간다는 것은 너무 많은 것을 포기하는 것으로 생각해요.


특히 시스템구조와 운영체제를 공부할 필요성을 느끼게 된다면 그 전공을 배우기 전에 반드시 씨언어를 해보고 갔으면 합니다.


저랑 똑같은 생각이네요.

저도 요즘 초보들이 C언어로 입문할 이유는 없다고 생각해요. 파이썬이 더 좋을지도 몰라요.


c언어 재밌는 예제c언어 재밌는 예제


관련 글

어려운 C언어 포인터 예제 4개로 마스터하기

C언어와 C++ 차이점 비교 (객체지향과 하향식)

C언어 독학 책은 프로그래밍 예제 많은 걸 추천

IT 기술 경험없는 대학 중퇴생이 프로그래밍 배우고 취직

입사 첫 달 월급 96만원 받았습니다, 게임잡 기획자

댓글