개요 어떤 값을 A에서 B로 보내고 싶을 경우 논리적으로 구분되는 두 가지 선택 사항이 있다. 복사(copy)는 X=Y의 일반적인 의미이다. 즉, X와 Y의 값이 둘 다 대입 이전의 Y의 값과 같아지는 것이다. 이동(move)은 Y의 값이 Y에서 X로 이동하는 것이다. 결과적으로 X는 Y의 이전 값이, Y는 출발점(moved-from) 상태로 남겨진다. 컨테이너 같은 경우 출발점 상태에는 비어있게 된다. 이번 포스트에서는 이동에 대해서 알아보도록 하자. 복사의 한계 A의 값을 B로 옮기는 전통적인 방법은 복사하는 것이다. 컴퓨터 메모리에 있는 정수에 대해서는 하드웨어가 한 번의 명령으로 처리할 수 있기 때문에 가장 타당한 방법이라고도 할 수 있다. 하지만 일반적이고 논리적인 관점에서 보면 그렇지 않다. ..
Value Categories Value Categories는 연산자 오버로딩, 포인터 등과 같은 C++의 언어적 기능이라기 보다는 컴파일러가 C++의 표현식(Expression)을 이해하고 해석하는 과정 중 한 부분이다. Value Categories를 이해하면 이해하기 전에는 난해했던 에러 메시지를 효과적으로 해석할 수 있다. C++의 언어적 기능인 연산자와 reference가 어떻게 동작하는지에 대한 통찰력을 기를 수 있다. 진화한 LValue와 RValue 초기의 Value Categories에는 C에서 소개되었던 lvalue와 rvalue 두 가지가 있었고, 이들은 비교적 간단명료한 개념들이었다. 하지만 C++과 함께 class, const 그리고 reference가 등장하면서 이러한 기능들에 ..
개요 어떤 값을 a에서 b로 보내고 싶을 경우 논리적으로 구분되는 2가지 선택 사항이 있다. 복사(copy)는 x=y의 일반적인 의미이다. 즉, x와 y의 값이 둘 다 대입 이전의 y의 값과 같아지는 것이다. 이동(move)은 y의 값이 y에서 x로 이동하는 것이다. 결과적으로 x는 y의 이전 값이, y는 출발점(moved-from) 상태로 남겨진다. 컨테이너와 같은 경우 출발점 상태에는 비어있게 된다. 이번 포스트에서는 복사에 대해서 알아보도록 하자. 복사 클래스 X에 대한 복사는 두 개의 연산으로 정의된다. 복사 생성자(copy constructor): X(const X&) 복사 대입(copy assignment): X& operator=(const X&) 간단한 2차원 Matrix를 살펴보자. te..
개요 생성자, 복사와 이동 대입 연산 및 소멸자는 수명과 자원 관리의 관점을 직접적으로 지원한다. 객체는 생성자의 실행이 끝나야 해당 타입의 객체로 간주되며, 소멸자의 실행 시작 전까지 그 상태를 유지한다. C++에서 초기화를 지원하는 기능들의 범위와 융통성을 살펴보면 객체의 생성이 얼마나 많은 디자인에서 핵심적인 역할을 담당하는지 알 수 있다. 어떤 타입에 대한 생성자, 복사와 이동 대입 연산 및 소멸자는 논리적으로 분리돼 있지 않다. 논리적, 성능적 문제를 겪지 않기 위해서는 이들을 서로 조화된 집합으로 생각해야한다. 생성자(Constructor)는 소속된 클래스의 객체를 초기화하는 역할을 가진 자신의 클래스와 동일한 이름을 가진 멤버이다. 생성자 아래와 같이 자신의 클래스와 동일한 이름을 가진 멤버..
1차 업데이트: 2023.01.18 참조자의 특징 참조자는 표현식(expression)에서 암시적으로 역참조(dereference)되기 때문에 표현식의 타입은 절대로 참조자가 될 수 없다. void Function(int& InValue) /* InValue의 타입은 int& */ { auto X = InValue /* X의 타입은 int(int&가 아니다!) */ auto& Y = InValue /* Y의 타입은 int& */ } 참조자는 객체가 아니다. 따라서 참조자를 가르키는 포인터를 얻을 수 없고, 참조자로 이뤄진 배열은 정의할 수 없다. 참조자에는 연산자를 적용시킬 수 없다. 아래의 코드에서 ++는 ValueReference가 참조하는 int, 즉 Value에 적용된다. int Value = 0..