본문 바로가기

전체 글93

[ C++ ] C언어의 표준함수 호출 이전 포스트에 잠깐 언급했는데, C++에서 C언어의 헤더 파일을 추가하는 것도 가능하다. 즉, C언어의 라이브러리는 C++의 표준 라이브러리에도 포함되어 있어서 헤더 파일의 확장자인 .h를 생략하고 앞에 소문자 c를 붙이면 C++의 헤더 파일 이름이 된다. 예를 들자면 다음과 같은 C언어의 헤더파일을 보면 #include #include #include #include 뒤에 확장자가 있다. 그럼 확장자를 생략하고 소문자 c를 붙이면 #include #include #include #include C++의 헤더파일 이름이 된 것을 확인할 수 있다. 하지만 가급적으로 C++ 헤더를 기반으로 사용하는 것이 좋다. 왜냐하면 C++ 표준 라이브러리가 제공하는 함수와 C 표준 라이브러리가 제공하는 함수들이 완전히 .. 2019. 9. 6.
[ C++ ] new 와 delete를 이용한 메모리 동적할당, 메모리 누수(Memory Leak)에 대하여.. 우선 동적 할당이란 " 프로그램 실행 중에 동적으로 메모리를 할당하는 것을 말합니다." 즉, 런타임 중에 메모리를 할당한다는 것이고, 동적으로 할당된 메모리는 Heap영역에 할당이 됩니다. 프로그램을 개발하다 보면 상황에 따라 메모리 공간을 실시간으로 확보해야 하는데 그때 사용하는 게 메모리 동적 할당입니다. C에서는 malloc로 힙 영역에 할당해주고, free로 힙에 할당된 메모리 공간을 소멸합니다. C++에서는 new로 힙 영역에 할당해주고, delete로 힙에 할당된 메모리 공간을 소멸합니다. 하지만 C++에서는 C언어의 헤더 파일을 추가하는 것도 가능하기 때문에 malloc와 free도 사용이 가능합니다. 그러면 먼저 malloc와 free를 이용한 메모리 동적 할당 예제를 보겠습니다. char.. 2019. 9. 6.
[ C++ ] Call-by-value , Call-by-reference 함수의 호출 형태는 크게 Call-by-value와 Call-by-reference로 나뉜다. Call-by-value * Pass-by-value 라고 불리기도 함. Call-by-value는 값에 의한 호출로, 함수의 인자로 넘기는 값을 복사해서 새로운 함수에 넘겨주는 방식이다. 즉, 값을 인자로 전달하는 함수의 호출 방식이다. 예로 들어 두 변수의 값을 바꿔주는 함수가 있다고 가정하자. void swap(int a, int b) { int temp = a; a = b; b = temp; } 겉으로 봤을 때는 a와 b 값을 바꾸는건 성공이다. 하지만 함수 외부에 선언된 변수 또한, 바뀌었을까? num1의 값은 a에 복사되고 num2의 값은 b에 복사되어 전달하기 때문에, num1과 num2의 값이 바.. 2019. 9. 5.
[ C++ ] const ( 상수 )의 활용 const 키워드와 함께 정의한 변수의 값은 수정이 불가능하다. 즉, 프로그래밍시에 바뀌어서는 안될값이 있을 경우 활용할 수 있다. 또한 코드가 길어질 경우 실수로 변수의 값이 바뀌어 지는것을 방지할 수 있다. const의 예는 다음과 같다. const int num = 10; -> "변수 num을 상수화" 그래서 num 값을 변경시에 컴파일 에러가 발생하는 것을 볼 수 있다. 그럼 포인터의 예를 살펴보자. const int *ptr1 = # -> "포인터 ptr1을 이용해서 num의 값을 변경 할 수 없음." 그래서 ptr1로 ptr1가 가리키고 있는 값을 변경할려고 할 때 컴파일 에러가 발생하는 것을 알 수 있다. 그러나 ptr1의 주소 값을 변경 할 수 있다. * num에 다이렉트로 접근하면.. 2019. 9. 5.
[ C++ ] 인라인(inline) 함수 '인라인(inline) 함수'라는 이름의 의미부터 이해해보자. in은 내부를 의미하고, line은 '프로그램 코드라인'을 의미한다. 즉, "프로그램 코드라인 안으로 들어가 버린 함수"라는 뜻이 된다. 그럼 의문점이 들 수 있다. "매크로 함수랑 인라인 함수랑 뭐가 다르지?" 일단, 매크로 함수의 단점을 생각하면 다음과 같다. "정의하기가 어렵다. 복잡한 함수를 매크로의 형태로 정의하는데 한계가 있다." 그럼 지난번 복습을 위해 매크로 함수를 정의해보자. #include #define SQUARE(x) ((x)*(x)) using namespace std; int main(void) { cout 2019. 9. 5.
[ C++ ] 선행처리기 / 전처리기 ( Preprocess ) 다음 포스터인 inline에 들어가기 전에 C에서 배웠던 전처리기에 대해 복습하자. C++에서 컴파일되는 과정은 다음과 같습니다. "프로그래머가 작성한 소스파일은 가장 먼저 소스파일에 대한 처리를 하는 선행 처리기를 거치고, 컴파일되어 오브젝트 파일이 생성되고, 다시 링커에 의해 실행파일이 된다. " 즉, 전처리이자 선행 처리(Preprocess) 란? 실행 파일을 생성하는 과정에서 컴파일하기 전, 소스 파일 내에 존재하는 선행 처리 지시문을 처리하는 작업을 의미합니다. 또한, 선행 처리를 위한 명령에는#define,, #undef, #include, #if, #ifdef, #elif, #else 등 맨 앞에 #기호가 붙는다는 공통점이 있습니다. ( 선행처리를 위한 명령 = 전처리 문 = 전처리기 연산자.. 2019. 9. 5.
[ C++ ] 매개변수의 디폴트 값 ( Default Value ) '디폴트 값'이란 말 그대로 '기본적으로 설정되어 있는 값'을 의미한다. 그럼, 예를 보자. int FuncOne(int num = 7) { return num+1; } int FuncTwo(int num1 = 5, int num2 = 7) { returnn num1+num2; } FuncOne의 매개변수 선언이 다음과 같다. int num = 7 그리고 이는 다음의 의미를 가진다. "함수 호출 시 인자를 전달하지 않으면 7이 전달된 것으로 간주한다." 따라서 다음 두 함수 호출 문은 완전히 동일하다. FuncOne(); FuncOne(7); 이어서, FuncTwo를 보면.. int num1 = 5, int num2 = 7 또한 이는 다음의 의미를 가진다. "함수 호출 시 인자를 전달하지 않으면 num1.. 2019. 9. 5.
[ C++ ] 함수 오버로딩 ( Function Overloading ) C 언어에서는 다음과 같이 동일한 이름의 함수가 정의되는 것을 허용하지 않는다. 두 함수의 이름이 같이 때문에 컴파일 오류가 발생한다. int Func(int num) { num++; return num; } int Func(int a, int b) { return a+b; } 하지만 C++에서는 이러한 함수 정의 형태인 함수 오버 로딩 ( Function Overloading )을 지원해주고 있어서 함수 호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하다. int Func(int num) { num++; return num; } int Func(int a, int b) { return a+b; } int main(void) { Func(20); // Func(int num) 함수의 .. 2019. 9. 5.
관용구 - 반복 1. 지정한 횟수만큼 반복할 때 for문을 사용하는 것이 유리 반복자는 특별한 이유가 없다면 0부터 시작 (반복횟수를 알 수 있을 때, for문 / 반복횟수를 알 수 없을 때, while문) // Good var nums = new[] { 10, 11, 12, 13, 14, 15 } for (var i = 0; i 2019. 8. 24.