라이브러리, 동적, 정적 함수를 비유할 때, 도구, 부품이라고 했었다. 여기서 도구는 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함수가 있..
재귀호출(Recursive call) 함수 안에 함수를 부르면 어떻게 될까? Caller(함수를 호출하는 함수)와 Calllee(호출되는 함수)가 같게 될 수가 있냐면, 가능하다. 재귀호출은 반복문에서 Stack을 더한 것과 일치한다. 논리구조는 반복문이고, 자료구조에 Stack이 합쳐진 경우다. 재귀호출도 반복문이기 때문에 반복횟수가 중요하다. 그냥 반복이 안 끊어지게 코드를 짜면 무한루프를 타다가 프로그램이 죽어버린다. 그러기에 반복문의 형식을 챙겨줘야 된다. 첫 번째로, 계수의 부분은 ‘함수이름‘(값);으로 할 수 있다. 이 경우, 값이 바로 인수가 돼서 함수가 스스로 호출되기 때문에 이때 반복이 생긴다. 여기서 값을 ++,--로 증감연산자를 붙여서 계수를 해줄 수 있다. 두 번째로, (조건식)반복..
형 한정어 형태를 변하지 않는 값으로 만드는 것을 형 한정이라고 전에 배운 적이 있었다. 여기서 배울 형 한정어에는 두 가지가 있는데, const(콘스트)와 volatile(발로틀)키워드다. 여기서 const는 상수화를 해주고, volatile는 결론이 (컴파일러가) 최적화를 하지 않는다고 정해주는 것이다. 이 둘은 변수선언에 쓰이게 된다. const 형 한정어 const는 c언어는 모르지만, c++에서 중요하게 쓰인다. 변수선언 시에 앞에 const를 붙여주게 되면, Readonly(읽기전용)이 되는 것이다. 그래서 변수의 초깃값을 정해주면 그 상태로 상수처럼 된다. 사실 const가 붙은 변수는 상수와 똑같기 때문에 이름이 있는 상수라고 해서, ‘심볼릭 상수’라고도 한다. const는 위의 경우보다 ..
저장공간 Register, Stack, Heap, Data 컴퓨터에는 CPU, RAM, HDD가 있다고 했다. 여기서 기억장치는 RAM과 HDD가 있었다. 그리고 추가로 CPU에도 Register(리지스터)라는 저장 공간이 존재한다.(그러나 이 메모리는 매우 소량의 메모리로 직접 쓰는 일은 거의 없다) 메모리는 RAM에서는 3가지를 쓸 수 있다. RAM의 3가지 저장 공간은 Stack(스택), Heap(힙), Data(데이터)다. 여기서 스택과 데이터는 변수선언으로 메모리를 확보한다. Heap(힙)은 그와 다르게 동적할당이다. 이 때 스택의 메모리를 사용하려면, auto가 필요하다. 동적할당은 전에 배웠듯이 malloc()를 사용하고, 데이터는 static다. CPU에 달린 레지스터를 써먹는 것도 reg..
유틸리티 함수 유틸리티 함수란, c언어에서 핵심은 아니어도, 여러 가지의 계산과 처리를 대신해주는 라이브러리 함수다. 유용하게 쓰이기 때문에 잘 숙지하는 것이 중요하다. atoi()함수는 정수 문자열을 정수로 변환하는 함수다. (Ascii to Interger(정수형)의 약자다)문자열이 저장된 메모리 주소가 매개변수 값이 되며, 문자열 “123”이 있으면, 그것을 실제 정수 123으로 변환시킨 값을 반환한다.(“ABC"같은 것은 정수로 변환불가다. 변환에 실패하면 0을 반환한다.) 이것도 보안결함이 찾아보면 있다, atol()함수는 long형 숫자의 문자열을 long 숫자로 변환하는 함수고, atoi()처럼 매개변수의 값이 문자열의 메모리 주소고, 변환하는 것도 문자열(long자료형)을 숫자로 만들어준다..
지난시간 내용 복습 문자열은 char[ ]라는 배열이라고 했다.(“Hello")물론, 유니코드로 표현하면wchar_t[ ]가 된다.(L"Hello") 배열이지만, 이름이 없는 것이 문자열의 중요한 내용 이였다. 이 점을 잘 이해했다고 가정하고 들어간다. 지난시간은 문자 처리함수도 추가로 배웠는데, isalpha(), isdigit()...와 toupper()같은 문자를 검사하거나 소문자를 대문자로 바꾸는 함수들을 배웠었다. 이번 강의에는 문자가 아닌 문자열의 처리 함수에 대해 배운다. 이 모든 것을 이해하고 강의를 들어가자. 문자열 처리함수 sprintf()함수는 매우 심각한 보안 결함을 가지고 있다. 그럼에도 함수를 알아보자면, 어느 메모리에다가 정보를 메모하는 함수다. 매개변수는 printf의 매개변..
들어가기에 앞서 복습 요번, 다음 강의인 12, 13장은, 깊이 파고들만한 중요한 내용이 아니고, 이런 것이 있는 것을 알아보는 수준이다. 그래도 아직 중요한 내용은 뒤에 많이 남았으니, 끝까지 집중해서 공부하도록 하자. 영상에서 들어가는 복습도 확실히 하자. 복습하자면, 자료형은 정수와 실수로 나뉘고, 정수에는 char, short, int가 있고, 실수는 float, double가 있었다. 여기서 중요한 것은 char는 문자로 ASCII(아스키코드)인데, 이때 문자의 본질이 정수라는 것이다. 이 문자 상수의 char로 ‘A'는 int로 표현하면 65가 된다. 이 둘이 같은 정수계열의 자료형이다. 문자열과 문자열 상수 그럼 문자열이란 뭘까? 문자열 상수는 있나? 답은 없다. 문자열상수라고도 볼 수 있기..
용어의 정리 우선 매개변수의 전달방식을 들어가기 전에 용어 정리를 하자. main함수, gets함수, putchar함수가 있다면, main이 두 함수를 호출한 관계가 돼서, 호출을 Call, 호출하는 함수인 main을 Caller, 호출되는 함수인 gets, putchar를 Callee라고 한다. 이때 함수를 호출할 때 필수로 들어가는 매개변수가 있는데, 이 안에 인수, 인자가 들어가게 된다. 이때 중요한 점은 매개변수의 값을 결정하는 것이다.(초기화라고 한다) 지난시간 이미 배웠다. Caller가 매개변수의 초기화를 해주는 것을 말이다. gets를 보면 (매개변수)로 입력된 값이 저장될 주소 값을, putchar는 (매개변수)에 출력할 값(65를 넣으면 A가 아스키코드의 값)이 된다. 매개변수의 전달방..
함수의 목적 함수의 설계원칙을 들어가기 전, 함수의 쓰이는 이유부터 살펴봐야 되는데, 우선 함수의 쓰임은 도구로 쓰이는가, 부품으로 쓰이는가에 따라서 각각 SDK(소프트웨어개발키트)와 사용자 정의함수로 나뉜다고 했다. 그럼 함수로 만드는 이유는 뭘까? 첫 번째는 반복을 함수로 쓴다. 반복이라고 하면 이미 반복문이 있는데, 왜 함수를 쓰는가 하면, 반복횟수가 일정하지 않는(가변)경우엔 반복문이 용이하지 않다. 아에 그래서 구조를 함수로 간추려서, 불규칙한 반복을 함수로 바꿔 쓰는 것이다. 두 번째는 분할하기 위해 함수로 쓴다. UI(사용자 인터페이스)와 기능을 서로 분리하는 이유인데, 한 기능으로 뭉쳐있는 코드를 따로 쪼개는 목적으로 쓰는 것이다. 예로 들면 프로그램의 번역문제가 있는데, 어떤 프로그램을 ..