프로그래밍 공부
작성일
2024. 1. 18. 17:26
작성자
WDmil
728x90

3.5.2 참조형으로 포인터 대체

전통적으로 C++프로그래머는 C를 먼저 배운 후 C++를 배운다. C에서는 포인터만 복제가 아닌 참조형으로 데이터를 넘긴다.

 

C++에서도 여전히 포인터가 필요할 때가 있지만 많은 경우 참조형으로 대체할 수 있다. C를 먼저 배운 사람이라면 참조형을 지원하기 위해 특별히 언어 차원에서 추가된 기능은 없을거로 생각할 수도 있다. 단지 포인터 연산을 하는 새로운 문법이 추가되었을 뿐이라고 볼 수도 있다.

 

포인터 대신 참조형을 이용하면 몇 가지 좋은 점이 있다.

 

  1. 참조형은 포인터보다 안전하다.
    • 메모리 주소를 직접 다루지 않기 때문에 nullptr이 될 수 없다.
  2. 코드의 스타일이 더 좋아진다.
    • 스택변수 와 문법이 같아서 *나 &같은 심벌을 이용하지 않아도 된다.
    • 참조형은 사용하기도 쉽기 때문에 선호하는 스타일을 적용하는 데도 용이하다.

 

참조형은 함수를 호출하는 측에서 파라미터가 복제되어 넘겨지는지 참조로 넘겨지는지 알 수 없고, 함수 선언부를 봐야만 알 수 있다. 그러나, C++에서는 생각을 다르게 해야 하는것이. 포인터로 넘겨진다고 하더라도 함수 안에서 꼭 변경될 수 있는 것은 아니기 때문이다.

 

파라미터를 const T*타입으로 넘겼다면 포인터 타입이라고 하더라도 함수 안에서 새로운 값을 써 넣을 수 없다.

참조형도 마찬가지로 T&가 아닌 cosnt T&로 선언되었다면 함수 안에서 값을 변경할 수 ㅇ벗다.

 

즉, 파라미터로 넘겨진 변수가 함수 안에서 바뀔지는 포인터 여부가 아니라 const타입으로 선언되었느냐 여부에 달려있다.

 

즉, 함수가 어떤식으로 동작할 지 는 항상 함수 프로토타입을 확인해보아야 한다.

참조형의 또 다른 장점은 메모리의 오너십이 어디에 있는지 명확히 해준다는 점이다.

 

예를들어 내가 만든 메서드에 다른 프로그래머가 참조형으로 객체를 넘겨주었을 때 메서드 안에서 그 객체를 읽고 쓸 수는 있지만, 일반적인 방법으로는 메서드 안에서 객체를 메모리 헤제할 수가 없다.

 

만약 참조형이 아닌 포인터로 넘겨받았다면, 그 객체의 메모리 헤제의 책임이 메서드를 작성한 나에게 있는지 메서드를 호출한 다른 프로그래머에게 있는지 명확하지 않다.

 

이러한 장점 때문에 개발팀 안에서 활동할 때 에는 참조형을 이용할 것을 권장한다.

이도저도 아니라면, 스마트 포인터를 이용하자.

728x90