동명의 축구선수에 대한 내용은 윤성우(축구선수) 문서 참고하십시오.
1. 개요
'열혈 C프로그래밍', '난 정말 JAVA를 공부한 적이 없다구요' 등의 베스트셀러 프로그래밍 입문서를 집필한 저자이자 프로그래머. 윤성우의 대부분의 저서가 국내 프로그래밍 교재 베스트셀러를 굳건히 지키고 있는 관계로, 대부분의 국내 스타터 프로그래머들이 이름을 한번쯤은 들어보았을 것이다. 열혈 C++ 프로그래밍, 자료구조[1] 등의 저서를 제외하면 대부분의 저서들이 프로그래밍을 완전 처음 시작하는 입문자들을 대상으로 쓰여졌다.윤성우의 책들은 배경 지식이 없는 학습자가 핵심을 정확히 이해할 수 있도록 고민을 거쳐 쓰여져 있지만 일부 오개념과 틀린 설명도 있으니, 입문서로는 좋지만 이 책만 가지고 깊게 파고들기엔 적합하지 않다. 관심이 있다면 일단 서점에서 책을 읽어보고 판단하자.
2. 특징
오렌지미디어라는 사이트를 통해 강의를 12개월간 공짜로 들을 수 있기 때문에 대부분의 스타터 프로그래머에게 있어서는 굉장한 도움이 된다. 그 뿐만 아니라 2017년 이후에 출판된 책의 인터넷 강의부터는 오렌지미디어 사이트가 아닌 저자 본인이 개설한 카페를 통해 기간 제한없이 무료로 시청할 수 있게 되었다. 단, 회원 가입을 해야 열람할 수 있다.저서들이 모두 각각의 영역을 넓게 다뤄주고 있기 때문에, 말 그대로 입문서로 적합하다. 다 배우고 나면 깊이감이 못내 아쉬울진 모르지만, 원래 프로그래밍 언어라는 게 굉장히 넓고 깊기 때문에 책 한 권으로 끝내는 것은 어렵다.[2]
중요한 건 입문서는 입문서일 뿐, 입문서로 모든 것을 배울 수 있는게 아니므로 입문서에 만족하지 않고 스스로가 부족하다는 것을 인지하여 중급자 이상을 타겟으로 나온 다른 교재들[3] 혹은 개발 현장인 실전에서 열심히 공부해야 한다는 점이다. 책조차 다루지 못 한 최신 문법이나 라이브러리를 익히려면 MSDN의 docs, Stack Overflow에서 찾거나 구글링이 답이다(...).
3. 출판된 도서
3.1. 열혈 TCP/IP 소켓 프로그래밍
2003년 4월에 출판되고 2009년 12월에 개정된 책으로, C언어 기반의 TCP/IP 소켓 프로그래밍을 다룬다. Linux[4]와 Windows[5] 운영체제를 기본[6]으로 설명하며, TCP/IP 책이지만 OS 레벨인 Thread에 대해서도 어느 정도 다루기 때문에 기초적인 시스템 프로그래밍 개념을 배우기에도 적합하다. 그리고 UDP와 UDP 기반의 Broadcast, Multicast 또한 다룬다.3.2. 열혈 C 프로그래밍
2003년 12월에 처음 출판된 후 2010년 11월에 개정된 책으로, 대다수의 프로그래머를 희망하는 학생들이 제일 먼저 접하는 책인 경우가 많다.C11 표준 발표 이전에 출판되었기 때문에 C11부터 정렬 기능의 변경, 유니코드 지원 개선, 언어 차원에서도 구현할 수 있도록 새로 추가된 멀티스레드 등의 내용을 다루지 않지만, C11 이후의 내용을 몰라도 C언어 기초를 익히는데 큰 지장은 없다. 애초에 대부분의 C언어 입문서들이 C11 이전에 발표된 C99 표준조차 제대로 다루지 않고 C89 시절의 문법을 기준으로 집필되어 있어서 표준 버전에 대해 논하기엔 어울리지 않는 책이긴 하다. 비주얼 스튜디오가 C11, C18 표준은 커녕 C99 표준을 제대로 지원하지 않아서 C99 이후 기능들을 다루지 않게 된 점이 크다.
3.3. 열혈 C++ 프로그래밍
2004년 4월에 처음 출판되고 2010년 5월에 개정된 책으로, C++의 기초 중에 기초를 주로 가르쳐준다. 강의 역시 열혈 시리즈 3형제 중에서 가장 짧기 때문에[7] C언어를 먼저 공부한 다음에 공부하는 것을 요구하고 있다. 그렇다 보니 C를 배우고 C++를 바로 배우는 사람들이 종종 보이기도 한다.C++11 표준 발표 이전에 출판되었기 때문에 모던 C++을 아예 다루지 않아, C++의 내용을 간단히 체험하는 정도로 익힐 수 있다. 저자 본인도 제대로 된 C++ 프로그래머가 되려면 입문서 하나로 끝내지 말고 입문서에 없는 새로운 C++ 문법이나 라이브러리를 추가로 공부해야 한다는 식의 내용이 언급했다.
3.4. 뇌를 자극하는 윈도우즈 시스템 프로그래밍
2007년 3월에 출판된 책으로 윈도우 환경의 프로세스 작동 원리와 스레드, 메모리 관리 기법을 설명하며 커널에 대해서도 간략하게 다룬다.3.5. C 프로그래밍 파워 업그레이드
2008년 6월에 출판되었던 책으로 현재는 절판되었다.열혈 C 프로그래밍에서 다진 C의 기본 문법과 개념을 토대로 여러 프로젝트(테트리스 , 가위바위보 등)을 직접 만들어보는 열혈 C의 응용편이라고 볼 수 있다.
3.6. 난 정말 C PROGRAMMING을 공부한 적이 없다구요
2009년 1월에 출판된 책으로 C언어 입문자이거나 좀 더 깊이 있게 공부하고 싶은 사람을 기준으로 집필되었다. 책 제목이 길어서 '난 정말 C'까지만 줄여서 부르는 편이다.900쪽이 넘는 분량인데 그렇게 방대한 분량이라고 해서 열혈 C보다 어렵게 설명하는 것은 아니지만, 같은 개념이라도 열혈 C보다 더 자세하게 다루기 때문에 사실상 '열혈 C의 심화 버전'이라고 볼 수 있다.
3.7. 난 정말 JAVA를 공부한 적이 없다구요
2009년 8월에 출판된, Java 프로그래밍을 입문하는 사람을 기준으로 만든 책. 책 제목이 긴 관계로 보통 '난 정말 JAVA'라고 줄여서 부르는 편으로, C언어를 공부하지 않고 자바로 시작하는 사람에게 좋다.구성은 열혈 C 프로그래밍과 유사한 방식으로 기초부터 알려준다. 다만 책 제목을 비전공자 혹은 취미용 교재인 것처럼 꾸며 놓고선 내용은 전공 입문자용이라, 전공자는 무시하기 쉽고 비전공자는 낚이기 쉽다(…). 여러 커뮤니티에서 자바 입문한다고 하면 추천해주는 책 중 하나이다.
3.8. 열혈 자료구조
2012년 1월에 출판된 책으로, 재귀함수, 연결 리스트, 스택, 큐, 트리, 탐색, 정렬 등의 자료구조를 다룬다. 이론을 먼저 설명하고 C언어로 구현해보는 실습 내용이 담겨 있기 때문에 열혈 C나 C++에 비하면 약간 불친절한 편인데, C를 어느 정도 공부한 사람을 대상으로 책을 집필한 듯하다. 그래도 다른 자료구조 입문서에 비하면 상당히 자세한 편이고 ADT(Abstract Data Type: 추상 자료형)에 대한 내용의 도식화가 잘 되어있다. 또한 알고리즘에 대한 내용도 일부 수록되어 있어서 알고리즘의 깊이도 크게 부족하지 않다.3.9. 열혈 Java 프로그래밍
2017년 7월에 출판된 책으로, Java SE 8을 이용한 Java의 기초를 다룬다. '난 정말 JAVA를 공부한 적이 없다구요'를 대체하며 최신 문법을 추가한 내용이라고 보면 된다. 명색이 최근에 출판된 최신 개정판이었지만 2달 뒤에 Java SE 9가 발표되어서 지금은 최신 개정판이라는 이름이 무색해진 상태(…).3.10. 윤성우의 열혈 파이썬 기초편
2018년 11월에 출판된 책으로, 파이썬 3를 이용한 파이썬 기초를 다룬다.3.11. 윤성우의 열혈 파이썬 중급편
2019년 10월에 출판되었다.실질적으로 중급이라고는 하지만, 중반까지는 프로그래밍을 제대로 다루기 위한 기본 내용들이 들어가고 후반부에는 클래스와 객체에 대해 심화적인 부분을 다룬다.
기초편과는 달리 단원별 연습문제가 없어서 아쉬운 부분이고, 이는 필히 다른 교재나 인터넷 자료로 보완해서 연습을 해야할 부분이다.
4. 문제점
어디까지나 입문서이기 때문에 깊게 공부하고 숙련된 프로그래머들에겐 생략된 부분들이 많이 보일 수 있다. 그렇다고 숙련자들이 만족할 만한 책이 되려고 입문자들에게 진입 장벽만 더 높이는 꼴을 보여주다간 취지에 어긋나게 되므로 이를 타협하는 과정에서 몇 가지 한계점은 나타날 수밖에 없다. 입문서로서의 생략에 대한 어쩔 수 없는 부분은 숙련자들끼리도 대체로 이해하고 있는 분위기이므로 생략 자체는 가장 기본적인 개념까지 생략된 막장스러운 내용이 아닌 한 크게 문제될 사항은 아니다.그런 한계를 감안하여 입문용 치고는 훌륭한 책들로 평가받고 있으나 오개념이 될만한 내용이 있어서 개념을 제대로 잡으려면 학습자 스스로 주의해서 학습해야 하는 문제점이 있다.
4.1. C언어의 Pass by Reference
열혈 C, 난 정말 C 책 둘 다 포인터를 통해 값을 전달하는 것을 ' Call by Reference'라고 설명해 놓았는데, 포인터 변수는 역 참조 연산자(*)를 사용하지 않는 이상 함수 내에서 함수 바깥의 인자를 조작할 수가 없으므로 pass by value에 속한다.C언어에는 pass by reference가 존재하지 않는다. 포인터를 함수의 매개변수로 넘겨주는 것을 pass by reference로 지칭하는 것은 명백히, 완전한 오류이며, 이런 오개념을 전달하는 것이 윤성우뿐만인 것은 아니지만 국내에 이런 오개념이 크게 퍼진 것은 윤성우의 잘못이 크다. 포인터를 함수의 매개변수로 넘겨주는 것을 왜 pass by reference로 지칭할 수가 없냐면, 포인터는 함수의 매개변수로 전달되고 난 뒤에 그것이 가리키는 대상을 바꿀 수 있기 때문이다.
4.2. C언어의 배열의 이름과 포인터 상수
윤성우의 열혈 C프로그래밍에서 배열의 이름을 배열의 첫번째 요소를 가리키는 포인터, 그 중에서도 그 주소값을 바꿀 수 없는 포인터 상수로 정의하고 있다. 이것 자체가 완전히 틀린 설명이며, decay에 관한 설명이 전혀 없다는 게 문제.일단 배열의 이름은 배열이고 포인터는 포인터다. 배열의 이름은 그 자체로 배열의 정보를 지니고 있는 배열이지 절대 그 자체가 곧 주소값인 것은 아니다. 단, 대부분의 경우에 배열의 이름은 배열의 길이 정보를 잃고 포인터(배열의 첫번째 요소의 주소값)로 decay된다.
4.3. C++의 std::cout, std::cin, std::endl
C++에서 추가된 표준 입출력 문법이라서 출력문의 끝마다 std::endl을 사용하는데 std::endl은 개행을 함과 동시에 출력 버퍼를 비우라는 명령을 담은 함수이다.(₩n에 이어 std::flush가 호출된 것과 같다) 따라서 매번 버퍼 메모리로 접근을 해야 하니 성능에 악영향을 미치게 된다. std::endl뿐만 아니라 std::cout을 사용했을 때와 printf()를 사용했을 때에도 성능 차이가 발생하는데, std::endl과 ₩n 간에는 3배 정도의 차이가 있는 반면 std::cout과 printf() 간에는 무려 5배 가량의 성능 차이가 발생한다. ( std::cout과 printf(), std::endl과 ₩n(개행 문자)의 성능 비교 참조) 참고로 ₩n을 쓸 때는 대문자[9]로 감싼 것보다 소문자[10]로 감싼 것이 아주 약간 더 빠르다. 대문자로 감싼 것은 널 문자를 포함한 "문자열"이므로 8byte 포인터(64bit 기준)를 전달해야 하지만, 소문자로 감싼 것은 1byte짜리 단일 문자이기 때문. 그리고 std::cout은 서식 문자를 사용하지 않아도 된다는 장점이 있지만, 그 대신 컴파일러가 타입을 자율적으로 판단하기 때문에 의도치 않은 값이 출력될 가능성이 있다.[11]하지만 어디까지나 C++ 입문서로써 std::cout, std::cin, std::endl을 아예 다루지 않고 넘어갈 수 없으니 문법을 소개하는 것은 당연한 일이다. std::cout, std::cin, std::endl을 이용한 표준 입출력은 줄을 바꾸기 위해 ₩n 같은 특수 문자를 명시할 필요가 없고, 변수를 출력하기 위해 %d 같은 printf(), scanf()의 서식 문자가 들어있는 문자열 없이 변수명만 명시하면 되며,[12] 소괄호와 쉼표 없이 << 또는 >> 연산자로만 구분하므로[13] printf(), scanf()보다 더 간결해지고 번거로움이 줄어든 것은 문법적으로 확실한 매력 포인트이다.
[1]
두 저서 모두 C언어를 안다고 가정하고 쓰여졌다.
[2]
C언어는 레퍼런스 메뉴얼(기본 설명서)만 해도 200페이지가 넘는다.
[3]
2011년 8월 12일 C++11 표준이 발표된 이후 시점엔 C++11 이후의 신규 문법과 라이브러리를 다루는 모던 C++ 책들도 포함된다.
[4]
Epoll, POSIX Thread 기반의 서버 제작 등.
[5]
Overlapped IO, 비동기 알림, IOCP, Thread 등.
[6]
왜 각각 나뉘어서 설명하느냐 할 수도 있겠지만, Linux와 Windows는 커널 구조부터가 다르다. 따라서 자연스레 함수의 정의는 물론, 작동되는 방식이 다를 수밖에 없다.
[7]
열혈 C 프로그래밍의 절반에 가까운 강의 분량이다.
[8]
하지만 C++20 까지 나온 현재엔 여러 입문서나 튜토리얼에서 C++ 11 이후의 내용도 제법 다루는 만큼 개정 시도도 하지 않는 것은 아쉬운 일이다.
[9]
아마도 쌍따옴표 " 를 지칭하는 듯 하다
[10]
홑따옴표 '
[11]
0.400000을 출력해야 하는데 0.4로 출력된다거나 하는 등.
[12]
std::cin은 scanf()와는 달리 변수명 앞에 &를 덧붙이지 않는다.
[13]
소괄호와 쉼표 없이 작성할 수 있는 비결은 '연산자 오버로딩'으로, 해당 개념을 배우지 않은 사람들에겐 시프트 연산자를 의미하는 <<, >>가 왜 다른 용도로 사용될 수 있는지에 대한 궁금증이 생기게 된다.