포인터와 레퍼런스
포인터 | 레퍼런스 | |
표현 | * | & |
의미 | 메모리 주소를 가리킨다 | 값에 직접 접근하는 주소 |
변수 접근시 나타나는 값 | 가리키는 주소가 가진 변수의 값 | 변수의 내용이 저장된 메모리 주소값 |
상수 참조 | X | X |
NULL 초기화 가능 여부 | O | X |
초기화 | 객체(변수)의 주소값을 입력받음 | 객체(변수)를 직접 입력받음 |
초기화 여부 | 꼭 하지 않아도 됨 | 반드시 해야함 (나중에 값을 바꿀 수 없기 때문에) |
초기화 이후 | 다른 변수 참조 가능 | 다른 변수 참조 불가능 |
특징 | 메모리 공간을 할당함, 포인터가 가리키는 주소의 크기는 자료형이 무엇이든 간에 항상 같다. |
메모리 공간이 할당되는 것이 아님. 이미 선언된 변수를 다른 이름으로 부르는 것 |
포인터와 레퍼런스가 생긴 계기
- 입력값을 받는 함수의 변수가 값을 복사한다.
- 항상 복사하는 것은 메모리 관리 효율성이 떨어진다.
- 위치정보가 바로 넘어가면 복사하지 않고도 함수에 변수의 값을 넘길 수 있다.
- 포인터와 레퍼런스의 출현!
(출현 순서 : call by value -> call by address(= pointer) -> call by reference)
사실 포인터와 레퍼런스를 사용하는 이유는 크게 다르지 않습니다. 두가지 방법 모두 주소값을 이용하여 뎅터 처리를 하기 위해 사용합니다. 그런데 사용하는데 있어서는 레퍼런스가 더 사용하기 쉽습니다. 이렇게 레퍼런스가 더 사용하기 쉬운데도 불구하고 아직도 포인터를 사용하는 이유는 무엇일까요?
바로 포인터는 call by value의 장점과 call by reference의 장점을 동시에 가지고 있기 때문입니다.
포인터는 주소 공간을 복사한다는 call by value의 장점을 가지기 때문에 4byte혹은 8byte의 고정된 크기를 가지면서 가리키는 것을 바꿀 수 있습니다.
즉, 포인터의 사용 이유를 요약하자면 다음과 같습니다.
- 가리키는 값을 바꾸기 위해서이다.
- 가리키는 값은 바꾸지 않고 성능을 향상시키기 위해서이다.
(ex : const Node * a으로 선언하면 포인터변수 a는 4byte(32비트) 혹은 8byte(64비트)의 크기로 값을 넘겨받을 수 있다)
'DevLog > C & C++' 카테고리의 다른 글
C++ LValue RValue 개념파악하기 (1) | 2023.06.06 |
---|---|
스택(Stack)과 힙(Heap) 차이점 (0) | 2021.03.01 |
C++ 포인터 개념 (0) | 2021.02.04 |
C++ 구조체(Struct) (0) | 2021.01.25 |
C++ STL 맵 기본 사용법과 예제 (0) | 2021.01.24 |