이 상품은 구매 후 지원 기기에서 예스24 eBook앱 설치 후 바로 이용 가능한 상품입니다.
|
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-4 C를 먼저 배워야 하는 이유1-1-5 표준 라이브러리와 사용자 정의1-2 C 프로그래밍 개요1-2-1 C 프로그래밍 언어 소개1-2-1-1 C 프로그래밍 언어의 탄생1-2-1-2 C 프로그래밍 언어의 표준1-2-2 C 프로그래밍 언어의 특징1-2-2-1 프로그래머(인간) 지향성1-2-2-2 메모리와 하드웨어를 직접 제어 가능1-2-2-3 높은 이식성1-2-3 C 프로그래밍의 꽃은 포인터 변수가 아닌 ‘함수’여야 한다1-2-4 C 프로그래밍을 수행하는 7단계1-2-4-1 프로그래밍의 시작은 논리적 사고부터1-2-4-2 C 프로그래밍의 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-7 C 프로그래밍의 시작점: main 함수1-3-8 비주얼 스튜디오 추천 단축키2장 C 프로그래밍의 구조와 흐름2-1 프로그래밍을 하는 기본 단위와 시작점2-1-1 프로그램, 함수, 명령문2-1-2 키워드와 식별자2-1-3 main 함수의 C99 표준 작성법2-1-4 컴파일러가 인식하는 명령문의 종료2-1-4-1 에러 코드: C21432-2 프로그래밍에 필요한 기초 개념2-2-1 표준 라이브러리 함수2-2-2 전처리기 지시자: #include2-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, LNK11202-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 에러 코드: C23712-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 특정 데이터형 없음: void3-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-1 putchar()3-4-2-2 getchar()3-4-2-3 표준 입력 함수와 버퍼3-4-2-4 fputc()3-4-2-5 fgetc()3-4-3 문자열 전용 입출력 함수3-4-3-1 puts()3-4-3-2 gets()와 gets_s()3-4-3-3 fputs()3-4-3-4 fgets()3-4-4 범용 입출력 함수3-4-4-1 printf()3-4-4-2 scanf()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-1 AND 논리 연산자3-5-5-2 OR 논리 연산자3-5-5-3 NOT 논리 연산자3-5-6 대입 및 복합 대입 연산자3-5-6-1 대입 연산자3-5-6-2 산술 복합 대입 연산자3-5-6-3 복잡한 코드의 분리3-5-7 형 변환 연산자3-5-8 sizeof 연산자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-1 if 조건문3-7-1-2 if ~ else 조건문3-7-1-3 if ~ else if ~ else 조건문3-7-1-4 중첩 if 조건문3-7-1-5 switch ~ case 조건문3-7-1-6 중첩 조건문3-7-2 반복문3-7-2-1 for 반복문3-7-2-2 while 반복문3-7-2-3 do ~ while 반복문3-7-2-4 중첩 반복문3-7-3 분기문3-7-3-1 리턴 명령문(return)3-7-3-2 continue 명령문3-7-3-3 break 명령문3-7-3-4 goto 명령문과 레이블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 파일 포함: #include3-9-1-1 표준 라이브러리 헤더 파일 포함3-9-1-2 사용자 정의 헤더 파일 포함3-9-1-3 지정된 경로의 헤더 파일 포함3-9-2 컴파일 제어: #pragma3-9-2-1 #pragma once3-9-2-2 #pragma warning3-9-2-3 #pragma message3-9-2-4 #pragma pack3-9-3 매크로 정의: #define과 #undef3-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 ~ #endif3-9-4-2 #ifndef ~ #else ~ #endif3-9-4-3 #if ~ #elif ~ #else ~ #endif3-9-4-4 #if defined ~ #elif defined ~ #else ~ #endif3-9-5 정의된 매크로3-9-6 기타, #line과 #error3-9-6-1 #line3-9-6-2 #error3-10 1차원 배열3-10-1 배열의 필요성3-10-2 배열의 선언, 배열 요소, 치명적 단점3-10-2-1 배열의 선언과 배열 요소별 접근3-10-2-2 배열의 치명적 단점3-10-3 배열 초기화3-10-3-1 배열 선언 명령문에서 초기화3-10-3-2 배열 선언 명령문에서 자동 초기화3-10-3-3 배열 선언 명령문에서 일부 초기화 생략3-10-4 배열 대입3-10-5 배열의 크기3-10-6 배열과 반복문3-10-7 배열에 문자열 저장3-10-7-1 문자열 데이터형이 없어서 발생하는 문제3-10-7-2 문자 데이터형 배열의 선언과 동시에 초기화3-10-7-3 문자 데이터형 배열의 선언과 대입 연산자로 초기화3-10-7-4 배열의 크기를 +1로 표기하지 않을 때3-10-8 배열에 문자열 대입3-11 포인터 변수3-11-1 주소 연산자(&)와 간접 참조 연산자(*)3-11-1-1 메모리 주소의 개념3-11-1-2 주소 연산자3-11-1-3 간접 참조 연산자3-11-2 포인터 변수 선언3-11-3 포인터 변수의 필요성3-11-3-1 지역 변수의 사용 범위에 따른 한계3-11-3-2 함수의 인자에 변수로 값 공유3-11-3-3 함수의 인자에 포인터 변수로 주소 공유3-11-4 주소와 포인터 변수의 크기3-11-5 억지로 만든 포인터 변수 예시3-11-6 포인터 변수 대입3-11-7 포인터 변수와 const3-12 동적 메모리3-12-1 동적 메모리 할당과 해제: malloc( )과 free( )3-12-2 동적 메모리를 배열처럼 활용3-12-3 널 포인터3-12-4 포인터 변수의 활용법 4가지 정리3-12-5 memset( )3-12-6 calloc( )3-12-7 realloc( )3-13 문자열3-13-1 배열과 문자열3-13-1-1 char 배열 선언 명령문3-13-1-2 인덱스로 문자 접근3-13-1-3 문자열 대입3-13-1-4 입력 함수로 문자열 받기3-13-2 포인터 변수와 문자열3-13-2-1 char 포인터 변수 선언 명령문3-13-2-2 인덱스로 문자 접근3-13-2-3 문자열 대입3-13-2-4 입력 함수로 문자열 받기3-13-3 문자열 연산3-13-3-1 문자열 길이: strlen( )3-13-3-2 문자열 비교: strcmp( )과 strncmp( )3-13-3-3 문자열 검색: strchr( )과 strrchr( )과 strstr( )3-13-3-4 문자열 복사: strcpy( )과 strncpy( )3-13-3-5 문자열 연결: strcat( )과 strncat( )3-13-3-6 문자열 자르기: strtok( )3-13-4 문자열과 정수 및 실수 변환3-13-4-1 문자열을 정수로: atoi( ) atol( ) atoll( )3-13-4-2 문자열을 실수로: atof( )3-13-4-3 정수를 문자열로: sprintf( )3-13-4-4 실수를 문자열로: sprintf( )3-14 파일 입출력3-14-1 파일의 개방과 폐쇄3-14-1-1 파일 개방과 폐쇄3-14-1-2 절대 경로와 상대 경로3-14-2 파일 개방 모드3-14-2-1 파일 개방 모드 정리3-14-2-2 파일 개방 모드: write3-14-2-3 파일 개방 모드: append3-14-2-4 파일 개방 모드: read3-14-2-5 파일 개방 모드: +3-14-3 문자 전용 입출력 함수3-14-3-1 fputc( )3-14-3-2 fgetc( )3-14-4 문자열 전용 입출력 함수3-14-4-1 fputs( )3-14-4-2 fwrite( )3-14-4-3 fgets( )3-14-4-4 fread( )3-14-5 범용 입출력 함수3-14-5-1 fprintf( )3-14-5-2 fscanf( )3-14-6 파일 포인터 위치 변경과 찾기: fseek( )와 ftell( )3-14-6-1 fseek( )와 ftell( )3-14-6-2 파일 크기 계산에 활용3-14-7 파일의 처음으로 복귀: rewind( )3-14-8 파일의 끝인지 검사: feof( )3-15 프로그래밍 8가지 지침3-15-1 프로그래밍 스킬보다 논리적 사고 능력이 중요하다3-15-2 핵심 코드부터 시작해 점차 구현해야 한다3-15-3 처음부터 실수를 줄일 수 있는 버릇을 들여라3-15-4 팀 프로그래밍은 네이밍 규정부터 시작된다3-15-5 가독성 있는 코딩은 기본 중 기본이다3-15-6 에러 & 버그와 친해질수록 경험이 쌓인다3-15-7 디버깅을 할 수 있어야 비로소 프로그래밍을 시작한 것이다3-15-8 기능 구현만이 아닌 예외 처리와 디버깅용 코드를 작성하라4장. C 프로그래밍의 응용4-1 리터럴 응용4-1-1 비트 표현을 위한 준비4-1-2 정수 리터럴의 비트 표현4-1-3 문자 리터럴의 비트 표현4-1-4 실수 리터럴의 비트 표현4-2 연산자 응용4-2-1 비트 논리 연산자4-2-1-1 논리곱(AND) 비트 논리 연산자4-2-1-2 배타적 논리합(XOR) 비트 논리 연산자4-2-1-3 논리합(OR) 비트 논리 연산자4-2-1-4 부정(NOT) 비트 논리 연산자4-2-2 비트 이동 연산자4-2-2-1 왼쪽 비트 이동 연산자4-2-2-2 오른쪽 비트 이동 연산자4-2-3 비트 복합 대입 연산자4-2-4 콤마 연산자4-3 사용자 정의 함수 응용4-3-1 구조체 매개변수4-3-2 배열 매개변수4-3-3 포인터 변수 매개변수4-3-4 가변 인자 매개변수4-3-5 구조체 반환4-3-6 배열 반환4-3-7 포인터 변수 반환4-3-8 void 포인터 반환4-3-9 재귀 호출 함수4-4 배열 응용4-4-1 구조체 배열4-4-2 포인터 배열4-4-3 2차원 배열의 선언, 배열 요소 접근4-4-4 2차원 배열 초기화4-4-5 2차원 배열 대입4-4-6 2차원 배열의 크기4-5 포인터 변수 응용4-5-1 배열명을 포인터 변수에 저장4-5-2 구조체 포인터4-5-3 배열 포인터4-5-4 이중 포인터 변수 선언4-5-5 이중 포인터 변수의 필요성4-5-5-1 함수의 매개변수로 포인터 변수의 주소 교환4-5-5-2 함수의 인자에 포인터 배열로 주소 공유4-5-6 함수 포인터4-5-7 void 포인터
|
남기덕의 다른 상품
|
◈ 이 책에서 다루는 내용 ◈◆ 프로그래밍의 개요와 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년이나 프로그래밍 언어를 배웠다는 학생들이 간단한 에러가 발생한 순간, 에러 메시지가 명확하게 표시되고 있는데도 에러를 해결하는 방법을 배우지 못해 빌드조차 해보지 못하고 포기하는 모습을 자주 보게 된다. 빌드가 되지 않으면 에러 코드를 찾아보거나, 빌드는 성공했으나 원하는 대로 동작하지 않으면 디버깅을 하는 것이 아니라 교재의 본래 코드를 뚫어지게 쳐다보면서 오타를 찾는 것이 현재 대학에서 이뤄지는 프로그래밍 수업이 처한 현실이다.근본적으로 “지금까지 이뤄진 프로그래밍 수업의 방향성이 과연 맞는가?”라는 고민을 자주하게 된다. 이 책은 수많은 ‘프포자’가 자신감을 갖고 다시 프로그래밍에 도전해볼 수 있게 실무에서 이뤄지고 있는 프로그래밍의 전체적인 흐름을 먼저 알려주는 것이 목적이다. 우리는 스스로 생각해서 코드를 작성할 수 있는 프로그래머를 키우는 것이지, 완성된 코드를 보고 분석하는 분석가를 키우는 것이 아니다. 간단한 영어 문장을 스스로 말하고 쓸 수 있는 것부터 시작하는 것이 진정한 언어 교육의 첫걸음인 것과 같이, 중급 이상의 이론을 학습하기보다 기초적인 이론만을 활용해서 직접 코드를 한 줄씩 작성할 수 있게끔 하는 것이 프로그래밍 언어 교육의 첫걸음이다.
|