본문 바로가기

C++

(5)
[C++] 클래스(class) (6) - 소멸자(Destructor) 생성자, 소멸자 호출 순서 생성자와 소멸자도 일종의 함수이기 때문에 call stack 위에서 호출이 처리된다. call stack은 FILO(First-In-Last-Out, 선입후출) 구조이기 때문에, 생성자가 호출된 역순으로 소멸자가 호출된다. 이때 2가지 특이 사항이 있다. 바로 상속(Inheritance)와 구성(Composition)의 경우이다. 구성(Composition) 쉽게 생각하면 다른 클래스 객체를 멤버로 갖는 상황이다. 이때는 객체 멤버가 정의된 순서를 따라 생성자가 호출된다. #include class Foo1 { public: Foo1() { std::cout
[C++] 클래스(class) (5) - 정규 타입(Regular Type)과 중괄호 사용 정규 타입(Regular type): 이상적인 클래스는 int처럼 행동한다 (C++ Core Guideline C.11) 클래스를 디자인할 때 직관적이면서 다루기 쉬운 편이 좋다. 프로젝트 규모가 커지고 객체 간의 관계가 서로 얽히다 보면, 간단한 연산이 관리에 용이하기 때문이다. 그렇다면 "이상적인 클래스는 int처럼 행동한다"는 무엇을 의미할까? 이는 대부분의 STL 컨테이너 클래스가 해당되는데 5가지 특성이 있다. 기본 생성이 가능한(default constructibility) 클래스 int와 std::vector의 차이점을 생각해 보자. 두 객체 전부 초기화 없이 생성가능하다. int num; std::vector vec; 기본 생성이 가능하기 위해서는 멤버 변수 모두 기본 생성자를 가진 변수 ..
[C++] 클래스(class) (4) - The Rule of Zero/Five 생성자가 필요한 이유 클래스는 객체(정확히는 인스턴스)를 초기화할 때 틀이 된다. 객체를 위한 메모리 공간을 할당(allocate)하고, 할당된 공간에 값을 초기화한다. 만약 생성자를 따로 정의하지 않으면 C++ 컴파일 과정에서 자동으로 기본 생성자를 호출한다. 밑에서 더 자세히 서술하겠지만, 객체 내부에 있는 객체(데이터)가 기본 생성자가 없는 경우에는 쓰레기 값(dump value)으로 객체가 초기화한다. 절대 규칙은 아니지만, 객체를 생성한 후에 내부 데이터를 변경하면 캡슐화(encapsulation) 규칙에 위배되므로 상황에 따라 생성자를 반드시 정의해야 한다. The Rule of Zero(C++ Core Guidelines C.20) 기본 연산(생성, 소멸, 복사, 복사 할당, 이동, 이동 할..
[C++] 표준 템플릿 라이브러리(STL)(1) std::vector C++에서 가장 많이 사용하는 헤더 중 하나가 바로 이다. C에 있는 동적 배열을 캡슐화한 객체이다. 얘 때문에 C보다 array형 data를 다루기 편하다. 또한 push_back, size, clear 같은 멤버 함수와 iterator를 통한 에 선언된 STL 함수에 요긴하게 사용된다. 1. vector 생성(construct), 접근(iterate), 이동(move/assign) 1-1 생성(construct) std::vector vec1; std::vector vec2(vec1); std::vector vec4{1, 2, 3}; 기본적으로(using namespace std를 쓰지 않는다는 가정하에) std::vector 벡터이름 꼴로 벡터 객체를 생성한다. vec1의 경우, int 형 원소를 ..
[C++] Hello World와 입출력 포맷팅 C++ 뿐만 아니라 다른 프로그래밍 언어를 배우면 가장 먼저 Hello World 프로그램을 작성한다. 해당 언어의 인터프리터 혹은 컴파일러가 정상적으로 설치됐는지 확인하기 간단하면서 확실하다. 이 포스팅에서는 C++에서 Hello World 소스코드로 기본적인 C++ 입출력에 대해서 알아보려한다. 스트림(stream) #include int main(){ std::cout