• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

for 문 사용 시 array 복사

23.08.10 16:40 작성 조회수 332

1

  • 강의 중 교수님께서 포인터가 array 에 주로 이용된다고 하셨습니다. 그 과정에서 사용하는 이유가 데이터를 파라미터로 넣어주면 다시 복사가 되고, 이를 for 문 안에서 실행시키면 계속 복사가 되어 느려져 사용한다고 하셨습니다.

  • 여기서 복사가 된다고 하는 것이 for 문을 이용해서 array[i]의 i를 바꿔가며 새로운 값을 넣게되면 해당 array는 내용이 업데이트 되면서 계속 새롭게 생겨나서 느려진다는 것인지 궁금합니다. 강의의 어떤 부분에 해당 설명이 있는지도 궁금합니다.

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.08.10

안녕하세요, 답변 도우미 Soobak 입니다.

어떤 함수의 매개변수와 함수 안에서 정의된 변수들은 해당 함수의 지역 변수로 취급됩니다.

따라서, 해당 함수가 호출될 때 마다 함수의 매개변수에 대한 복사가 이루어지고, 함수 호출이 종료되어 지역 범위가 소멸될 때 까지 유지됩니다.

이 과정에서 이루어지는 복사로 이해하시는 것이 적절할 것 같습니다.

관련 내용에 대한 설명은 강의 6.2 배열 기초 [2 of 2] array 의 전체 부분을 참고하시면 좋을 것 같습니다.

함수의 매개 변수를 통하여 배열을 전달할 때, 배열 전체를 복사하여 전달하는 것이 아니라, 배열의 이름이 가리키는 배열의 시작 원소의 주소 만을 전달하여 보다 효율적인 메모리 관리를 가능하게 해주는 것입니다.

 

yoy06118님의 프로필

yoy06118

질문자

2023.08.11

답변 감사합니다. 하나 궁금한 부분이 일반적인 자료형을 쓴 함수에서는 파라미터를 배열을 그대로 사용하던지, 포인터로 바꿔서 사용하던지 함수 내에서 sizeof를 이용해 출력하면 같은 크기인 4를 가지는 것을 확인할 수 있었습니다. 설명해주신 경우는 함수의 파라미터로 struct나 class를 사용할 때 의미가 있는 것인가요?

아니면 함수의 파라미터로 배열을 사용하면 전달될 때는 배열의 크기였다가, 복사되는 과정에서 주소의 크기로 줄어드는 것인가요?

수박님께서 잘 대답을 해주셨는데, 부연 설명을 드린다면

제가 데이터를 통째로 복사해서 인수로 넘기는 것 보다 포인터만 넘기는 것이 좋다고 언급한 것은 C++ 언어의 설계 관점에서 말씀드린 것입니다. 왜 어렵게 포인터를 사용하냐, 배열 이름을 왜 포인터로 바꿔서 헷갈리게 만드냐 등 문법이 왜 이렇게 되어 있느냐에 대한 대답입니다.

따라서

"설명해주신 경우는 함수의 파라미터로 struct나 class를 사용할 때 의미가 있는 것인가요?"

는 정확하게 이해하신 것으로 보입니다. (여러 데이터를 묶어 놓고 넘기면서 복사가 되는 상황)

만약 의도적으로 배열을 통째로 복사를 하고 싶으실 때는 std::vector 같은 컨테이너를 포인터나 참조를 사용하지 않고 value로 넘겨버리면 내부적으로 배열 데이터를 모두 다 복사를 해주도록 구현되어 있습니다.

yoy06118님의 프로필

yoy06118

질문자

2023.08.15

교수님 한가지 더 궁금한 부분이 그러면 배열 대신 포인터를 사용할 경우 속도가 더 빠른 경우는 어떤 경우가 존재하나요? 함수의 파라미터로 사용하거나, for 문을 이용해서 배열을 출력할 때 모두 같은 속도인데, 언제 포인터가 배열보다 속도의 이점을 가지는지 궁금합니다.

Soobak님의 프로필

Soobak

2023.08.15

안녕하세요, 답변 도우미 Soobak 입니다.

우선 제가 조심스레 답변을 드리자면, 질문에 대한 댓글로 새로운 질문을 하는 것은 사실 질문자가 확인하기 어렵습니다. 따라서, 추가적으로 궁금하신 사항이 생기시면 새롭게 질문을 올리시는 것을 권장드립니다.
(공지사항의, "질문에서 답 잘 받는 요령을 정리한 글입니다. 질문하시기 전에 꼭 클릭해서 보세요. (링크)" 참고)

제가 조심스럽게 답변을 해보자면 다음과 같습니다.

교수님께서 말씀해주신 대로, 'C++ 언어의 설계 관점' 을 주요 기준으로 바라보시는 것이 보다 적절한 것 같습니다.
질문자님께서 말씀하신 것 처럼, 배열과 포인터 둘 다 메모리 주소를 기반으로 동작하기 때문에 속도 상에서 큰 차이를 보이는 경우는 적습니다.
따라서, 기본적인 연산 속도의 차이보다는 '데이터 복사의 최소화', '동적 메모리 할당', '유연한 데이터 구조' 등의 장점을 바탕으로 'C++ 언어의 설계 관점' 에서 포인터 사용의 '성능상의 이점' 을 바라보시는 것이 적절한 것 같습니다.