C,C++/C++51 [C++] 가변 인자(Variable argument) 사용법을 알아보자 가변 인자(Variable argument)란 말 그대로 고정되지 않은 인자를 말한다. C언어의 printf() 함수처럼 정해지지 않은 개수의 인자를 받아야 할 때 사용한다. 가변 인자는 아래와 같이 인자를 ... 표시로 나타낸다. void func(int ...) { } 위 표현은 int 타입의 매개변수를 사용자가 입력한 만큼 받겠다는 의미이다. 따라서 함수 호출 시 아래와 같이 사용할 수 있다. func(1, 3, 2, 5, 8); func(1, 2); func(4); func(5, 1, 4, 8); ... 함수 내에서 가변 인자를 다루기 위해 사용하는 매크로 4가지가 있는데, 우선 다음 헤더 파일을 포함시켜야 한다. #include 헤더엔 다음과 같은 매크로가 정의되어 있다. 매크로 사용하기 위해선.. 2019. 12. 15. [C++] assert 매크로를 사용하자 / assert에 message 넣는 법 프로그램을 개발하는 도중 발생하면 안되는 오류 또는 예외를 처리하기 위해 throw나 if문 등으로 예외를 처리를 한다. 하지만 C++ 에선 디버깅 중 예외 또는 오류를 더 쉽게 찾도록 assert라는 매크로를 제공한다. assert는 예외 처리라기보다는 프로그램 개발 도중 발생해선 안되는 조건을 잡아 그 것을 고칠 수 있도록 해주는 일종의 트랩이라고 생각하면 된다. assert는 조건 식(condition)을 인자로 받아 해당 조건식이 거짓(false, 0, '\0', NULL, nullptr)이면 프로그램을 중단시킨다. 그리고 assert에 사용된 조건식과 몇 라인에서 발생하였는지 출력한다. 따라서 개발자는 오류가 어디서 발생했는지 정확한 위치와 이유를 알 수 있다. assert는 런타임에 검사를 진.. 2019. 12. 15. [C++] <memory> std::allocator<T> 클래스 안녕하세요. 오늘은 헤더의 allocator 클래스에 대해 알아보겠습니다. allocator는 유연한 메모리 관리를 위한 클래스로 할당자라고도 합니다. 일반적으로 c++에서 메모리를 동적으로 할당하고 해제할 때 new/delete 연산자를 사용하는데 allocator 클래스는 주로 라이브러리를 작성할 때, 특히 표준 라이브러리의 컨테이너를 구현할 때 많이 사용됩니다. 할당자는 fine-grained 방식 즉, 메모리 관리를 좀 더 세밀하게 컨트롤 해야하고 유연하고 효율적으로 사용해야 할 경우에 유저가 원하는 메모리 할당 방식으로 구현할 수 있습니다. 즉 allocator 클래스를 상속받아 멤버 함수를 override해서 커스텀할 수 있습니다. 컨테이너는 메모리를 최대한 효율적으로 관리할 수 있어야 하는데.. 2019. 12. 12. [C++] 가상 함수와 가상 소멸자에 대해 알아보자(feat. 가상테이블) | virtual 가상 함수와 가상 소멸자는 상속 관계에서 사용되는 용어이며, 멤버 함수에 virtual 키워드가 붙은 함수를 말한다. 이는 C++에서 OOP의 중요한 특징 중 하나인 다형성(Polymorphism)을 지원하기 위한 기능 중 하나이다. C++의 멤버 함수는 기본적으로 컴파일 타임에 호출할 클래스의 형이 결정된다.(정적 바인딩) virtual 키워드는 호출 대상을 컴파일 타임이 아닌 런타임에 판단하여 해당 포인터가 가리키는 오브젝트의 실제 클래스 타입을 찾아 그 클래스의 함수를 동적으로 호출할 수 있게 해준다. 참고로 자바에선 모든 멤버 함수가 가상 함수이다. 따라서 상위 클래스의 함수를 재정의하면 알아서 하위 클래스의 함수가 호출된다. 예를 들어, 아래와 같이 상위 클래스의 포인터 변수 pBase에 하위 .. 2019. 12. 10. [C++] 포인터와 레퍼런스(참조)의 차이를 이해해보자 C++에는 포인터(Pointer)와 레퍼런스(Reference)라는 개념이 있다. 포인터는 C 에도 있었던 개념이며 레퍼런스는 C++ 에서 등장한 개념이다. 언뜻 보면 용도가 비슷한데 정확히 어떤 차이점이 있는지, 내부적으로 어떻게 동작하는지, 왜 레퍼런스가 나오게 됐는지에 대해서 정리해보자. 포인터에 대해 헷갈려 하시는 분들을 위해 간단하게 용어 정리를 해보자면.. 포인터는 변수의 주소를 저장하는 특별한 타입의 변수이다. 주소값 자체를 포인터라고 생각해도 좋다. 주소만을 저장할 수 있는 변수를 포인터 변수라고 하고 일반적인 변수 선언과는 다르게 자료형에 * 표시를 붙여 선언한다. int* p; 는 int형 변수의 주소를 저장하는 포인터 (변수) p를 선언한 것이다. 포인터, 포인터 변수 다 같은 말이다.. 2019. 12. 5. [C++] const 키워드 위치에 따른 적용 범위 (포인터 및 멤버 함수) const 키워드는 대상을 상수화한다. 즉 대상이 초기화 이후로 값 수정을 하지 못하도록 만든다. const 키워드는 위치에 따라 적용되는 대상이 다르다. 1. 포인터가 가리키는 대상의 값을 변경 못하게 하려면 다음과 같이 선언한다. const char* c_ptr; - 포인터가 가리키는 대상의 값을 변경할 수 없다. - 하지만 포인터가 가리키는 대상(주소값)을 변경할 수 있다. 2. 포인터가 가리키는 대상(주소)을 변경 못하게 하려면 다음과 같이 선언한다. char* const ptr; - 포인터가 가리키는 대상(주소)을 변경할 수 없다. - 하지만 포인터가 가리키는 대상의 값을 변경할 수 있다. 3. 대상과 대상의 값을 모두 변경하지 못하게 하려면 다음과 같이 선언한다. const char* cons.. 2019. 11. 27. 이전 1 ··· 4 5 6 7 8 9 다음