전 처리기 ‘전 처리기‘는 말 그대로, 처리하기 ’전‘에 뭔가 처리하는 것이다.(=선행처리기) 이것은 compile(컴파일)에서 컴퓨터 언어를 번역할 때, 번역하기 전에 처리할 것을 기술하는 것이다. ’전 처리기‘의 특징은 #이 맨 앞에 붙는다. 지금까지 배웠던 #이 달린 헤더파일도 모두 ’전 처리기‘에 해당된다. ‘전 처리기’의 대표적인 예로는 지난시간 사용한적 있는 Symbolic constant(심볼릭 상수)의 정의를 들 수 있다. #define MAX 16이라고 하면, MAX이라는 변수가 16으로 만으로 정의돼서, 상수화 되는 것이다. 이때, 전 처리기 #define를 심볼릭 상수의 정의로 사용하게 된다. 매크로 #define을 매크로(Macro)로도 많이 사용한다. 매크로는 함수와 외형적으로 유..
파일 열기와 닫기 동적할당을 할 때, malloc()함수와 free()함수를 써서 메모리를 확보하고, 해제했는데 파일도 똑같이, fopen()함수로 파일을 열고, fclose()함수로 파일을 닫을 수 있다. fopen()함수는 보안결함이 있어서 윈도우에선 fopen_s()이라는 대체함수를 사용한다. 반환 값으로 파일 구조체의 주소(포인터)를 반환한다. (에러일 경우엔 NULL을 반환) fopen()함수는 매개변수로, 2개를 받는데, 첫 번째는 열려고 하는 파일의 절대, 상대경로가 저장된 문자열, 두 번째가 ‘접근모드’가 기록된 문자열 2개의 주소다. 여기서 중요한 ‘접근모드‘는 읽기(read)의 “r", 덮어쓰기(write)의 "w", 추가해서 쓰기(append)의 ”a"가 있다. 그리고 이것을 갱신(쓰..
하드디스크드라이브(HDD)와 파일(File) 기본 이론 컴퓨터에는 CPU, RAM, HDD로 구성되어있었고, RAM, HDD(SSD)는 컴퓨터의 기억장치였는데, 지금까지의 메모리는 주기억장치인 RAM에서 변수를 선언하든, 동적할당을 하든 했었다. 그러면서 같이 말한 HDD의 파일은 나중에 한다고 미뤘는데, 그때가 지금이다. 보조기억장치의 메모리를 다루는 방법인 파일(File), 기본적으로 파일을 관리하는 체제인 파일시스템(File system)을 이용해서 미디어인, 보조기억장치를 사용한다. 그 파일이 ~.mp3나, ~.mp4같은 것들이다. 본격적으로 파일의 내용을 들어가기에 앞서, RAM(랜덤액세스메모리)과 HDD(하드디스크드라이브)의 차이점을 알아봐야 된다. 주 기억장치RAM은 용량이 적은 편이지만, ..
정렬 알고리즘 정렬 알고리즘이란, 불규칙적으로 나열되어 있는 값들을 일정 규칙으로 정렬하게 하는 알고리즘을 말한다. 쉽게 비유하면 줄을 맞춰서 세우는 것이다. 정렬 알고리즘은 쉽게 보면, 선택정렬과, 버블정렬이 있다. 그리고 여러 가지 정렬 등이 있지만, 그중 가장 많이 쓰이는 것이 퀵 솔트(Quick sort) 정렬이다. 퀵 정렬은 가장 활용성이 높고 좋아서, 많이 쓰인다. 쓰는 법은 65장 call back함수에서 나와 있으니 그렇게 알아두고, 선택정렬과 버블정렬을 알아보자.(퀵 정렬은 qsort( )인 선택정렬을 대신해주는 함수로 쓸 수 있다. 매개변수는 (배열이름, 크기, sizeof(자료형), 반환을 받는 함수)로 이루어졌으며, 반환함수에서 받은 값을 포인터로 강제 형변환 하고, 두 값을 서로 ..
자료구조 자료를 책이라고 한다면, 자료구조는 책의 나열 방법이다. 만약 큰 서점에서 책을 아무렇게나 나열하면 어떻게 될까? 아마 어떤 책을 찾는데, 엄청 많은 시간이 걸릴 것이다. 그러나 규칙에 따라 나열하면, 찾기도 쉽다. 자료구조도 마찬가진데, 검색을 용이하게 하기위해서 일정 규칙으로 나열하는 것이다. 그래서 컴퓨터의 자료를 효율적으로 관리, 구조화하는 것이 목적인 내용이다.(사실 강의에서는 자료구조를 자세히 다루지 않으니, 추가로 배우자하면 자료구조와 관련된 책을 읽는 것이 좋다.) 주로 자료구조는 정렬, 검색, 인덱스 처리, 파일편성 같은 것에서 효율을 필요로 할 때 쓰인다. 선형, 비선형 자료구조는 크게 선형과 비선형, 2가지로 나뉜다. 선형에는 Stack(스택), Queue(큐), Deque(..
비트필드 비트필드는 간단하게, 1byte를 8bits로 쪼개서 보는 구조체다. 코드를 보면 unsiged char자료형의 맴버가 4개가 있는 구조체다. (각각 main, left, right, top의 이름을 가지고 있다.) 이 구조체에서 맴버의 초깃값이 main=0, left=3, right=7, top=1이다. 이것을 비트로 쪼개면 어떻게 될까? 비트(bits)는 예전의 2진수를 떠올리면 된다. 1,2,4순으로 자릿수가 올라간다. 그러므로 이것을 그림으로 그리고, 숫자를 표현하자면, 오른쪽과 같다. 00111110을 다시 16진수로 표현하면 4비트씩 끊어서 해석하므로 ‘0×3E’가 된다. 이때, 초깃값을 따로 불러서 대입한다면, 맴버 main은 0~1의 범위를 벗어나면, 값이 기록이 되지 않고, 나머..
자기참조 구조체 구조체는 구조체인데, 자기자신을 가리키는 포인터가 구조체의 맴버로 들어가 있는 구조체를 ‘자기참조 구조체‘라고 한다. 이때, 그 자기참조 구조체의 한 덩어리를 모드(Node)라고 한다. 이 모드가 자기참조를 하면 부를수록 반복이 될 텐데, 그때의 구조체의 반복되는 구조를 ‘연결 리스트‘라고 한다. 예시 바로 지난강의의 typedef로 사용자 지정 자료형을 만드는 예제 코드다. 이때, char szName[16]과 char szPhone [16]과 구조체의 맴버로 포함 되어있는데, 추가로 *pNext, pNest포인터도 맴버로 포함 된다. 이 포인터가 구조체를 가리킨다면, 아래의 ‘연결 리스트’ 구조가 된다. 예시 활용 USERDATA user = {5, "Hoon", NULL}이라고 하고..
구조체 구조체는 하나의 메모리 블록을 다양한 데이터 형으로 분할, 조합해서 사용하게 구조화된 자료형이다. 배열처럼 여럿이 모여서 하나를 이룬 것이다. 구조체는 배열과 비교해서 볼 수 있다. 배열은 int같은 같은 자료형이 n개 뭉쳐있는 것을 말하고, 구조체는 다른 자료형이 n개 뭉쳐있는 것을 말한다. 그 자료형이 다양한 것을 뭉쳐서 새로운 자료형을 만드는 것까지가 구조체다. int[3]으로 배열이 int롤 3개 뭉쳐있으면, 4바이트*3개해서 12개라고 한다. 이것이 char[12](1바이트*12개)와 같다고 볼 수 있는데, 이것이 구조체와 차이점은, 전자는 간격이 균등하고 후자는 간격이 일정하지 않은 것만 다르다. 사실은 그것 말고는 같다. (물론 구조체는 ‘맴버 접근연산자’가 새로 붙기는 한다.) 구조..
함수 호출규약 ‘Calling convention‘ (콜링 컨벤션) 이라고 부르는 함수 호출규약은, __cdecl 와 __stdcall 그리고 __fastcall 이 있다. 이 셋은 다 매개변수의 전달에 관련돼있다. 지난시간 매개변수는 오른쪽 매개변수부터 왼쪽 매개변수 순으로 스택에 저장된다고 했었다. 그걸 메모리 그리는 방법에서 부터 배웠었다. 그럼, 선언된 매개변수는 누가 해제할까? 그것을 표시해주는 것이 __cdecl, __stdcall, __fastcall이다. 예시 영상의 예제를 보면, int Add (int x, int y)의 함수가 나온다. 이때, 스택의 순서는 오른쪽부터해서 int(4바이트)형 매개변수가 2개(*2)니까 8바이트가 되는데, 이것을 포함하고, 그 쌓인 스택을 정리하는 것이 C..
버퍼 오버 플로우, 오버런 지난강의동안 많이 언급된 것 중하나가, 보안결함일 것이다. 이것이 ‘Buffer over flow’(버퍼 오버 플로우)인데, 이것이 오늘 배울 Overrun(오버런)이다. 오버런은 지난시간에 배운 적이 있다. 변수에 값을 넣어줄 때, 변수의 메모리크기보다 더 큰 값을 넣어주면 오버플로우, 정보가 변수를 넘어져서 기록된다. 이때, 부르지도 않은 다른 변수의 값이 정보가 넘친 만큼 변경될 수 있는데, 이것이 오버런이다. 이때 이런 것이 일어나는 함수는 보안결함이 있다고 했는데, 그 이유는 이걸 의도해서 해킹에 쓸 수 있기 때문이라고도 지난시간에 배웠다. 예시 puts로 여러 문자열을 출력하고, 그사이에 함수를 호출해서, 그 함수는 printf로 매개변수로 받은 값을 printf()..