하드디스크드라이브(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()..
라이브러리, 동적, 정적 함수를 비유할 때, 도구, 부품이라고 했었다. 여기서 도구는 Library(라이브러리)와 SDK가 있다고 했는데, 이것이 CRL이였고, printf()함수도 여기에 속한다. 여기서 함수를 모아서 하나의 덩어리로 만든 것이 Library고, 이것을 끌어다가 printf()같이 쓰는 것이다. SDK는 약간 다르다. 아이폰, 안드로이드, 윈도우 등, 각각의 플랫폼 제조사에서 제공해주는 함수들이다. 사실 제조사가 제공해줄 때, 형태를 정해서 만들어 주는데, 그것이 라이브러리(Library)다. 라이브러리는 동적(Dynamic, 다이나믹)라이브러리와, 정적(Static, 스태릭)라이브러리가 있다. 여기서 동적라이브러리는 강의에서 다루지 않는다. 동적라이브러리는 DLL이라고 해서, 함수포인..
함수 포인터 함수는 이름이 원래 메모리의 주소라고 했다. 그럼 여기서 함수의 포인터는? 외우면 된다. int TestFunc(char*);같은 함수가 있다면, 함수 포인터는 int (*pfTest)(char*);같이 해주면 된다. 함수의 이름부분에, 괄호를 쳐주고, 앞에 *를 붙여준 다음, 함수포인터의 이름만 새로 지어주면 된다.(pfTest는 이름의 예시) 그리고 pfTest = TestFunc;로 주소를 대입해주면 된다.(이때 이름만 담으니, ( )는 빼준다) 여기까지는 쉽고, 이해할만 하다. 근데 어디다 써먹는지가 문제다. 콜 백(Call back) Callback함수의 가장 중요한 가정은 Callback함수를 만드는 사람과, 이것을 사용하는 함수를 만드는 사람이 다르다는 것이다. main함수가 있..