Programming Language/C, C++ 38

C++ 기본 자료형

C++의 기본 자료형은 정수, 부동 소수점, void의 세 가지 범위로 나누어집니다.- void : 비어있는 값으로 값을 리턴하지 않는 함수나 특정 형식이 정해지지 않은 데이터를 선언할 때 포인터로 활용됩니다.- https://msdn.microsoft.com/ko-kr/library/cc953fe1.aspx 자료형에 대한 크기를 잘 알아둬야 프로그래밍시 공간의 낭비가 없을 것입니다. 아래 표의 내용들은 MS자료를 바탕으로 작성되었기 때문에 VC++외 gcc 계열이나 다른 c계열에서는 크기가 다를 수도 있습니다. 종류자료형 크기 범위내용정수계열Char 1BYTE-128 ~ 127 문자열을 표현, ASCII unsigned char1BYTEsigned : -128 ~ 127unsigned : 0 ~ 255..

네임드 파이프 예제

Pipe는 두 프로세스를 잇는 통로입니다. 예를 들어, 두 개의 수조가 있고 그 사이를 파이프로 관통해 연결한다고 합시다.그럼 하나의 수조에 물을 채운다면 그 물이 파이프를 따라 흘러 또 다른 수조로 들어가게 되겠죠? 이처럼, 프로세스 간에도 Pipe를 연결한다면 원하는 정보를 다른 프로세스로 전달할 수 있습니다. Pipe에는 Named Pipe와 Anonymous Pipe, 두 종류가 존재하는데요. 간략하게 설명하면Anonymous Pipe : 이름없는 파이프, 한쪽 방향으로만 데이터 전송, 부모 => 자식 프로세스Named Pipe : 이름있는 파이프, 양쪽 방향으로 데이터 전송, 프로세스 프로세스 아래는 Named Pipe를 이용해 프로세스간 통신을 하는 코드입니다.- 출처 : http://ezb..

StrSafe 함수들

문자열 함수는 말 그대로 문자열을 버퍼에 담고 출력하는 함수입니다.주로 문자열 함수들은 문자열 버퍼의 포인터를 리턴하게 되는데요, 이 때문에 버퍼 오버플로우 현상이 일어날 수 있습니다. TCHAR* alphabet = "ABCDEFGH"TCHAR  buf[3];_tcscpy(buf, alphabet); 이와 같은 경우, 담을 수 있는 버퍼(2글자 + NULL)보다 큰 포인터가 들어오게 되고 이 버퍼 이후에 진행될 스택의 내용을 문자열들이 덮어버려 의도하지 않은 결과를 가져올 수 있습니다. 이런 문제를 보완하기 위해 Windows에서는 안전한 문자열 함수들을 제공하고 있습니다. strsafe.h 헤더를 포함시키면 사용할 수 있으며 그 종류들은 아래와 같습니다. 기존 함수안전한 문자열 함수  strcpySt..

C 데이터, 스택, 힙 영역

메모리 영역의 종류운영체제는 우리가 작성한 프로그램을 위한 메모리를 할당합니다. 그렇다고 무작정 할당해주지는 않고 용도에 따라 메모리 공간을 할당해 메모리의 효율적 사용을 가능하게 합니다. 그 종류로는 데이터 영역, 힙 영역, 스택 영역 이 있습니다.     데이터 영역데이터 영역은 전역변수, static 변수를 위한 메모리 공간입니다.이 둘의 공통점은 시작과 동시에 메모리에 올라가서 프로그램이 종료될 때 까지 남아있다는 것입니다.이런 변수들이 메모리의 데이터 영역에 지정됩니다.  힙 영역힙 영역은 필요할 때 동적으로 메모리를 할당하기 위한 영역으로 malloc 등으로 동적으로 선언된 변수들이 메모리 공간의 힙 영역에 저장됩니다.즉, 할당되어야 할 메모리의 크기를 실행 시간 도중에 결정해야 할 경우가 이..

C++ Volatile 키워드

Volatile 키워드휘발성, 그 뜻 그대로 언제든지 그 값이 변할 수 있음을 의미합니다.const 키워드와 함께 변수의 성질을 바꾸는 역할을 하는 타입 한정자입니다. 하지만, 그 사용빈도가 낮아 책이나 자료들에서도 잘 다루어지지 않는 키워드입니다.- 타입 한정자 (const도 마찬가지) : 타입에 특정 속성을 더해주는 키워드volatile 키워드가 지정된 변수는 최적화를 수행하지 않습니다. 변수의 최적화변수의 최적화는 말 그대로 최적화를 시켜주는 컴파일러의 기능인데 프로그래머는 사람이기 때문에 실수를 하기 마련입니다.- 물론 모든 잘못을 컴파일러가 보완 할 수는 없습니다.예를 들면,int a;a = 0;a = 1;a = 3;이런 식의 코드가 있다고 한다면, a에는 최종적으로 3의 값이 들어가게 되며 이..

C++ 포인터와 레퍼런스의 차이

포인터와 레퍼런스포인터와 레퍼런스 둘 다 원본 대상을 참조하여 이용한다는 점에서는 같습니다.- 사용하는 용도에 따라 차이점이 있기 때문에 이 둘이 존재합니다.  포인터와 레퍼런스의 차이점  포인터레퍼런스 선언 방법 int *pData; int &rData;  NULL 값 NULL 허용 int *pData = NULL;   // 실행가능 - 참조 대상을 아무때나 참조 가능 NULL 불가 int &rData = NULL;  // 컴파일 에러 int &rData = num;  - 이런식으로 선언과 동시에 초기화를 해주어야 한다. 초기화 시 string name("Hyeven"); string *pData = &name; - name의 주소값을 대입합니다. string name("Hyeven"); string ..

C++ malloc/free와 new/delete의 차이점

malloc과 new의 차이점  malloc : 라이브러리에서 제공하는 메모리 할당 함수, free(변수명) 으로 할당 내용을 해제한다. - 형태 : void *malloc(size_t size), 반환형 : *void 메모리공간  + 예 : int a = (int*)malloc(50 * sizeof(int));   - int형의 자료가 50개가 들어갈 공간을 확보, a[0~49]의 인덱스로 접근가능 - 프로그램 실행 중에 메모리를 할당받는 동적 메모리 할당 함수new : 변수나 함수 객체의 생성자를 자동으로 호출하는 연산자, delete로 해제한다.

C++ 가상 함수 (virtual) - 가상 함수의 원리

가상함수의 원리가상 함수는 실행 시간에 호출될 함수를 결정합니다.- 그럼 어떻게 실행 시간에 객체의 클래스형에 따라 재정의된 가상 함수를 찾아 호출할 수 있는 것일까요? C++는 가상 함수를 처리하기 위해 가상 함수를 갖는 클래스마다 가상 함수 테이블을 생성합니다.- 또한, 가상 함수를 갖는 클래스의 객체마다 가상 함수 테이블 포인터라는 숨겨진 멤버 변수를 생성합니다.- C++ 컴파일러가 가상 함수를 갖는 클래스에 대해 가상 함수 테이블을 생성하고 가상 함수 테이블을 갖는 클래스의 객체를 생성하면 객체의 멤버 변수를 할당하기 전에 먼저 가상 함수 테이블의 주소를 저장하는 가상 함수 테이블 포인터가 할당됩니다.- 바로 이 가상 함수 테이블 포인터와 가상 함수 테이블이 가상 함수를 호출할 때 이용되는 것입니다.

C++ 가상 함수 (virtual) - 가상 소멸자

가상 소멸자클래스에 가상 함수를 정의할 때 주의할 점은 소멸자도 가상함수로 만들어야 한다는 점입니다.동적으로 생성한 파생 클래스 객체를 기본 클래스 포인터로 가리키고 있을 때 동적으로 생성한 객체를 해제하려면 기본 클래스 포인터로부터 delete 해야 합니다.  delete pShape;는 pShape가 Shape 포인터이므로 Shape 클래스의 소멸자를 호출합니다.- delete pShape;는 항상 기본 클래스인 Shape 클래스의 소멸자만 호출됩니다.- pShape가 실제로는 Rectangle 클래스 객체의 주소를 저장하므로 pShape로 delete할 때 Rectangle의 소멸자가 호출되어야 합니다.- 이를 위해 Shape 클래스의 소멸자를 가상함수로 선언하면 됩니다.동적으로 생성한 파생 클래스..

C++ 가상 함수 (virtual) - 동적 바인딩

동적 바인딩기본 클래스의 포인터나 레퍼런스로 가상 함수를 호출하면 기본 클래스의 포인터나 레퍼런스가 어떤 클래스의 객체를 가리키는가에 따라 호출될 함수가 결정됩니다,- 실행 시간에 호출될 함수를 결정하는 것을 동적 바인딩(Dynamic Binding)이라고 합니다.- 반면, 컴파일 시간에 호출될 함수를 미리 결정하는 것을 정적 바인딩(Static Binding)이라고 합니다.  특징정적 바인딩동적 바인딩바인딩 시기컴파일 시간실행 시간구분일반 함수가상 함수장점동적 바인딩에 비해 처리속도가 빠르다프로그램의 융통성이 크다단점프로그램의 융통성이 작다정적 바인딩에 비해 처리속도가 늦다 가상함수를 제외한 모든 함수는 정적 바인딩으로 처리됩니다.- 정적 바인딩은 컴파일 시간에 호출될 함수를 미리 정해두는 방법입니다...