C++ 참조자의 활용

조회수 821회

질문 1)

함수의 반환형이 참조형으로 쓰이는 경우는 어떤 이유로 쓰이는건가요 ? 잘 와닿지가 않네요. 참조자가 단순한 변수에 이름을 붙인다는 정도이상의 의미를 가지고 잘 활용되나요 ?

책의 모든 예제가 억지로 참조형을 설명할려고 의미 없는 코드들만 덕지덕지 있는 것 같아 와닿지가 않습니다. 어떻게 이해해야 깔끔한지, 어떤 경우에 주로 사용되는지가 궁금합니다.

단순히 Call - By - Reference를 위해 존재하는건가요 ?

질문 2)

이미지

위 이미지의 경우도, 굳이 Adder의 매개변수를 참조형으로 받고 있는 이유,

함수의 매개변수로 넘길 변수까지 포인터까지 써가면서 ( Point *pptr, Point *pptr2 ) 선언 하는 이유를 모르겠습니다.

단순히 그냥 예제라서 의미없이 new 라는 키워드를 공부시킬려고 짜여진건가요 ?

실제로 짤때는 굳이 사진과 같이 짜지 않아도 되는게 맞는지요 ?

예 : Point Adder(Point p1, Point p2); 로만 짜도 충분할 것 같은데요..

질문 3 )

사진의 Adder 함수 내부의 pptr은 지역변수로 new 키워드로 동적할당 된 상태인데, 지역변수는 스코프를 벗어나면 소멸되는데, 이때 자동으로 delete가 되는건가요 ? 즉, 메모리가 해제가 되는건가요 ?

그리고 지역변수는 참조형으로 반환하면 안되는거 아닌가요 ? 안되는건데 포인터라서 메모리상에 해제가 안되고 남아있으니깐 억지로 하는건가요 ?

위 예제가 어떤 의미를 가지는지 분석이 너무 힘듭니다. 얻어가야할게 무엇인지 전혀 모르겠습니다.

질문 4 )

함수의 매개변수로 참조자를 쓰는데, 함수 내부에서 값을 변경하지 않을경우

void func(const int &num);로 const 키워드를 써서 표기해주는게 원칙이라는데, 함수 내부에서 값을 변경하지도 않을건데 왜 굳이 참조자로 매개변수를 선언하나요 ? 먼가 앞뒤가 안 맞는 원칙인 것 같아서 질문 남겨요.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 질문자의 질문을 보니...우선 프로그램이 수행시 사용하는 메모리 구조부터 학습할 필요가 있어 보입니다. 사실 c/c++은 저급언어(어셈블리)의 특성이 많기 때문에 GC가 있는 고급언어들(JAVA, PYTHON, GO 등)에 비해 공부해야할 것이 많습니다.

    최대한 간략하게 프로그램이 실행이 되면 메모리를 두가지 형태로 나눠 사용합니다. 첫째는 스택이고 두번째가 힙입니다.

    전 질문에도 언급했지만 지역변수는 스택에 저장이 되는데 구체적으로 스택이라는 것은 함수마다 전용 스택프레임이라는 것이 생성되어 함수를 빠져나올때(리턴시) 해당 스택프레임이 정리되어 지역변수도 정리되는 구조입니다.

    그런데 new 키워드로 생성하면(c에선 malloc 등의 메모리 할당 함수) 힙이라는 공간에 메모리를 할당합니다. 힙이라는 메모리 공간은 그냥 선형의 긴(큰) 메모리 공간입니다. 이곳에 할당받은 메모리는 스택과 달리 자동 정리되는 구조가 아니므로 명시적으로 해제(delete 혹은 free)를 해줘야 합니다.

    함수내에서 지역변수 포인터에 new 로 객체 생성을 하고 해당 지역변수 포인터를 리턴하면 유효한 힙 주소를 리턴하므로 아무런 문제가 없습니다. 다만 리턴받은 포인터 주소를 이용하여 꼭 해제를 해줘야만 메모리가 새지 않게 되는 겁니다.

    책의 예제는 학습한 내용을 설명하기 위해 만든 예제 같습니다. 실제로 필드에선 new 키워드도 자제하고 스마트 포인터를 활용하고 자료구조도 stl 을 활용하여 최대한 묵시적으로 메모리 해제를 유도합니다.

    1. 네. 그리고 그 차이가 큽니다.
    2. new가 아니라 포인터와 레퍼런스를 공부하시는 부분 같습니다.
    3. 기본적으로 new로 할당받으면 자동으로 delete 안됩니다.
    4. int라면 그럴 수도 있겠지만, first class data type이 아니어도 의미가 없을까요?
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)