인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

이정현님의 프로필 이미지

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

5-T

5-T를 풀면서 생긴 궁금증 질문입니다!!

해결된 질문

작성

·

50

0

안녕하세요, 5-T를 풀면서 call by reference에 대한 궁금증이 생겨서 질문드립니다.
http://boj.kr/eb2dea066fa343d7b20333031804dfe9
해당 문제를 이렇게 제출하여 정답처리 받았는데요,

for(auto &k : sharkV){
            pair<int,int> newP = k.move();
            visited[newP.first][newP.second]++;
        }

이때 k는 구조체 Shark구요, for 범위기반 loop에서 &k 로 받아서 k.move()에서 해당 구조체의 좌표를 변경시키는데요,

여기서 auto&k 대신 auto k를 사용했다면, sharkV의 주소를 참조받아 전달한게 아닌, 복사한 새로운 k라는게 생겨서(깊은 복사?), 이를 변경해도 원본에는 영향이 없는건가요?


그리고 Call by value던 reference던, 인자로 넘겨진 변수 이외의 변수가 변경되는 동작이 실행된다면 ( ex) 범위기반 for loop에서 ret을 더하는 행위 ) 이는 참조로 받거나, 값으로 넘긴게 아닌 해당 변수가 직접 들어온것이니 변경된다고 보면 될까요?

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 정현님 ㅎㅎ

여기서 auto&k 대신 auto k를 사용했다면, sharkV의 주소를 참조받아 전달한게 아닌, 복사한 새로운 k라는게 생겨서(깊은 복사?), 이를 변경해도 원본에는 영향이 없는건가요?

->

정확히는 다음과 같습니다. 만약 auto k라면 요소를 복사(copy)하여 새로운 객체로 만드는데 이 경우 k.move()가 호출되어도 원본 sharkV의 요소에는 영향을 주지 않습니다. C++에서 대입연산자는 얕은 복사(shallow copy)를 하게 되는데 이 때 구조체 내부에 포인터나 동적 할당된 멤버가 없다면 깊은 복사(deep copy)와 같은 효과를 기대해도 되지만, 어쨌든 원본과는 별개의 객체가 됩니다.


그리고 Call by value던 reference던, 인자로 넘겨진 변수 이외의 변수가 변경되는 동작이 실행된다면 ( ex) 범위기반 for loop에서 ret을 더하는 행위 ) 이는 참조로 받거나, 값으로 넘긴게 아닌 해당 변수가 직접 들어온것이니 변경된다고 보면 될까요?

->
Call by value (값 전달)는 함수에 인자를 값으로 전달하면, 함수 내부에서 그 값이 복사되어 사용됩니다. -> 영향 x / 그러나 Call by reference (참조 전달)는 함수에 인자를 참조로 전달하면, 함수 내부에서 원본 데이터에 접근하여 변경될 수 있습니다.

  • 즉, 범위 기반 for loop의 경우

    • auto k (값 복사)로 사용하면, 반복문 내부에서 변경하는 것은 복사본에 한정되므로 원본에는 영향이 없습니다.

    • 반면, auto &k (참조)로 사용하면, 반복문 내부에서 수행하는 변경이 실제 컨테이너에 있는 원소에 적용됩니다. 

 


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.