'템플릿(template)'은 타입을 추상화하는 방법입니다. 타입을 추상화한다는게 무슨 말일까요? 아래 예제는 정수 값을 담을 'Array 컨테이너'입니다. class Array { private: int* buf; int size; // 원소의 개수 int capacity; // 저장 가능한 메모리 크기 public: explicit Array(int cap = 256) : buf{ nullptr }, size{ 0 }, capacity{ cap } { buf = new int[capacity]; } ~Array() { delete[] buf; } void Add(int data) { if (size < capacity) buf[size++] = data; } int operator[](int inde..
'함수 객체(Functor)'를 유용성을 알아보기 위해서는 먼저 '함수 포인터를 이용한 콜백 메커니즘'을 알아봐야합니다. 여기서 '콜백 메커니즘'이 뭘까요? '콜백 메커니즘'의 개념을 설명하기 위해선 '서버 코드'와 '클라이언트 코드'의 개념이 필요합니다. 서버 코드: 기능이나 서비스를 제공하는 코드 클라이언트 코드: '서버 코드'가 제공해주는 기능이나 서비스를 사용하는 코드 간단한 예제를 살펴보겠습니다.d // 서버 코드 void Print() { cout
C++의 '자원 핸들(자원 관리 메커니즘)'의 핵심은 생성자와 소멸자입니다. 간단한 '스마트포인터 컨테이너'를 만들어보면 쉽게 이해할 수 있습니다. class Point { private: int x; int y; public: Point(int _x = 0, int _y = 0) : x{_x}, y{_y} {} void Print() const { cout
배열의 두 번째 요소에 접근하고싶다면 'a[1]'와 같이 표시해줄 수 있습니다. 여기서 '[]' 이 대괄호 표시를 '배열 연산자'라고 정의합니다. 간단한 '배열 컨테이너'를 만들어보면 그 쓰임새를 쉽게 파악할 수 있습니다. class Array { private: int *arr; int size; int capacity; public: Array(int cap = 256) : arr{nullptr}, size{0}, capacity{cap} { arr = new int[capacity]; } ~Array() { delete[] arr; } int GetSize() const { return this->size; } void Add(int data) { if (size < capacity) arr[siz..
아시다시피 'const'의 기본 컨셉은 '해당 값을 변경하지 않는다.' 입니다. 하지만 위치에 따라 그 범위와 가리키는게 약간씩 차이가 있어서 헷갈리기 쉽습니다. class Point { private: int x; int y; public: Point(int _x = 0, int _y = 0) : x{_x}, y{_y} {} void Print() const { cout
네트워크 인터페이스에 관한 정보를 알고 싶다면 ioctl() 시스템콜을 사용할 수 있습니다. 전형적인 운영체제는 2계층으로 나뉩니다. User Space(사용자 모드)와 Kenel Space(커널 모드). User Space에 상주하는 애플리케이션이 Kenel Space에 존재하는 자원을 사용하고자할 땐 시스템콜을 이용합니다. 참고로, System Call Function은 내부적으로 System Call Vector와 대응됩니다. 예를들면, exit()함수는 System Call Vector Number: 1번 write()함수는 System Call Vector Number: 4번. 전형적인 운영체제의 커널은 수 백개의 System Call Vector를 제공합니다. ioctl() 시스템콜은 디바이스..
Reserved Names C언어는 클래스 단위가 아니고, 전역변수나 함수들이 존재하기 때문에 엄격한 이름 규칙(Naming Convention)이 필요하다.다음과 같은 상황을 가정해보자 1. 여러 헤더파일을 포함시킬텐데, 포함시킨 헤더파일들에서 함수명 || 매크로명 || 전역변수명이 중복 선언되었다면? 2. 포함시킨 헤더파일과 내 소스코드에서 함수명 || 매크로명 || 전역변수명이 중복되었다면? 이를 방지하기위한 규칙 1. __(Double Underscroe), A_(대문자+Underscore)는 예약된 이름으로 사용한다. 2. is || to로 시작하는 이름은 테스트를 하거나 변환하기위한 용도로 사용한다. 3. LC_로 시작하는 이름은 추가적인 로컬 매크로 정의를 위해 사용한다. 4. SIG로 시작..
C 프로그램의 컴파일 과정 C 소스코드를 짠 후 컴파일을 하게되면 다음과 같은 4가지 일이 일어난다. 1. 전처리 ( Preprocessor ) 2. 컴파일 ( Compilation ) 3. 어셈블리 ( Assembly ) 4. 링킹 ( Linking ) 컴파일 과정을 테스트해보기 위해 간단한 test.c 프로그램을 작성한다. #include // Comment #define STRING "Test String" #define COUNT (5) int main() { int i; for (i=0; i test.txt 다음으로 2번째(컴파일) 과정을 진행한 후의 결과를 확인하기 위해선 gcc -S 옵션을 사용한다. gcc -S test.c gcc -S 옵션을 주어 컴파일을 하게되면 'test.s' 라는 어..
쓰레드( Thread ) #1 쓰레드란 프로세스의 작업을 처리하는 '일꾼'같은 개념이다. 프로세스는 프로그램을 수행하기 위해 필요한 데이터와 메모리, 쓰레드로 구성되어 있으며, 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드이다. Java에서 쓰레드를 구현하는 방법은 2가지다. 1. Thread클래스를 상속받는 방법 2. Runnable인터페이스를 구현하는 방법 일반적으로 Runnable인터페이스를 구현하는 방법을 많이 사용한다. 아무래도 클래스를 직접적으로 상속받는 것보단, 인터페이스를 구현하는 편이 상대적으로 유연한 관계를 만들 수 있고, Thread클래스를 상속받게되면 다른 클래스를 상속받을 수 없기 때문이다. class ThreadEx { public static void ma..
C - 동적 메모리 할당 ( Dynamic Memory Allocation ) 1. 프로세스의 메모리 구조 2. malloc(), calloc(), realloc(), free() 1. 프로세스의 메모리 구조 프로그램이 실행되어 메모리에 올라가면 프로세스가될텐데, 이때 프로그램은 다음과 같은 구조로 메모리에 올라간다. Text section Text 영역 또는 Code 영역이라고하는 이 영역은 프로그램의 소스코드가 올라가는 영역이다. 이 영역은 'read only'인데 그 이유는 프로그램 코드 변조를 예방하기 위해서이다. Data section 초기화된 전역변수나 static변수가 저장되는 영역이다. BSS 초기화되지않은 전역변수나 static변수가 저장되는 영역이다. 물론 전역변수에 명시적으로 값을 대..
C - File I/O 1. File open + read || write + close 2. Reading and Writing strings to a file 3. Reading and Writing binary to a file 들어가기에 앞서File I/O 함수들을 이해하기 위해선 컴퓨터의 입/출력에 대한 이해가 기반이 되야한다.입/출력에 대한 모든 내용을 그림으로 살펴보면 아래와 같다. 스트림(Stream)?입/출력을 배우면 항상 나오는 개념이 바로 스트림이다. 표준 입/출력 장치를 예로들면, 키보드와 모니터는 각각 독립된 장치인데 어떻게 키보드에서 입력을 받은 데이터를 모니터로 출력해줄 수 있는 걸까? 바로 스트림이 둘 사이를 연결시켜놓아기 때문이다. 정확히 말하면 키보드에서 입력받은 데이터는..