목록Programming (115)
Nagie's DevStory
C++ 11에서 새로 등장한 문법 중 'r-value 참조'라는 문법이 있다. 이 문법을 이해하기 전 l-value와 r-value가 무엇인지 알고 넘어가는 게 중요할 거 같다. l-value는 메모리 주소를 가지는 식별자(변수)로 수정할 수 있는 데이터를 나타내며 r-value는 메모리 주소를 가지지 않는 임시값이나 수정이 불가능한 값으로 간주한다. 예를 들어 int x = 5; 라는 코드가 있다고 가정하면 'x'는 l-value라고 볼 수 있고 '5'는 r-value라고 볼 수 있는것이다. 그래서 이게 왜 필요하냐? 라고 의문을 가질 수도 있을 텐데 r-value 참조는 이동 시멘틱과 효율적인 자원 관리를 위해 추가 됐으며 잘 사용한다면 불필요한 메모리 복사를 피해 프로그램의 성능을 향상시킬 수 있다..
//Pointer int* pNum = # *pNum = 30; //Reference int& ref = num; ref = 30; 참조형 변수 또는 참조자는 처음 어떤 변수와 짝을 이루게 되면 그 짝이 달라지지 않는다. 그렇다고 짝을 이룬 원래 변수가 달라진 것을 감지해 주는 것도 아니며 다만 포인터의 일반적인 사용 문제 몇 가지를 문법적으로 차단했다. 사용하면서 특이한 점이라고 한다면 '겉으로 보기에는 전혀 포인터로 보이지 않는다는 점'과 포인터를 사용하면서 생기는 문제점들을 문법적으로 통제를 시켜놓은 탓에 포인터를 사용할 때 뒤따라오는 문제점들이 참조형 변수나 참조자를 사용할 때는 따라오지 않는다는 점이다. C++에서는 가급적 참조자를 사용하는 게 좋아 보이며 참조자를 통한 해결 방안이 없는..
//C int* pPtr = # //C++ int* pPtr = # //포인터 int& rRef = num; //레퍼런스 참조자(&)는 기존 C에는 없던 형식으로 C++에서 추가 됐다. 포인터와 구조적으로 비슷하지만, 겉으로 보이는 모습은 포인터와 다른 게 특징이며 포인터와 다르게 참조자를 사용하려면 선언과 동시에 반드시 초기화를 해줘야 하고 상수에는 참조자를 선언할 수 없다는 게 주 특징이다. 아래는 사용이 불가능한 대표적인 예시이다. int* pPtr = &3; //불가능 int& rRef = 3; //상수에 대한 참조는 불가능 int& rRef; //참조 원본이 없으므로 불가능
C 나 C++을 사용하는 이유 중 하나는 아마 포인터를 사용하기 위함이라고 해도 과언이 아닐듯하다. 다만 포인터라는 건 장미꽃의 가시와도 같으며 잘 사용한다면 강력하고 아름답지만. 사용법이 미숙하다면 조그마한 실수에도 치명적인 오류를 일으킨다. 그와 더불어 '포인터'라는 말은 늘 '메모리 관리'라는 말을 수식어처럼 달고 다니는데 이는 무엇보다 할당과 해제라는 관리 문제가 있기 때문이다. 그리고 새로운 방법을 보기 전 우린 C에서 사용했던 malloc()과 free()를 되짚어 볼 필요가 있다. int* dynamicArray = (int*)malloc(10 * sizeof(int)); free(dynamicArray); dynamicArray = NULL; 지금 보니 어떻게 이런 걸 사용했을까 싶을 정도..
C에서 자료형이란 '일정 크기의 메모리에 저장된 정보를 해석하는 방법' 정도로 이해하면 편하다. 클래스나 구조체 같은 사용자 정의 자료형을 제외한 기본 자료형은 C++ 역시 크게 다르지 않으며 C++ 11 표준부터 몇몇 자료형이 추가되었다. 자료형 설명 bool C++11에 추가된 자료형은 아니지만 C와는 다르게 언어단에서 지원한다. long long 64비트 정수(컴파일러에 따라 다름) char16_t 16비트 문자 char32_t 32비트 문자 auto 컴파일러가 컴파일 타임에 자동으로 타입을 추론함 decltype(expr) expr과 동일한 자료형