● 우리는컴퓨터를 배웁니다.
● 배우려면, 컴퓨터를 이해해야 합니다.
● 이해하려면, 컴퓨터와 대화해야 합니다.
● 대화하려면, 말을 배워야합니다.
● 하지만 0 과 1은 어렵습니다. 우리같은 평범한 사람들은요...
● 그런 이유로 프로그래밍 언어를 배웠습니다. 고급 언어라교 했었죠
● 근데, 그게 꼭 C언어여야만 할까요?
10.
● 사람이쓰는 말(자연어)는, 자연스럽게 만들어 졌습니다.
→ 의사소통 이외의 특별한 목적을 띠지 않습니다.일반적으로
● 프로그래밍 언어는 인공적으로, 특별한 목적을 가지고 만
들어졌습니다. 간혹 어처구니 없는 목적일때도 있습니다...
● 목적을 알면, 왜 배우는지 알 수 있지 않을까요?
● 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!
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는 다른 언어이고, 심지어 더 이상 포함 관계같은 것
도 없습니다! [출처 필요]
● ...왜이렇게 되었을까요?
● 옛날에는, 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
● … 그런데 말입니다
● 배열/포인터
●포인터 지금쯤 다 배웠죠?
● 포인터 연산자들 : *, &, [] //연산자 볼 때 다시 봅시
다
● 배열은 상수인 포인터라 볼 수 있습니다.
● 배열 선언할 때 []안에 변수 넣을 수...
● 있습니다(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 : 포인터인데 상수
● ...헷갈립니다.
● 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진 코드를 다루기 편해집니다.
● 요일,월 등 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~
● 함수포인터
● 함수의 위치를 저장하는 포인터 입니다.
● 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) 컴파일한 두 파일이 같은 이름의 변수라도 가
지고 있다면...?!
● 매크로함수!
● #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)라 합시다.
● 끝!
●질문받습니다 답변 가능성은 보장되지 않습니다
references from
wikipedia.org
cppreference.com
msdn.microsoft.com
soen.kr
stackoverflow.com
Playing with C 우균,창병모 저 교보문고