프포자를 위한 C 프로그래밍

프포자를 위한 C 프로그래밍

$49.26
저자

남기덕

저자:남기덕
세계게임시장이질적으로한단계더발전하는데조금이나마공헌하고자대학에서게임학,게임프로그래밍,게임디자인을연구하고가르치고있다.좀더많은사람들에게게임제작에대한지식과경험을나눠줄수있는방법을찾기위해비영리단체인글로벌게임연구회를창립해활동중이다.

동양대학교게임학부교수
글로벌게임연구회회장&창립자
상명대학교일반대학원게임학박사
중국길림애니메이션대학교객원교수
게임비평가&게임분석가
한국게임학회정회원
한국e스포츠학회기획이사
한국엔터테인먼트산업학회상임이사
한국문화콘텐츠비평협회정보이사
한국콘텐츠진흥원게임전문가평가위원
각종게임관련심사위원(전시회,행사,지자체,게임잼등)
대학,기관,단체,컨퍼런스등강의및강연
(전)게임PD,PM,개발팀장,클라이언트프로그래머
(전)가천대학교게임대학원겸임교수

목차


1장.C프로그래밍의개념
1-1프로그래밍개요
1-1-1프로그래밍을배운다는의미
1-1-1-1프로그래밍은영어를체득하는과정과동일하다
1-1-1-2이론과실습보다개념이우선돼야한다
1-1-2프로그래밍언어,프로그래밍,코딩
1-1-3프로그래밍=데이터+알고리듬
1-1-4절차적프로그래밍vs객체지향프로그래밍
1-1-4-1철학부터다른별개의언어
1-1-4-2절차적프로그래밍
1-1-4-3객체지향프로그래밍
1-1-4-4C를먼저배워야하는이유
1-1-5표준라이브러리와사용자정의
1-2C프로그래밍개요
1-2-1C프로그래밍언어소개
1-2-1-1C프로그래밍언어의탄생
1-2-1-2C프로그래밍언어의표준
1-2-2C프로그래밍언어의특징
1-2-2-1프로그래머(인간)지향성
1-2-2-2메모리와하드웨어를직접제어가능
1-2-2-3높은이식성
1-2-3C프로그래밍의꽃은포인터변수가아닌'함수'여야한다
1-2-4C프로그래밍을수행하는7단계
1-2-4-1프로그래밍의시작은논리적사고부터
1-2-4-2C프로그래밍의7가지수행단계
1-3실습을위한컴파일러준비
1-3-1비주얼스튜디오다운로드및설치
1-3-2솔루션및프로젝트생성
1-3-2-1비주얼스튜디오의구조
1-3-2-2프로젝트생성
1-3-3소스파일생성
1-3-4코드작성
1-3-5컴파일과솔루션빌드
1-3-6실행파일실행
1-3-7C프로그래밍의시작점:main함수
1-3-8비주얼스튜디오추천단축키


2장C프로그래밍의구조와흐름
2-1프로그래밍을하는기본단위와시작점
2-1-1프로그램,함수,명령문
2-1-2키워드와식별자
2-1-3main함수의C99표준작성법
2-1-4컴파일러가인식하는명령문의종료
2-1-4-1에러코드:C2143
2-2프로그래밍에필요한기초개념
2-2-1표준라이브러리함수
2-2-2전처리기지시자:#include
2-2-2-1윈도우API활용
2-2-3데이터형의기본분류
2-3프로그래밍의기본구조와흐름
2-3-1표준출력함수
2-3-1-1원하는표준라이브러리를찾아가는과정
2-3-1-2표준출력함수:printf()
2-3-1-3에러코드:LNK2019,LNK1120
2-3-1-4데이터형기본분류출력
2-3-2변수의선언명령문
2-3-2-1변수의선언명령문은어디에작성해야하는가?
2-3-2-2왜변수를선언하는가?
2-3-3대입명령문
2-3-3-1=은수학에서사용하는등호의개념이아니다!
2-3-3-2대입명령문
2-3-3-3하드코딩은최대한피해야한다
2-3-4표준입력함수
2-3-4-1사용자를고려한프로그램
2-3-4-2표준입력함수:scanf()
2-3-4-3함수scanf의위험성
2-4실무를대비한프로그래밍구조
2-4-1사용자정의함수
2-4-1-1에러코드:C2371
2-4-2사용자정의헤더파일생성
2-4-3기능별파일분리
2-4-3-1소스파일분리
2-4-3-2대형프로그램작성을위한파일구조예시
2-4-4주석문
2-4-5소스코드의영역구분
2-4-6템플릿제작
2-5디버깅
2-5-1에러(오류),버그,경고
2-5-2디버깅의개념
2-5-2-1디버깅은고급이아닌기초기술이다
2-5-2-2상황에맞는디버깅방법선택
2-5-3중단점을활용한디버깅실습


3장.C프로그래밍의기본
3-1리터럴
3-1-1문자리터럴
3-1-1-1문자리터럴표현법
3-1-2문자열리터럴
3-1-2-1문자열리터럴표현법
3-1-1정수리터럴
3-1-3-1정수리터럴표현법
3-1-3-2정수리터럴접미사
3-1-4실수리터럴
3-1-4-1실수리터럴표현법
3-1-4-2실수리터럴접미사
3-2데이터형
3-2-1문자데이터형
3-2-1-1문자데이터형
3-2-1-2데이터형의크기
3-2-1-3범위:최솟값과최댓값
3-2-1-4언더플로와오버플로
3-2-1-5문자열저장
3-2-2정수데이터형
3-2-2-1정수데이터형
3-2-2-2데이터형의크기
3-2-2-3범위:최솟값과최댓값
3-2-2-4언더플로와오버플로
3-2-3실수데이터형
3-2-3-1실수데이터형
3-2-3-2데이터형의크기
3-2-3-3범위:최솟값과최댓값
3-2-3-4언더플로와오버플로
3-2-4불리언데이터형
3-2-4-1불리언데이터형
3-2-4-2데이터형의크기
3-2-5기타데이터형
3-2-5-1특정데이터형없음:void
3-2-5-2고정크기정수데이터형
3-2-5-3복소수데이터형
3-3변수와상수
3-3-1변수의선언
3-3-1-1변수의선언명령문
세이브포인트
3-3-1-2변수명네이밍규칙
3-3-1-3한명령문에여러개변수선언
3-3-2변수초기화
3-3-2-1대입명령문을활용한초기화
3-3-2-2선언명령문과동시에초기화
3-3-3상수
3-3-3-1상수의선언명령문
3-3-3-2상수의정의확인
3-3-4변수의종류
3-3-4-1지역변수
3-3-4-2레지스터변수
3-3-4-3전역변수
3-3-4-4정적지역변수
3-3-4-5변수종류비교
3-4표준입출력
3-4-1제어문자
3-4-2문자전용입출력함수
3-4-2-1putchar()
3-4-2-2getchar()
3-4-2-3표준입력함수와버퍼
3-4-2-4fputc()
3-4-2-5fgetc()
3-4-3문자열전용입출력함수
3-4-3-1puts()
3-4-3-2gets()와gets_s()
3-4-3-3fputs()
3-4-3-4fgets()
3-4-4범용입출력함수
3-4-4-1printf()
3-4-4-2scanf()
3-4-4-3파일입출력전용함수fprintf()와fscanf()
3-5기본연산자
3-5-1연산자분류및우선순위표
3-5-2산술연산자
3-5-2-1덧셈과뺄셈산술연산자
3-5-2-2곱셈과나눗셈산술연산자
3-5-2-3나머지산술연산자
3-5-2-4형확장
3-5-2-5형축소
3-5-3증감연산자
3-5-3-1단항산술연산자
3-5-3-2전위와후위의차이
3-5-4관계및동등연산자
3-5-4-1관계연산자
3-5-4-2동등연산자
3-5-5논리연산자
3-5-5-1AND논리연산자
3-5-5-2OR논리연산자
3-5-5-3NOT논리연산자
3-5-6대입및복합대입연산자
3-5-6-1대입연산자
3-5-6-2산술복합대입연산자
3-5-6-3복잡한코드의분리
3-5-7형변환연산자
3-5-8sizeof연산자
3-5-9조건연산자
3-6사용자정의함수
3-6-1함수의원형
3-6-2함수의구조(선언부,구현부,호출부)
3-6-2-1구현부
3-6-2-2선언부
3-6-2-3호출부
3-6-2-4이벤트→조건→핵심코드(액션)
3-6-3함수의4가지유형
3-6-3-1함수의4가지유형분류기준
3-6-3-2매개변수X&반환값X함수
3-6-3-3매개변수O&반환값X함수
3-6-3-4매개변수X&반환값O함수
3-6-3-5매개변수O&반환값O함수
3-7제어명령문
3-7-1조건문
3-7-1-1if조건문
3-7-1-2if~else조건문
3-7-1-3if~elseif~else조건문
3-7-1-4중첩if조건문
3-7-1-5switch~case조건문
3-7-1-6중첩조건문
3-7-2반복문
3-7-2-1for반복문
3-7-2-2while반복문
3-7-2-3do~while반복문
3-7-2-4중첩반복문
3-7-3분기문
3-7-3-1리턴명령문(return)
3-7-3-2continue명령문
3-7-3-3break명령문
3-7-3-4goto명령문과레이블
3-8사용자정의데이터형
3-8-1구조체
3-8-1-1구조체의필요성
3-8-1-2구조체정의와선언
3-8-1-3구조체정의와선언01:별도구분
3-8-1-4구조체정의와선언02:정의에서동시에
3-8-1-5구조체정의와선언03:typedef를활용
3-8-1-6구조체정의와선언04:익명구조체
3-8-1-7구조체초기화
3-8-1-8구조체대입연산
3-8-1-9구조체를멤버로가진구조체
3-8-1-10구조체의크기및정렬
3-8-2공용체
3-8-2-1공용체정의와선언
3-8-2-2공용체초기화
3-8-2-3공용체의크기
3-8-3열거형
3-8-3-1열거형의필요성
3-8-3-2열거형정의와선언
3-8-3-3열거형지정초기화
3-8-3-4찰떡궁합,열거형과switch~case조건문
3-9전처리기
3-9-1파일포함:#include
3-9-1-1표준라이브러리헤더파일포함
3-9-1-2사용자정의헤더파일포함
3-9-1-3지정된경로의헤더파일포함
3-9-2컴파일제어:#pragma
3-9-2-1#pragmaonce
3-9-2-2#pragmawarning
3-9-2-3#pragmamessage
3-9-2-4#pragmapack
3-9-3매크로정의:#define과#undef
3-9-3-1#define매크로의구조
3-9-3-2매크로정의
3-9-3-3상수같은매크로
3-9-3-4함수같은매크로
3-9-3-5#연산자:토큰을문자열로변환
3-9-3-6##연산자:토큰결합
3-9-3-7#undef:매크로해제
3-9-4조건부컴파일
3-9-4-1#ifdef~#else~#endif
3-9-4-2#ifndef~#else~#endif
3-9-4-3#if~#elif~#else~#endif
3-9-4-4#ifdefined~#elifdefined~#else~#endif
3-9-5정의된매크로
3-9-6기타,#line과#error

출판사 서평

이책에서다루는내용

프로그래밍의개요와C프로그래밍의개요
C프로그래밍의전체구조와흐름
난이도에따라나선형으로분산된C프로그래밍이론(개념,구조와흐름,기본,응용)
완성된코드를분석하는것이아닌직접프로그래밍할수있는힘을기르는방법

이책의대상독자

다양한프로그래밍교재를보고학습했음에도프로그래밍을포기했던‘프포자’
인생처음으로프로그래밍언어를배우고자하는누구나
프로그래머지망생,프로그래밍전공또는관련학과/학부학생
절차적프로그래밍부터기초를잡고객체지향프로그래밍으로넘어가고자하는자

이책의구성

1장.C프로그래밍의개념에서는전반적인프로그래밍의개요,C프로그래밍의개요를살펴본다.책을펴자마자무작정코드를작성하기보다프로그래밍이란무엇인지라는기초적인개념부터살펴보는것으로스스로왜프로그래밍을배우는지충분히납득한상태에서프로그래밍에첫발을디디게될것이다.다음으로프로그래밍실습을위한환경을구축하기위해컴파일러를준비하는과정을다룬다.
2장.C프로그래밍의구조와흐름에서는C프로그래밍의전체적인구조와프로그래밍이진행되는흐름을살펴본다.프로그래밍의구조와흐름을이해하기위해필요한최소한의이론만가볍게소개하면서C프로그래밍이라는전체적인한장의그림을그리게된다.프로그래밍의기본단위와시작점,기초개념,기본구조와흐름을배운뒤실무에서사용되는확장성을고려한프로그래밍구조를알아본다.이책에서는기존프로그래밍교재들과달리첫예제부터실무에서도활용되는구조를기반으로예제코드를작성할것이다.마지막으로프로그래밍은현재진행형의의미를갖고있으므로에러,경고,버그가발생했을때스스로수정할수있어야한다는것을전제로한다.따라서문제를해결하기위한필수적수단인디버깅을알아본다.
3장.C프로그래밍의기본에서는C프로그래밍언어를이해하기위한기본이론을논리적인흐름에따라15개의절로나눠배운다.3장은프로그래밍의시작부터끝까지흐름자체를이해할수있게세부적으로다섯부분으로구성했다.
4장.C프로그래밍의응용에서는3장을학습하는시점을기준으로난이도가높아3장에서학습하는것이비효율적이라뒤로미뤄뒀던응용이론을다룬다.응용이론은2개이상의이론이복합적으로다뤄지므로3장에서기본이론을모두이해한후에학습해야비로소쉽게이해된다.

저자의말

영어,일본어,프랑스어와같은언어를현지인과자연스럽게의사소통할만큼배우려면몇년정도필요할까?누구나가매일같이열심히공부해도최소수년이상,길게는10년이상걸린다고이야기할것이다.해당국가에서생활을하면서24시간해당언어에노출되는환경이라면기간이조금짧아지겠지만,모국에서생활하면서다른언어를자연스러운수준까지도달하는건매우드문경우다.
언어에는문법만존재하는것이아니라해당언어를사용해온사람들의문화,사고방식,철학,역사등이담겨있기때문이다.단순히문법만을배워서는절대어느수준이상도달할수없다.문법과더불어그들의문화,사고방식,철학,역사등을이해하려는과정을거치지않으면읽고듣는것까지는가능하게되더라도말하고쓰는것에도달하지못한다.즉,이미완성된문장은이해할수있으나스스로새로운문장을만들어낼수는없다.
그렇다면C프로그래밍언어와같은프로그래밍언어를스스로원하는기능을자유자재로구현할수있을만큼배우려면몇년정도필요할까?이질문에대해놀랍게도상당수의사람이생각보다굉장히짧은시간으로대답한다.대부분2~3년정해진수업시간에만열심히한다면프로그래머로취직해서자신이원하는코드를자유롭게짤수있을것이라고기대한다.
그러나현실은그렇지않다.머릿속에서생각하는대부분의기능을구현할수있을만큼하나의프로그래밍언어를체득하기까지는마치영어를체득하는시간만큼상당한기간이소요된다.그것도매일같이영어단어를외우고,영어로누군가와대화하려고노력하는것과동일한수준으로24시간을해당프로그래밍언어를사용하려고노력했을때최소5년정도소요된다고본다.
인간이사용하는언어와다르게오히려프로그래밍언어가배우기어려운것은해당언어를사용하는국가가존재하지않기때문이다.인간이사용하는언어를배우려면해당언어를사용하는국가에가서생활하면서24시간해당언어에노출되는것으로체득까지걸리는시간을단축할수있다.
프로그래밍언어를사용하는국가는없으나업계에취직해서프로그래밍팀에들어가면해당언어를사용하는국가에서생활하는것과그나마비슷한환경에노출된다.즉,24시간해당언어가머릿속에맴돌며화장실을가도,자려고누워도해결하지못한코드가보이게된다.그렇기때문에프로그래머로취업하면프로그래밍실력이급격하게느는경우가많은것이다.
반대로학생들은취업을하기전이러한환경에노출되기어렵기때문에일반언어와비교한다면읽고듣는것은가능하지만말하고쓰는단계까지도달하지못하는경우가많은것이다.문제는회사입장에서는신입이라고할지라도프로그래밍언어를마치말하고쓸수있는수준까지도달한사람을뽑고자한다는점이다.이는지극히당연한것이다.
대학과학원에서수많은프포자(프로그래밍을포기한자)가양산되는이유는먼저프로그래밍언어를배우는것을굉장히쉽게생각하고있기때문이다.영어와달리배우기위해필요한기간을짧게기대하고있었던만큼,1~2년동안많은노력을기울여도뚜렷한성장이눈으로보이지않기에스스로재능이없다고판단하고쉽게포기하게된다.
우리는왜‘프로그래밍언어’라고부를까?프로그래밍언어도하나의언어라는것을절대잊어서는안된다.프로그래밍언어가갖는각각의철학이있고,요구되는사고방식이별도로존재한다.단순히문법과제공된코드만열심히외워봐야기존에완성돼있는코드를분석하는것만가능해진다.결국국내에서이뤄지는영어학습의단점을답습해읽고듣는것만가능하게된다는의미다.프로그래밍언어를배워마치영어를자유롭게말하고쓰는단계까지도달하려면우리가영어를체득하려고노력하는것처럼24시간해당프로그래밍언어를수년간생각하고버릇이될정도로코딩을하는습관을가져야한다.
그리고무엇보다해당프로그래밍언어가갖고있는철학과사고방식을이해하고자하나의영혼을더가지려고노력해야한다.C프로그래밍언어를이해하려면모든사물을바라볼때‘기능별’로분리하고,논리적인사고를통해진행되는‘절차’를시각적으로표현하려고노력해야한다.
C++나C#프로그래밍언어가갖는철학과요구되는사고방식은C프로그래밍언어와전혀다르기때문에추가로또하나의영혼을가져야객체지향프로그래밍언어를이해할수있다는의미가된다.영어를잘하면알파벳을사용하는다른언어를배우기수월하겠지만해당언어의고유한것은처음부터다시배워야하는것과같다.
필자가대학에서학생들에게프로그래밍언어나게임엔진을가르치기시작하면서놀란건프로그래밍언어를배웠던학생들이생각보다빠른시점에,그리고상상을초월할정도로많은숫자가프로그래밍을포기했고지금도포기하고있다는사실이었다.
많은학생과상담해보면기존대부분의프로그래밍수업은완성된코드를마치암호처럼눈으로외우게하고,시험도마치역사시험처럼완벽한코드의빠진공란을채우는필기시험형태로진행됐기때문에코드가조금이라도변경돼야하는상황이발생하면어쩔줄모르겠다고하소연한다.영어를외우게하는한국의잘못된교육방법이프로그래밍언어의교육방법에까지이어진것이다.이러한교육환경에서스스로새로운코드를작성하지못하는건지극히당연하다.
따라서1~2년이나프로그래밍언어를배웠다는학생들이간단한에러가발생한순간,에러메시지가명확하게표시되고있는데도에러를해결하는방법을배우지못해빌드조차해보지못하고포기하는모습을자주보게된다.빌드가되지않으면에러코드를찾아보거나,빌드는성공했으나원하는대로동작하지않으면디버깅을하는것이아니라교재의본래코드를뚫어지게쳐다보면서오타를찾는것이현재대학에서이뤄지는프로그래밍수업이처한현실이다.
근본적으로“지금까지이뤄진프로그래밍수업의방향성이과연맞는가?”라는고민을자주하게된다.이책은수많은‘프포자’가자신감을갖고다시프로그래밍에도전해볼수있게실무에서이뤄지고있는프로그래밍의전체적인흐름을먼저알려주는것이목적이다.우리는스스로생각해서코드를작성할수있는프로그래머를키우는것이지,완성된코드를보고분석하는분석가를키우는것이아니다.간단한영어문장을스스로말하고쓸수있는것부터시작하는것이진정한언어교육의첫걸음인것과같이,중급이상의이론을학습하기보다기초적인이론만을활용해서직접코드를한줄씩작성할수있게끔하는것이프로그래밍언어교육의첫걸음이다.