Corgi Dog Bark

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] Reference 와 Pointer 의 차이점 설명해줄래
    뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 14. 15:10
    반응형

    안녕하세요. 요번 시간에는 ReferencePointer의 차이점에 대해서 적어보려고 합니다.

    우선, 포인터(Pointer)와 레퍼런스(Reference) 둘 다, 변수에 대하여 값을 가리키거나 변수 자체에 접근하여 값을 변경할 수 있도록 하는 역할을 실시하게 됩니다. 하지만 포인터와 레퍼런스의 가장 근본적인 차이는 포인터의 경우, 포인터는 메모리가 저장되어 있는 곳을 가리키는 값을 저장하게 되고, 레퍼런스의 경우 값(변수)에 대한 별칭을 의미 하는데 있어 차이가 존재합니다.

     

     

    [그림 0. 포인터와 레퍼런스의 차이]

    위의 그림0 을 보게 되면, 포인터 p 는 변수 a의 주소 값을 담아두게 되고, 레퍼런스인 ref는 단지 a의 별칭일 뿐, a의 주소 값을 저장하지 않습니다. 

     

    그럼 각 차이점을 알아보도록 하겠습니다.

     

    비 교 포인터(Pointer) 레퍼런스(Reference)
    정의(Definition) 포인터는 메모리 값에 대한 주소값을 저장합니다. 변수에 대한 별칭(Alias)을 의미
    반환값(Return Value) '*' 연산자에 의해 포인터에 저장된 주소에 어떠한 값이 저장되있는지 표현합니다. '&' 값을 통해, 레퍼런스의 주소값을 반환합니다.(변수의 주소값과 동일)
    연산자(Operators) '*' / '->' '&'
    NULL 값(Null Reference) NULL 값 가능 NULL 값 불가능
    초기화(Initialization) 실행 중 어떠한 때에도 초기화 가능 Ref 값이 생성될때, 초기화가 되어있어야 합니다.
    재할당 여부(Reinitialization) 재할당 가능 재할당 불가능

    위 표와 같이 특징을 간략히 정리해보았습니다. 대부분이 알고 계시지만 간략히 정리하고 넘어가 보겠습니다.

    그럼 포인터와 레퍼런스가 가지는 특징으로 어떠한 점을 이용할 수 있을지 알아보겠습니다.

     

     

    포인터 활용


    먼저 포인터를 활용해서, 포인터 연산을 수행할 수 있습니다. 즉 "더하기" "뺄셈"과 같은 포인터 연산을 지원하기 때문에, 포인터 연산을 실시할 수 있습니다. 물론 생포 인터 덧셈 / 뺄셈의 경우 기피하는 연산이기도 하지만 C 라이브러리와의 호환성 및 특정 연산에 관해 활용하는 예를 들 수 있을 것입니다.

     

    두 번째로, 여러 개의 간접 참조(multiple Indirection)를 실시할 수 있습니다. 예를 들어 2차원 동적 배열을 생성할 때를 생각해보자면, **ptr을 생성하고, 포인터 연산을 통해서 각 주소에 맞는 동적 배열을 생성할 수 있을 것입니다.

     

    세 번째로 함수 포인터의 예를 들 수 있습니다. 물론 C++에서는 Functional stl을 사용하여, 사용하는것이 좋지만 함수 포인터를 사용하여 연산을 간편히 할 수 있다는 장점이 존재합니다.

     

    그리고 포인터의 나머지 중요한 특징은

    1. 레퍼런스와 달리 null 값이 가능하며,
    2. 초기화가 프로그램 실행 중 어느 때나 실행되어도 상관없습니다.
    3. 그리고 다른 값으로 재할당(reinitialization) 이 가능하다는 점입니다.

     

     

     레퍼런스 활용


    레퍼런스의 경우, 데이터 변수의 별칭을 의미하며, 중요한 특징으로는 

    1. 생성될 때, 반드시 초기화가 되어야 한다는 점입니다.
    2. 또한 재할당이 불가능하다는 점이며, 이는 auto& ref = a; 라 하였다가, ref = b; 로 재할당이 불가능하다는 점입니다.
    3. Null 값 할당이 불가능합니다.

    레퍼런스의 경우, 다음과 같이 활용이 가능합니다.

    1. 함수 Return Value / 레퍼런스 리턴
    2. 함수 파라미터(포인터도 사용 가능합니다.)

     

     

    긴 글 읽어주셔서 감사합니다.

    도움이 되셨거나, 잘못된 내용이 있다면 댓글 부탁드리겠습니다.

    반응형

    댓글

Designed by Tistory.