ZeroPage Open Camp 2016
학교에서 배우지 않는 C
ZeroPage 24th
성 훈
   
ZeroPage Open Camp 2016
학교에서 배우지 않을지도 모르는 C
ZeroPage 24th
성 훈
   
● 시작하기 전에 : 얼만큼 배웠나요?
● printf, scanf
● 이스케이프 시퀀스(escape sequence)
● 자료형(data type)
● 형 변환(type casting)
● 연산자(operator)
● 연산자 우선 순위/ 결합 순서
   
● 제어문(control statement)
– 조건문(conditional), 반복문(loop)
● 배열(array) / 포인터(pointer)
● 함수(function)
● #include, #define
● 동적 메모리 할당 (dynamic memory allocation)
● 구조체(structure), 공용체(union), 열거형
(enumerated)
   
● 정적 변수 (static variable)
● Const 키워드
● 링커 (linker) / 빌더(builder)
● 표준 라이브러리(standard library)
● 외부 참조 / extern 키워드
● break 키워드, continue 키워드
● 파일 입출력(file I/O)
   
● 실행 스택(runtime stack) / 스택 프레임(stack
frame)
● 운영 체제(operating system)
● 자료 구조(data structure)/ 추상 자료형(ADT)
● 객체 지향 프로그래밍(object-oriented
programming)
● 알고리즘(algorithm)
   
우리는 C 언어를 배웁니다
   
근데 왜 C 언어일까요?
   
● 우리는 컴퓨터를 배웁니다.
● 배우려면, 컴퓨터를 이해해야 합니다.
● 이해하려면, 컴퓨터와 대화해야 합니다.
● 대화하려면, 말을 배워야합니다.
● 하지만 0 과 1은 어렵습니다. 우리같은 평범한 사람들은요...
● 그런 이유로 프로그래밍 언어를 배웠습니다. 고급 언어라교 했었죠
● 근데, 그게 꼭 C언어여야만 할까요?
   
● 사람이 쓰는 말(자연어)는, 자연스럽게 만들어 졌습니다.
→ 의사소통 이외의 특별한 목적을 띠지 않습니다.일반적으로
● 프로그래밍 언어는 인공적으로, 특별한 목적을 가지고 만
들어졌습니다. 간혹 어처구니 없는 목적일때도 있습니다...
● 목적을 알면, 왜 배우는지 알 수 있지 않을까요?
● C언어는 무엇을 위해 만들어졌을까요?
   
결론부터 말하면...
운영체제를 만들기 위해 만들어 졌습니다.
   
운영체제가 뭔가요?
   
● 운영 체제 : 컴퓨터 하드웨어와 소프트웨어 자원을 관리하고,
응용 소프트웨어를 실행하기 위한 공통 서비스를 제공하는
시스템 소프트웨어라네요.
[1]
● ...그러니까 Windows나 OS X같은 거요.
● 안드로이드랑 iOS도요! 스마트폰도 컴퓨터입니다
● C언어는 데니스 리치(Dennis MacAlistair Ritchie, Sep. 9, 1941 - Oct. 12, 2011)라
는 사람이, UNIX라는 운영체제를 만들기 위해 만들었습니다.
● UNIX는 후에 GNU/Linux 및 메킨토시의 기반이 됩니다.
[1] https://en.wikipedia.org/wiki/Operating_system
그리고 Linux는 안드로이드의기반이되고그로인해세상이변화한모습을보면여러분은c언어가얼마나위대한언어인지알수있습니다c언어야말로진정한프로그래밍언어이며이는과학적으로
도증명읍읍
UNIX!
   
● 운영체제는 컴퓨터를 돌리고 쓰기 위해 필요한 프로그램
입니다. 윈도우부터 깔잖아요
● 컴퓨터를 돌리려면, 컴퓨터에 대한 깊은 이해가 필요합
니다.
● C언어를 배우면, 컴퓨터의 깊은 부분에 대한 이해를 얻
을 수 있다는 거죠.
   
하나 더,
● 이러한 이유로, C언어의 사용이 일반화되면서,
● 많은 다른 언어들이 C의 문법과 유사한 구조를 띠게 됩
니다.JAVA만 보게 되어도 알 수 있을 겁니다
심지어는, C언어의 “변종”들도 많이 생기게 됩니다.
C++, Objective-C, C# 등
   
● ...라고 옛날부터 전해져서 우리가 C부터 배우는 겁니
다.
● 그냥 프로그래밍 맛보기면 JAVA나 python같은게 나
을 수도 있습니다.라는 의견도 있더군요
● 솔직히, 단순히 소프트웨어 개발 입문용이라고 하면 C
언어는 배우기 어렵습니다.사견입니다.
● 유명한 컴퓨터공학자들과 프로그래머들도 C부터 배우
는 것이 좋다고 해왔습니다.
그리고사대주의에빠진핼코리아의교육계는진정한의미도모른체무분별한선진국따라하기읍읍읍
   
● 자... 이제 왜 C언어인지는 아마도알았습니다.
● 그렇다면, 다들 어떻게 배웠나요?
● 비주얼 스튜디오를 켜고...
#include <stdio.h>
//…
printf(“Hallo, World!n”);
//…
   
● 더하고 빼고 곱하고 나누고...
● 이제 컴퓨터에 내 손으로 직접 입력합시다!
scanf(“%d”, &int1);
//…
● Ctrl + F5 누르고 쨘!
●
띵!
   
● ...어?
● 무슨 오류인지 봅시다.
●
● ...scanf가 안전하지 않아서 일어난 오류랍니다.
● …?
   
● scanf는 포멧, 그러니까 형식을 받습니다.
● 그런데, 실제로 준 입력이 형식에 맞을지는 알 수 없죠.
● 정수에 문자가 들어간다거나...
● 심지어는, 이것을 이용하여 해킹도 가능합니다!
   
● Buffer Overflow Attack
● 저장 공간을 넘어 값을 덮어 씌워 버립니다.
● 다른 실행중인 함수가 사용중인 데이터나...
● 심지어는, 함수 내용 자체도 바꿔버릴 수 있습니다!
● 비슷한 함수들이 몇 개 더 있습니다. gets, strcpy, …
   
생각난 김에 드리는 당부 :
● 항상 올바른 입력인지 검사합시다.
● 오류 검사는 꼼꼼히
● 배열 사이즈는 넉넉히 우리에겐 자원이 많습니다
● _s라고 붙은 함수들도 있습니다. 안전하게 만들었답니다
   
헌데 말이죠...
● scanf는 표준 라이브러리 함수입니다.
● 언어의 기본 제공 기능입니다.
● 기본 기능이 안전하지 않다고 오류를 터뜨려버립니다.
● 기본 기능을 못쓰게 한다?
● 뭔가 석연치 않네요...
   
근데 사실은 말이죠...
● Visual Studio는 C표준을 따르지 않습니다!
더 정확히 말해,
● Visual Studio는 C컴파일러가 아닙니다!
?!
   
● A rich, integrated development environment for creating
stunning applications for Windows, Android, and iOS, as
well as modern web applications and cloud services. From Visual
Studio 소개 페이지
● Visual Studio는 IDE(Integrated Development Environment,
통합 개발 환경) 입니다.
● 통합 개발 환경은 코딩, 디버그, 컴파일, 배포 등 프로그램 개발에 관
련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는
소프트웨어이다. 라고 하더랍니다.
[2]
● 그러니까, 프로그래밍에 필요한 프로그램들의 모음이라고 할 수 있습
니다.
여기에 주목
[2] https://ko.wikipedia.org/wiki/통합_개발_환경
`
   
● Visual Studio는…
- 코드 에디터
- 프로젝트 매니저 / 링커 등
- C++ 등 각종 언어의 컴파일러
- 그거하고도 아주 많이 https://www.visualstudio.com/ 참조
● 중요한 점 : VS에 포함된 컴파일러는 C++ 컴파일러입니다!
● ...네?
   
● 원래 C++는 C언어를 발전시킨 언어였습니다. 흔히 이렇게 배웁니다.
● 시간이 지나며, 점점 더 많은 기능들이 들어갑니다.
● 문법도 점점 바뀌어 갑니다.
● 그리고는...
● C와 C++에서 다르게 동작하는 코드가 나오기 시작합니다!
● C++과 C는 다른 언어이고, 심지어 더 이상 포함 관계같은 것
도 없습니다! [출처 필요]
   
결론,
● 우리는 이상한 곳에서 C언어를 배우고 있던 겁니다!
   
● ...왜 이렇게 되었을까요?
● 옛날에는, C++가 C언어를 어느 정도 정확히 지원했습
니다.
● Visual Studio는 좋은 도구니까, VS로 C를 배워도 문
제가 없었습니다. [출처 필요]
● 시간이 지나고, C++속의 C문법은 낡고 병든 필요악에
지나지 않게 되었습니다.
● 하위 호환성
   
● 결국, 낡은 관습 때문에 일어난 문제입니다.
● 사실, 배우는 단계에서는 크게 상관없습니다.
● VS는 아무 잘못이 없습니다. 무겁고 느려터진거 빼면
● scanf함수가 위험한 것도 사실입니다.
● 하지만, 이런 잘못 된 시작이 큰 화를 부를 수도 있습니
다.
● 또 하나, VS가 없을 때는...?
이게다관습에얽메인핼코리아가또다시교육계의높으신늙은이들이예산아깝고우리땐그런것도없었읍읍읍
   
● 다시 처음으로 돌아갑시다!
● 배우지 않는 것들을 알려면...
● 무엇을 배웠나요?
● 연산자, 자료형, 전처리기, 함수, …
● 각종 시험에 나오는 것들
● 하나씩 보면서 갑시다!
   
● 자료형
- 정수형 : (signed,unsigned) int, long, long
long(C99~), char
- 실수형 : float, double, long double
● int는 integer, char은 character, long은 기니까
long, sign은 부호고 unsigned는...
● float는 왜 float일까요? 실수는 real number인데…
   
● Floating Point Real Number에서 따왔습니다.
● 부동(浮動)소수점 실수 : 소수점이 떠다닙니다.
● 6.5535 X 10^4 , 6.62606957 X 10^(-34)
● 6.02214129E23
   
● ...이러한 표기법을 이진수에서 표기하는 방법입니다.
● 자세한 방법은 나중에 배웁니다.
● 정확도 문제
● 0.1 * 0.1 != 0.01
● ?!
   
● 논리값
● 불 대수(Boolean Algebra)
● C에서는 논리형이 따로 없다
● 0 == false; !0 == true;
● !0은 무슨 값이 나올까요? → 표준에 따르면 1
● … 그런데 말입니다
   
● C에도 bool형이 있습니다!
● <stdbool.h> (C99~)
● bool형, true/false 키워드
● C++를 안다면, 그것과 같습니다.
   
● 배열/포인터
● 포인터 지금쯤 다 배웠죠?
● 포인터 연산자들 : *, &, [] //연산자 볼 때 다시 봅시
다
● 배열은 상수인 포인터라 볼 수 있습니다.
● 배열 선언할 때 []안에 변수 넣을 수...
● 있습니다(C99~)
   
● 포인터는 주소의 값 : 포인터 변수는 주소값이 저장됨
● void*
● Null 포인터: NULL defined on
<stddef.h>,<stdio.h>,<stdlib.h>, …
● #define NULL (void*)0 //대부분 이렇게 정의됩니
다.
   
● 배열/포인터는 자료형입니다.
int *a, *b, *c; //...전 이 문법이 너무나도 싫습니다
int *a, b = 0; *c = &b, d, *e = &d, *f;// 어휴 끔찍해
● 모든 자료형에는 배열형/포인터형이 있습니다.
● 배열 포인터/포인터 배열/포인터 포인터
● 포인터의포인터의포인터의...
● 여기가 포인터의 끝이 아닙니다!
예고) 상수 포인터, 구조체,사용자 지정 자료형, 함수 포인터
   
● 참조에 의한 호출(call-by-reference)?
● 사실, C에는 그런거 없습니다.
● Reminder : 포인터 변수, 즉 포인터는 값(value)입니다.
● 그러니까, 실은 저것도 일종의 값에 의한 호출(call-by-
value)입니다.
● 컴퓨터 구조에서는, 자료의 위치도 자료가 될 수 있습니다.
● 정확한 명칭 : 주소에 의한 호출(call-by-address)
   
● 상수 자료형
● const type name_var ; //==type const name_var ;
● 모든 자료형은 상수형을 가집니다.
● 포인터도요.
● 포인터도요.
● ...Here comes a new challenge!
   
● 상수 포인터와 포인터 상수
● const type * name_conptr ;
// == type const * name_conptr ;
● type * const name_ptrcon ;
● const * : 상수를 가리키는 포인터
● * const : 포인터인데 상수
● ...헷갈립니다.
   
● const int == int const
● const int* : 상수 int형을 가리키는 포인터
● Int const * == const int*
● * const : 포인터가 상수
● int* const니까 const인 int*
   
● int *ptr1, const* ptr2, *const ptr3; //…?
이렇게 쓰지 맙시다!
다시 말하지만 전 이 문법이 너무나도 싫습니다
● type const * const name_conptrcon ;
● 상수를 가리키면서 상수인 포인터
● 이걸로 끝입니다...?
● ...here comes another challenge!
   
● 더블 포인터와 const가 만났습니다!
● type const ** name_ptr1 ;
● type * const * name_ptr2 ;
● type ** const name_ptr3 ;
● ...세상에 맙소사!
   
● ...다음 주제로 넘어갑시다!/
● 구조체
● 다양한 형태를 가진 여러 자료를 하나의 자료로 모아줍니다.
● 자료들을 모은 자료형
그래서 자료형 바로 뒤에 나왔습니다.
   
● struct [name_struct] {
[declaration of data1]
//…
}[name_var] ; //세미콜론 빼먹지 맙시다!
● 멤버 변수에 접근 : name_var . name_mem
   
● 구조체 안에 다른 구조체를 넣을 수도 있습니다.
● 모든 자료형은 포인터 자료형을 갖습니다 물론 배열도요
● 구조체도 자료형입니다. 즉...
● -> 연산자
● 자기 자신의 포인터도 넣을 수 있습니다.c.f.)연결 리스트
● 아, 당연히 상수형도 갖습니다.
   
● struct 변수 선언 : struct도 자료형이니까, 변수도 만
들 수 있습니다.
● struct name_struct var_name
[ = {[member1, …]} ] ;
● 음...
● 일일이 구조체 이름 쓰는 것은 조금 힘듭니다.
그렇다기보다귀찮습니다
   
● 그래서 typedef가 있습니다.
● 사용자 지정 자료형
● typedef old_type new_type ;
● 포인터도 원하는 이름으로 선언할 수 있습니다.
● 여러분 편하라고 있는 겁니다.
● 운영체제간 호환성
   
● struct문법은 다르게도 쓰입니다.
● 비트필드(bit field)
● struct name_struct {
type name_mem1 : (constant) ;
//…
}[var_name] ;
● sizeof(type)만큼의 총 크기를 가지며,
● 각 멤버는 constant만큼의 비트로 구성됩니다.
   
●
...근데 어디다 쓸까요?
●
파일 처리
●
이미지 처리
●
...등등
●
이진 자료 처리에 유용합니다.
32개의 비트중에서 어디부터 어디까지가 어떤 데이터이고...
   
●
공용체
● union name_union { //...
●
생긴건 구조체와 비슷합니다.
●
차이 1) 멤버들이 같은 저장소를 공유합니다.
●
차이 2) 공용체 변수 하나의 크기는 가장 큰 멤버의
크기
   
● 어떻게 쓰죠?
● 구조체 안에 자료형 코드와 공용체 저장
→ 여러 형의 자료를 동시에 처리struct는...비효율적입니다
● union 안에 비트필드와 부호없는 정수 저장
→ 2진 코드를 다루기 편해집니다.
   
● 열거형
● 이름이 붙은 정수집합 ???
● 바로 예시를 들게요
● Enum name_enum {
name_mem1 [ = (integer constant) ] ,*
//…
}[name_var] ;
   
● 요일, 월 등 sun, mon, tue, … / jan, feb, mar, apr, ...
● 색깔 코드 지정 black = 0x000000, red = 0xff0000, …
● 상태 / 조건
● 오류 코드#define쪽이 더 많이 쓰이는듯 합니다
● 등등...
   
● ...자료형은 여기까지입니다.
● 자동 형 변환은요? 안할껍니다
모든것을 명시적으로 쓰면 문제 없습니다!제 사견입니다.
● 몇가지가 더 있긴한데...
● size_t // 보통 unsigned int
● volatile type name_var ;
type * restrict name_ptr ;//C99~
   
● 연산자!
● 이항 산술 연산자 : +, -, *, /, %
● 단항 산술/증감 연산자 : +, -, ++(전,후), --(전,후)
● 비교 연산자 : ==, !=, <, >, <=, >=
● 논리 연산자 : !(단항), &&, ||
   
● 비트 논리 연산자 : ~(단항), &, |, ^, <<, >>(시프트 연
산자)
● 이것들은 어디에 쓸까요?
● 이진 정보를 처리할 때 씁니다.
● 이미지 처리,파일 처리, 암호화, …
● 비트필드와 같이 쓰시면 좋습니다. 이름만 봐도
   
● 포인터 연산자
● *, &(단항), []
● [] : 인덱스 참조(구독)연산자
● array[0] 이면 배열의 첫번째
● 0[array]?
● 정상 실행됩니다!
● ?!
   
● ptr[value] == *(ptr + value)
● array[0] 이면 *(array + 0) 이며, *(array)이 되서
결국은 배열의 첫 값입니다.
● 0[array] == *(0 + array)니까, 헉?
● 놀랍군요!
   
● 구조체 연산자 : ‘.’, ‘->’
● var_struct .name_member ; // 멤버 접근
● -> == (*( )).
● ptr_struct -> name_member ; //포인터가 가리키
는 구조체의 멤버 접근
   
● 그 외 여러가지
● 우선순위, 결합순서 괄호 잘 치면 외울 필요 없읍니다
● ? : 란 것도 있었죠삼항 논리 연산자
● sizeof(type), sizeof(value) //size_t형을 반환합
니다.
● 명시적 형 변환(type)
   
● 콤마(‘,’)연산자!
● 함수 호출 연산자!
● func_name([parameter1, …]) : ()부분이 연산자
입니다.
● 지금 알아두시면 나중에 좋은 일이 생깁니다.
C++ : “안녕, 난 시쁠쁠이야! 얘는 내 친구인 연산자 오버로딩이라고 해!”
   
● 제어문
● 조건문 : if문과 else문, switch문과 break문
● 반복문 : while문과 do~while문, for문
● 별로 어려울건 없...습니다.
   
●
몇 가지 알아두면 좋을(지도 모르는) 것들
●
Else if문은 사실...
●
switch문은 사실...
●
for문도?!
   
● break, continue
● goto
● 배우기로는, 쓰지 말라고 배웠습니다.
● 하지만, 알고는 있어야 합니다.
● 복잡한 루프 탈출 에초에 만들지 말았여야 합니다만
● 한편, 저 아래에서는...
   
● 함수(function)
● 뭔지는 다 알거라 믿어요
● 재귀 호출
● void!
● void([argument1,...]), type(void)
   
● main함수
● main도 함수입니다!
● 함수는 인자를 받고 값을 반환합니다
● ...main도 말이죠!
   
● main이 받는 값은?
Int main(int argc, char* argv[]);//char** argv
● main이 반환하는 값은?
EXIT_SUCCESS // <stdlib.h>에 정의되어 있습니다
대다수는 0
c.f.) EXIT_FAILURE // 대부분 1
   
● 함수 포인터
● 함수의 위치를 저장하는 포인터 입니다.
● Fact : 함수도 메모리 위에 올라가는 자료이다.
● func_return_type (*name_ptr)
([type_argument1,…]);
● ptr_func = name_func ;
   
● 왜 필요할까요?
● void qsort(void* base, size_t num, size_t size,
int (*comp)(const void*,const void*));
//<stdlib.h>
● 함수를 변수로 처리해야 할 때도 있습니다.
● OOP?
   
● 다음에 볼 것은...
● printf입니다! 음? 많이 봤잖아요
● printf(“%d + %d = %dn”, a, b, a+b);
● printf도 함수니까 인자를 받습니다. 아, 함숫값도 반환해요!
● 몇 개까지 받을 수 있을까요?
● ...잠깐, 애초에 한개만 줘도 잘 되잖아?
● …?!
   
● printf의 선언을 보면...
● int printf(const char*, …);
● … : 이건 뭘까요?
● 가변 인자 함수
   
● 가변 인자 함수(variadic function)
● <stdarg.h>가 필요합니다.
● va_list : 가변 인자 목록을 저장하는 자료형
● va_start (va_list ap, parmN );
● ap : va_list인 변수 / parmN : 첫 번째 인자
● va_arg (va_list ap ,(type) );
● 다음 인자 접근 → type형의 자료로 리턴
● va_end(va_list ap)
   
● 다음은 전처리기!
● 전처리, 앞에서 처리합니다.
● 컴파일 전에 컴파일러가 실행하는 코드입니다.
● #include, #define
● 다 아는것들 아니냐고요?
● ...정말로요?
   
● #include ( < or ”) (string of filename) ( < or “ )
● include : 포함하다, 포함시키다
● 포함 시킵니다.
● 다르게 말하면, 코드 내용을 복사해서 포함시킵니다.
● Prob1) 컴파일된 목적 파일의 크기가 늘어납니다.
● Prob2) 컴파일한 두 파일이 같은 이름의 변수라도 가
지고 있다면...?!
   
● #define identifier [token_string] ...
● 매크로 문법이라고도 불리죠
● Identifier 를 token_string으로 바꿔줍니다.
● 단순히 교체합니다 → 실수에 주의!
● ...고작 이거면 말꺼내지도 않았지요
   
● 매크로 함수!
● #define identifier[(idf_para1, …)] token_string
//token_string : (string) + idf_para1 + (string) + ...
● identifier((something1, …) 에서
something1을 idf_para1, … 자리에 놓고
token_string으로 교체
● 주의 : identifier와 괄호 사이에 띄어쓰기 꼭 합시다!
...를 (1)이라 합시다.
   
●
# 연산자 : 토큰 문자열에 들어가며, #뒤의 인수 하나를
문자열로 바꿉니다.
● #define identifier(idf_para1,[...]) [token]...
#idf_para1 [token]…
●
양 끝에 큰따옴표 추가
●
, ‘ , “ , % 등은 , ’, ”, %% 등으로 변환
...를 (2)라 합시다.
   
● ## 연산자
● 두 토큰을 연결해 줍니다.
● #define identifier[(idf_para1[, …])]
[(token)…] token ## token [(token)...]
//-> tokentoken
● 보통 (1)과 조합해서 씁니다.
...이것을 (3)이라 합시다.
   
●
(1) + (2) + (3) 으로...?
●
온갖 것들이 가능합니다!
●
쓰기 좋은 입출력 함수라던가...
●
자료형 신경안쓰고 코딩하기 대신 처음에 신경쓸게 많아집니다
●
기본 라이브러리를 뜯어보면...
   
● #if with #elif, #else, #endif
● 조건부 컴파일
● #if (condition)
//…
[#elif or #else]
#endif
● (condition) : 상수와 연산자, defined 지시자, 정의된 식별
자로 구성
   
● #include 얘기할 때...
● 중복 인클루드 방지
● 중복 정의로 인한 오류 방지
● 호환성
● 디버그 모드
● ...
   
● #ifdef, #ifndef, #undef
● #ifdef or #ifndef identifier
● #deifne과 함께 사용합니다.
● #define identifier : identifier를 식별자로 정의만
합니다.
● Identifier 가 정의되어 있으면 실행
● #undef identifier : identifier의 정의를 해제합니다.
   
● #error
●
에러를 터트립니다!
●
어떻게 쓸까요?
● #pragma
●
컴파일러에게 직접 명령을 내립니다.
●
명령어는 컴파일러마다 다릅니다.
● #pragma warning(disable : 4996) VS가 또...
   
●
동적 메모리 할당
●
그 유명한 malloc이요
● void* malloc(size_t size);
●
함수 외부 (힙 영역)에 메모리를 할당하여, 시작 지점의 포인
터를 반환합니다.
●
사실 더 자세한 구동 원리가 있지만...
●
잊지말고 free();
   
● void 포인터로 반환 → 형변환을 추천합니다.
● size를 넣을때 : 일일히 계산하기 어려우니 sizeof()
● (int*)malloc(sizeof(int) * LENGTH_ARR);
● 아휴 복잡해
● 게다가, malloc은 할당한 공간을 초기화해주지 않습
니다!for문까지 돌려야되요!
● ...그런 당신을 위한 calloc!
   
● void* calloc(size_t num_memblk,
size_t size_blk);
●
num_memblk : 자료의 개수
●
size_blk : 자료 하나당 크기
●
calloc으로 할당된 공간은 0으로 초기화됩니다!
   
●
기타 주제
●
static : 정적 변수
●
프로그램 시작시 공간을 확보합니다.
●
extern : 외부 참조 변수
●
파일 외부에서 변수를 참조할 때 사용합니다.
●
File I/O : 학교에서 잘 배울겁니다. 과제를 위해서라도
   
탈락한 주제들
● 인라인 함수 : __inline
● 레지스터 변수 : register
● __asm
● malloc 작동 원리
● trigraph
● volatile
● Restrict
● stdin/stdout
● thread, _Atomic
●
익명 구조체/공용체
● _s functions
● socket programming
● XOR swap
●
함수 호출 규약
● redirection
● ...
   
● 끝!
● 질문받습니다 답변 가능성은 보장되지 않습니다
references from
wikipedia.org
cppreference.com
msdn.microsoft.com
soen.kr
stackoverflow.com
Playing with C 우균,창병모 저 교보문고

학교에서 배우지 않는 C

  • 1.
        ZeroPage OpenCamp 2016 학교에서 배우지 않는 C ZeroPage 24th 성 훈
  • 2.
        ZeroPage OpenCamp 2016 학교에서 배우지 않을지도 모르는 C ZeroPage 24th 성 훈
  • 3.
        ● 시작하기전에 : 얼만큼 배웠나요? ● printf, scanf ● 이스케이프 시퀀스(escape sequence) ● 자료형(data type) ● 형 변환(type casting) ● 연산자(operator) ● 연산자 우선 순위/ 결합 순서
  • 4.
        ● 제어문(controlstatement) – 조건문(conditional), 반복문(loop) ● 배열(array) / 포인터(pointer) ● 함수(function) ● #include, #define ● 동적 메모리 할당 (dynamic memory allocation) ● 구조체(structure), 공용체(union), 열거형 (enumerated)
  • 5.
        ● 정적변수 (static variable) ● Const 키워드 ● 링커 (linker) / 빌더(builder) ● 표준 라이브러리(standard library) ● 외부 참조 / extern 키워드 ● break 키워드, continue 키워드 ● 파일 입출력(file I/O)
  • 6.
        ● 실행스택(runtime stack) / 스택 프레임(stack frame) ● 운영 체제(operating system) ● 자료 구조(data structure)/ 추상 자료형(ADT) ● 객체 지향 프로그래밍(object-oriented programming) ● 알고리즘(algorithm)
  • 7.
        우리는 C언어를 배웁니다
  • 8.
        근데 왜C 언어일까요?
  • 9.
        ● 우리는컴퓨터를 배웁니다. ● 배우려면, 컴퓨터를 이해해야 합니다. ● 이해하려면, 컴퓨터와 대화해야 합니다. ● 대화하려면, 말을 배워야합니다. ● 하지만 0 과 1은 어렵습니다. 우리같은 평범한 사람들은요... ● 그런 이유로 프로그래밍 언어를 배웠습니다. 고급 언어라교 했었죠 ● 근데, 그게 꼭 C언어여야만 할까요?
  • 10.
        ● 사람이쓰는 말(자연어)는, 자연스럽게 만들어 졌습니다. → 의사소통 이외의 특별한 목적을 띠지 않습니다.일반적으로 ● 프로그래밍 언어는 인공적으로, 특별한 목적을 가지고 만 들어졌습니다. 간혹 어처구니 없는 목적일때도 있습니다... ● 목적을 알면, 왜 배우는지 알 수 있지 않을까요? ● C언어는 무엇을 위해 만들어졌을까요?
  • 11.
        결론부터 말하면... 운영체제를만들기 위해 만들어 졌습니다.
  • 12.
  • 13.
        ● 운영체제 : 컴퓨터 하드웨어와 소프트웨어 자원을 관리하고, 응용 소프트웨어를 실행하기 위한 공통 서비스를 제공하는 시스템 소프트웨어라네요. [1] ● ...그러니까 Windows나 OS X같은 거요. ● 안드로이드랑 iOS도요! 스마트폰도 컴퓨터입니다 ● C언어는 데니스 리치(Dennis MacAlistair Ritchie, Sep. 9, 1941 - Oct. 12, 2011)라 는 사람이, UNIX라는 운영체제를 만들기 위해 만들었습니다. ● UNIX는 후에 GNU/Linux 및 메킨토시의 기반이 됩니다. [1] https://en.wikipedia.org/wiki/Operating_system 그리고 Linux는 안드로이드의기반이되고그로인해세상이변화한모습을보면여러분은c언어가얼마나위대한언어인지알수있습니다c언어야말로진정한프로그래밍언어이며이는과학적으로 도증명읍읍 UNIX!
  • 14.
        ● 운영체제는컴퓨터를 돌리고 쓰기 위해 필요한 프로그램 입니다. 윈도우부터 깔잖아요 ● 컴퓨터를 돌리려면, 컴퓨터에 대한 깊은 이해가 필요합 니다. ● C언어를 배우면, 컴퓨터의 깊은 부분에 대한 이해를 얻 을 수 있다는 거죠.
  • 15.
        하나 더, ●이러한 이유로, C언어의 사용이 일반화되면서, ● 많은 다른 언어들이 C의 문법과 유사한 구조를 띠게 됩 니다.JAVA만 보게 되어도 알 수 있을 겁니다 심지어는, C언어의 “변종”들도 많이 생기게 됩니다. C++, Objective-C, C# 등
  • 16.
        ● ...라고옛날부터 전해져서 우리가 C부터 배우는 겁니 다. ● 그냥 프로그래밍 맛보기면 JAVA나 python같은게 나 을 수도 있습니다.라는 의견도 있더군요 ● 솔직히, 단순히 소프트웨어 개발 입문용이라고 하면 C 언어는 배우기 어렵습니다.사견입니다. ● 유명한 컴퓨터공학자들과 프로그래머들도 C부터 배우 는 것이 좋다고 해왔습니다. 그리고사대주의에빠진핼코리아의교육계는진정한의미도모른체무분별한선진국따라하기읍읍읍
  • 17.
        ● 자...이제 왜 C언어인지는 아마도알았습니다. ● 그렇다면, 다들 어떻게 배웠나요? ● 비주얼 스튜디오를 켜고... #include <stdio.h> //… printf(“Hallo, World!n”); //…
  • 18.
        ● 더하고빼고 곱하고 나누고... ● 이제 컴퓨터에 내 손으로 직접 입력합시다! scanf(“%d”, &int1); //… ● Ctrl + F5 누르고 쨘! ● 띵!
  • 19.
        ● ...어? ●무슨 오류인지 봅시다. ● ● ...scanf가 안전하지 않아서 일어난 오류랍니다. ● …?
  • 20.
        ● scanf는포멧, 그러니까 형식을 받습니다. ● 그런데, 실제로 준 입력이 형식에 맞을지는 알 수 없죠. ● 정수에 문자가 들어간다거나... ● 심지어는, 이것을 이용하여 해킹도 가능합니다!
  • 21.
        ● BufferOverflow Attack ● 저장 공간을 넘어 값을 덮어 씌워 버립니다. ● 다른 실행중인 함수가 사용중인 데이터나... ● 심지어는, 함수 내용 자체도 바꿔버릴 수 있습니다! ● 비슷한 함수들이 몇 개 더 있습니다. gets, strcpy, …
  • 22.
        생각난 김에드리는 당부 : ● 항상 올바른 입력인지 검사합시다. ● 오류 검사는 꼼꼼히 ● 배열 사이즈는 넉넉히 우리에겐 자원이 많습니다 ● _s라고 붙은 함수들도 있습니다. 안전하게 만들었답니다
  • 23.
        헌데 말이죠... ●scanf는 표준 라이브러리 함수입니다. ● 언어의 기본 제공 기능입니다. ● 기본 기능이 안전하지 않다고 오류를 터뜨려버립니다. ● 기본 기능을 못쓰게 한다? ● 뭔가 석연치 않네요...
  • 24.
        근데 사실은말이죠... ● Visual Studio는 C표준을 따르지 않습니다! 더 정확히 말해, ● Visual Studio는 C컴파일러가 아닙니다! ?!
  • 25.
        ● Arich, integrated development environment for creating stunning applications for Windows, Android, and iOS, as well as modern web applications and cloud services. From Visual Studio 소개 페이지 ● Visual Studio는 IDE(Integrated Development Environment, 통합 개발 환경) 입니다. ● 통합 개발 환경은 코딩, 디버그, 컴파일, 배포 등 프로그램 개발에 관 련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는 소프트웨어이다. 라고 하더랍니다. [2] ● 그러니까, 프로그래밍에 필요한 프로그램들의 모음이라고 할 수 있습 니다. 여기에 주목 [2] https://ko.wikipedia.org/wiki/통합_개발_환경 `
  • 26.
        ● VisualStudio는… - 코드 에디터 - 프로젝트 매니저 / 링커 등 - C++ 등 각종 언어의 컴파일러 - 그거하고도 아주 많이 https://www.visualstudio.com/ 참조 ● 중요한 점 : VS에 포함된 컴파일러는 C++ 컴파일러입니다! ● ...네?
  • 27.
        ● 원래C++는 C언어를 발전시킨 언어였습니다. 흔히 이렇게 배웁니다. ● 시간이 지나며, 점점 더 많은 기능들이 들어갑니다. ● 문법도 점점 바뀌어 갑니다. ● 그리고는... ● C와 C++에서 다르게 동작하는 코드가 나오기 시작합니다! ● C++과 C는 다른 언어이고, 심지어 더 이상 포함 관계같은 것 도 없습니다! [출처 필요]
  • 28.
        결론, ● 우리는이상한 곳에서 C언어를 배우고 있던 겁니다!
  • 29.
        ● ...왜이렇게 되었을까요? ● 옛날에는, C++가 C언어를 어느 정도 정확히 지원했습 니다. ● Visual Studio는 좋은 도구니까, VS로 C를 배워도 문 제가 없었습니다. [출처 필요] ● 시간이 지나고, C++속의 C문법은 낡고 병든 필요악에 지나지 않게 되었습니다. ● 하위 호환성
  • 30.
        ● 결국,낡은 관습 때문에 일어난 문제입니다. ● 사실, 배우는 단계에서는 크게 상관없습니다. ● VS는 아무 잘못이 없습니다. 무겁고 느려터진거 빼면 ● scanf함수가 위험한 것도 사실입니다. ● 하지만, 이런 잘못 된 시작이 큰 화를 부를 수도 있습니 다. ● 또 하나, VS가 없을 때는...? 이게다관습에얽메인핼코리아가또다시교육계의높으신늙은이들이예산아깝고우리땐그런것도없었읍읍읍
  • 31.
        ● 다시처음으로 돌아갑시다! ● 배우지 않는 것들을 알려면... ● 무엇을 배웠나요? ● 연산자, 자료형, 전처리기, 함수, … ● 각종 시험에 나오는 것들 ● 하나씩 보면서 갑시다!
  • 32.
        ● 자료형 -정수형 : (signed,unsigned) int, long, long long(C99~), char - 실수형 : float, double, long double ● int는 integer, char은 character, long은 기니까 long, sign은 부호고 unsigned는... ● float는 왜 float일까요? 실수는 real number인데…
  • 33.
        ● FloatingPoint Real Number에서 따왔습니다. ● 부동(浮動)소수점 실수 : 소수점이 떠다닙니다. ● 6.5535 X 10^4 , 6.62606957 X 10^(-34) ● 6.02214129E23
  • 34.
        ● ...이러한표기법을 이진수에서 표기하는 방법입니다. ● 자세한 방법은 나중에 배웁니다. ● 정확도 문제 ● 0.1 * 0.1 != 0.01 ● ?!
  • 35.
        ● 논리값 ●불 대수(Boolean Algebra) ● C에서는 논리형이 따로 없다 ● 0 == false; !0 == true; ● !0은 무슨 값이 나올까요? → 표준에 따르면 1 ● … 그런데 말입니다
  • 36.
        ● C에도bool형이 있습니다! ● <stdbool.h> (C99~) ● bool형, true/false 키워드 ● C++를 안다면, 그것과 같습니다.
  • 37.
        ● 배열/포인터 ●포인터 지금쯤 다 배웠죠? ● 포인터 연산자들 : *, &, [] //연산자 볼 때 다시 봅시 다 ● 배열은 상수인 포인터라 볼 수 있습니다. ● 배열 선언할 때 []안에 변수 넣을 수... ● 있습니다(C99~)
  • 38.
        ● 포인터는주소의 값 : 포인터 변수는 주소값이 저장됨 ● void* ● Null 포인터: NULL defined on <stddef.h>,<stdio.h>,<stdlib.h>, … ● #define NULL (void*)0 //대부분 이렇게 정의됩니 다.
  • 39.
        ● 배열/포인터는자료형입니다. int *a, *b, *c; //...전 이 문법이 너무나도 싫습니다 int *a, b = 0; *c = &b, d, *e = &d, *f;// 어휴 끔찍해 ● 모든 자료형에는 배열형/포인터형이 있습니다. ● 배열 포인터/포인터 배열/포인터 포인터 ● 포인터의포인터의포인터의... ● 여기가 포인터의 끝이 아닙니다! 예고) 상수 포인터, 구조체,사용자 지정 자료형, 함수 포인터
  • 40.
        ● 참조에의한 호출(call-by-reference)? ● 사실, C에는 그런거 없습니다. ● Reminder : 포인터 변수, 즉 포인터는 값(value)입니다. ● 그러니까, 실은 저것도 일종의 값에 의한 호출(call-by- value)입니다. ● 컴퓨터 구조에서는, 자료의 위치도 자료가 될 수 있습니다. ● 정확한 명칭 : 주소에 의한 호출(call-by-address)
  • 41.
        ● 상수자료형 ● const type name_var ; //==type const name_var ; ● 모든 자료형은 상수형을 가집니다. ● 포인터도요. ● 포인터도요. ● ...Here comes a new challenge!
  • 42.
        ● 상수포인터와 포인터 상수 ● const type * name_conptr ; // == type const * name_conptr ; ● type * const name_ptrcon ; ● const * : 상수를 가리키는 포인터 ● * const : 포인터인데 상수 ● ...헷갈립니다.
  • 43.
        ● constint == int const ● const int* : 상수 int형을 가리키는 포인터 ● Int const * == const int* ● * const : 포인터가 상수 ● int* const니까 const인 int*
  • 44.
        ● int*ptr1, const* ptr2, *const ptr3; //…? 이렇게 쓰지 맙시다! 다시 말하지만 전 이 문법이 너무나도 싫습니다 ● type const * const name_conptrcon ; ● 상수를 가리키면서 상수인 포인터 ● 이걸로 끝입니다...? ● ...here comes another challenge!
  • 45.
        ● 더블포인터와 const가 만났습니다! ● type const ** name_ptr1 ; ● type * const * name_ptr2 ; ● type ** const name_ptr3 ; ● ...세상에 맙소사!
  • 46.
        ● ...다음주제로 넘어갑시다!/ ● 구조체 ● 다양한 형태를 가진 여러 자료를 하나의 자료로 모아줍니다. ● 자료들을 모은 자료형 그래서 자료형 바로 뒤에 나왔습니다.
  • 47.
        ● struct[name_struct] { [declaration of data1] //… }[name_var] ; //세미콜론 빼먹지 맙시다! ● 멤버 변수에 접근 : name_var . name_mem
  • 48.
        ● 구조체안에 다른 구조체를 넣을 수도 있습니다. ● 모든 자료형은 포인터 자료형을 갖습니다 물론 배열도요 ● 구조체도 자료형입니다. 즉... ● -> 연산자 ● 자기 자신의 포인터도 넣을 수 있습니다.c.f.)연결 리스트 ● 아, 당연히 상수형도 갖습니다.
  • 49.
        ● struct변수 선언 : struct도 자료형이니까, 변수도 만 들 수 있습니다. ● struct name_struct var_name [ = {[member1, …]} ] ; ● 음... ● 일일이 구조체 이름 쓰는 것은 조금 힘듭니다. 그렇다기보다귀찮습니다
  • 50.
        ● 그래서typedef가 있습니다. ● 사용자 지정 자료형 ● typedef old_type new_type ; ● 포인터도 원하는 이름으로 선언할 수 있습니다. ● 여러분 편하라고 있는 겁니다. ● 운영체제간 호환성
  • 51.
        ● struct문법은다르게도 쓰입니다. ● 비트필드(bit field) ● struct name_struct { type name_mem1 : (constant) ; //… }[var_name] ; ● sizeof(type)만큼의 총 크기를 가지며, ● 각 멤버는 constant만큼의 비트로 구성됩니다.
  • 52.
        ● ...근데 어디다쓸까요? ● 파일 처리 ● 이미지 처리 ● ...등등 ● 이진 자료 처리에 유용합니다. 32개의 비트중에서 어디부터 어디까지가 어떤 데이터이고...
  • 53.
        ● 공용체 ● unionname_union { //... ● 생긴건 구조체와 비슷합니다. ● 차이 1) 멤버들이 같은 저장소를 공유합니다. ● 차이 2) 공용체 변수 하나의 크기는 가장 큰 멤버의 크기
  • 54.
        ● 어떻게쓰죠? ● 구조체 안에 자료형 코드와 공용체 저장 → 여러 형의 자료를 동시에 처리struct는...비효율적입니다 ● union 안에 비트필드와 부호없는 정수 저장 → 2진 코드를 다루기 편해집니다.
  • 55.
        ● 열거형 ●이름이 붙은 정수집합 ??? ● 바로 예시를 들게요 ● Enum name_enum { name_mem1 [ = (integer constant) ] ,* //… }[name_var] ;
  • 56.
        ● 요일,월 등 sun, mon, tue, … / jan, feb, mar, apr, ... ● 색깔 코드 지정 black = 0x000000, red = 0xff0000, … ● 상태 / 조건 ● 오류 코드#define쪽이 더 많이 쓰이는듯 합니다 ● 등등...
  • 57.
        ● ...자료형은여기까지입니다. ● 자동 형 변환은요? 안할껍니다 모든것을 명시적으로 쓰면 문제 없습니다!제 사견입니다. ● 몇가지가 더 있긴한데... ● size_t // 보통 unsigned int ● volatile type name_var ; type * restrict name_ptr ;//C99~
  • 58.
        ● 연산자! ●이항 산술 연산자 : +, -, *, /, % ● 단항 산술/증감 연산자 : +, -, ++(전,후), --(전,후) ● 비교 연산자 : ==, !=, <, >, <=, >= ● 논리 연산자 : !(단항), &&, ||
  • 59.
        ● 비트논리 연산자 : ~(단항), &, |, ^, <<, >>(시프트 연 산자) ● 이것들은 어디에 쓸까요? ● 이진 정보를 처리할 때 씁니다. ● 이미지 처리,파일 처리, 암호화, … ● 비트필드와 같이 쓰시면 좋습니다. 이름만 봐도
  • 60.
        ● 포인터연산자 ● *, &(단항), [] ● [] : 인덱스 참조(구독)연산자 ● array[0] 이면 배열의 첫번째 ● 0[array]? ● 정상 실행됩니다! ● ?!
  • 61.
        ● ptr[value]== *(ptr + value) ● array[0] 이면 *(array + 0) 이며, *(array)이 되서 결국은 배열의 첫 값입니다. ● 0[array] == *(0 + array)니까, 헉? ● 놀랍군요!
  • 62.
        ● 구조체연산자 : ‘.’, ‘->’ ● var_struct .name_member ; // 멤버 접근 ● -> == (*( )). ● ptr_struct -> name_member ; //포인터가 가리키 는 구조체의 멤버 접근
  • 63.
        ● 그외 여러가지 ● 우선순위, 결합순서 괄호 잘 치면 외울 필요 없읍니다 ● ? : 란 것도 있었죠삼항 논리 연산자 ● sizeof(type), sizeof(value) //size_t형을 반환합 니다. ● 명시적 형 변환(type)
  • 64.
        ● 콤마(‘,’)연산자! ●함수 호출 연산자! ● func_name([parameter1, …]) : ()부분이 연산자 입니다. ● 지금 알아두시면 나중에 좋은 일이 생깁니다. C++ : “안녕, 난 시쁠쁠이야! 얘는 내 친구인 연산자 오버로딩이라고 해!”
  • 65.
        ● 제어문 ●조건문 : if문과 else문, switch문과 break문 ● 반복문 : while문과 do~while문, for문 ● 별로 어려울건 없...습니다.
  • 66.
        ● 몇 가지알아두면 좋을(지도 모르는) 것들 ● Else if문은 사실... ● switch문은 사실... ● for문도?!
  • 67.
        ● break,continue ● goto ● 배우기로는, 쓰지 말라고 배웠습니다. ● 하지만, 알고는 있어야 합니다. ● 복잡한 루프 탈출 에초에 만들지 말았여야 합니다만 ● 한편, 저 아래에서는...
  • 68.
        ● 함수(function) ●뭔지는 다 알거라 믿어요 ● 재귀 호출 ● void! ● void([argument1,...]), type(void)
  • 69.
        ● main함수 ●main도 함수입니다! ● 함수는 인자를 받고 값을 반환합니다 ● ...main도 말이죠!
  • 70.
        ● main이받는 값은? Int main(int argc, char* argv[]);//char** argv ● main이 반환하는 값은? EXIT_SUCCESS // <stdlib.h>에 정의되어 있습니다 대다수는 0 c.f.) EXIT_FAILURE // 대부분 1
  • 71.
        ● 함수포인터 ● 함수의 위치를 저장하는 포인터 입니다. ● Fact : 함수도 메모리 위에 올라가는 자료이다. ● func_return_type (*name_ptr) ([type_argument1,…]); ● ptr_func = name_func ;
  • 72.
        ● 왜필요할까요? ● void qsort(void* base, size_t num, size_t size, int (*comp)(const void*,const void*)); //<stdlib.h> ● 함수를 변수로 처리해야 할 때도 있습니다. ● OOP?
  • 73.
        ● 다음에볼 것은... ● printf입니다! 음? 많이 봤잖아요 ● printf(“%d + %d = %dn”, a, b, a+b); ● printf도 함수니까 인자를 받습니다. 아, 함숫값도 반환해요! ● 몇 개까지 받을 수 있을까요? ● ...잠깐, 애초에 한개만 줘도 잘 되잖아? ● …?!
  • 74.
        ● printf의선언을 보면... ● int printf(const char*, …); ● … : 이건 뭘까요? ● 가변 인자 함수
  • 75.
        ● 가변인자 함수(variadic function) ● <stdarg.h>가 필요합니다. ● va_list : 가변 인자 목록을 저장하는 자료형 ● va_start (va_list ap, parmN ); ● ap : va_list인 변수 / parmN : 첫 번째 인자 ● va_arg (va_list ap ,(type) ); ● 다음 인자 접근 → type형의 자료로 리턴 ● va_end(va_list ap)
  • 76.
        ● 다음은전처리기! ● 전처리, 앞에서 처리합니다. ● 컴파일 전에 컴파일러가 실행하는 코드입니다. ● #include, #define ● 다 아는것들 아니냐고요? ● ...정말로요?
  • 77.
        ● #include( < or ”) (string of filename) ( < or “ ) ● include : 포함하다, 포함시키다 ● 포함 시킵니다. ● 다르게 말하면, 코드 내용을 복사해서 포함시킵니다. ● Prob1) 컴파일된 목적 파일의 크기가 늘어납니다. ● Prob2) 컴파일한 두 파일이 같은 이름의 변수라도 가 지고 있다면...?!
  • 78.
        ● #defineidentifier [token_string] ... ● 매크로 문법이라고도 불리죠 ● Identifier 를 token_string으로 바꿔줍니다. ● 단순히 교체합니다 → 실수에 주의! ● ...고작 이거면 말꺼내지도 않았지요
  • 79.
        ● 매크로함수! ● #define identifier[(idf_para1, …)] token_string //token_string : (string) + idf_para1 + (string) + ... ● identifier((something1, …) 에서 something1을 idf_para1, … 자리에 놓고 token_string으로 교체 ● 주의 : identifier와 괄호 사이에 띄어쓰기 꼭 합시다! ...를 (1)이라 합시다.
  • 80.
        ● # 연산자: 토큰 문자열에 들어가며, #뒤의 인수 하나를 문자열로 바꿉니다. ● #define identifier(idf_para1,[...]) [token]... #idf_para1 [token]… ● 양 끝에 큰따옴표 추가 ● , ‘ , “ , % 등은 , ’, ”, %% 등으로 변환 ...를 (2)라 합시다.
  • 81.
        ● ##연산자 ● 두 토큰을 연결해 줍니다. ● #define identifier[(idf_para1[, …])] [(token)…] token ## token [(token)...] //-> tokentoken ● 보통 (1)과 조합해서 씁니다. ...이것을 (3)이라 합시다.
  • 82.
        ● (1) +(2) + (3) 으로...? ● 온갖 것들이 가능합니다! ● 쓰기 좋은 입출력 함수라던가... ● 자료형 신경안쓰고 코딩하기 대신 처음에 신경쓸게 많아집니다 ● 기본 라이브러리를 뜯어보면...
  • 83.
        ● #ifwith #elif, #else, #endif ● 조건부 컴파일 ● #if (condition) //… [#elif or #else] #endif ● (condition) : 상수와 연산자, defined 지시자, 정의된 식별 자로 구성
  • 84.
        ● #include얘기할 때... ● 중복 인클루드 방지 ● 중복 정의로 인한 오류 방지 ● 호환성 ● 디버그 모드 ● ...
  • 85.
        ● #ifdef,#ifndef, #undef ● #ifdef or #ifndef identifier ● #deifne과 함께 사용합니다. ● #define identifier : identifier를 식별자로 정의만 합니다. ● Identifier 가 정의되어 있으면 실행 ● #undef identifier : identifier의 정의를 해제합니다.
  • 86.
        ● #error ● 에러를터트립니다! ● 어떻게 쓸까요? ● #pragma ● 컴파일러에게 직접 명령을 내립니다. ● 명령어는 컴파일러마다 다릅니다. ● #pragma warning(disable : 4996) VS가 또...
  • 87.
        ● 동적 메모리할당 ● 그 유명한 malloc이요 ● void* malloc(size_t size); ● 함수 외부 (힙 영역)에 메모리를 할당하여, 시작 지점의 포인 터를 반환합니다. ● 사실 더 자세한 구동 원리가 있지만... ● 잊지말고 free();
  • 88.
        ● void포인터로 반환 → 형변환을 추천합니다. ● size를 넣을때 : 일일히 계산하기 어려우니 sizeof() ● (int*)malloc(sizeof(int) * LENGTH_ARR); ● 아휴 복잡해 ● 게다가, malloc은 할당한 공간을 초기화해주지 않습 니다!for문까지 돌려야되요! ● ...그런 당신을 위한 calloc!
  • 89.
        ● void*calloc(size_t num_memblk, size_t size_blk); ● num_memblk : 자료의 개수 ● size_blk : 자료 하나당 크기 ● calloc으로 할당된 공간은 0으로 초기화됩니다!
  • 90.
        ● 기타 주제 ● static: 정적 변수 ● 프로그램 시작시 공간을 확보합니다. ● extern : 외부 참조 변수 ● 파일 외부에서 변수를 참조할 때 사용합니다. ● File I/O : 학교에서 잘 배울겁니다. 과제를 위해서라도
  • 91.
        탈락한 주제들 ●인라인 함수 : __inline ● 레지스터 변수 : register ● __asm ● malloc 작동 원리 ● trigraph ● volatile ● Restrict ● stdin/stdout ● thread, _Atomic ● 익명 구조체/공용체 ● _s functions ● socket programming ● XOR swap ● 함수 호출 규약 ● redirection ● ...
  • 92.
        ● 끝! ●질문받습니다 답변 가능성은 보장되지 않습니다 references from wikipedia.org cppreference.com msdn.microsoft.com soen.kr stackoverflow.com Playing with C 우균,창병모 저 교보문고