6. 함수(3) - 함수와 배열

WanJu Kim·2022년 10월 24일
0

C++

목록 보기
27/81

함수에는 배열과 같이 복잡한 데이터형도 사용 가능하다. 매개변수로 배열을 받아야 하는 경우도 있을 것이다. 그럴때는 이렇게 쓴다.

int Sum_Arr(int arr[], int arrSize)
{
	...
}

이렇게 사용하면 Sum_Arr의 첫 번째 매개변수를 마치 배열을 뜻하는 것처럼 보인다 하지만 실상은 포인터다.

int Sum_Arr(int arr[], int arrSize);

int main()	
{
	int numbers[8] = { 6,2,7,1,8,2,5,3 };

	int sum = Sum_Arr(numbers, 8);
	cout << sum << endl;
}

int Sum_Arr(int arr[], int arrSize)
{
	int sum = 0;
	for (int i = 0; i < arrSize; i++)
	{
		sum += arr[i];
	}
	return sum;
}

코드에서 배열의 매개변수를 배열 이름 그대로 numbers라고 주었다. 전에 배웠듯이 배열의 이름은 배열 첫 번째 원소의 주소랑 같다. 즉 numbers == &numbers[0] 이다. 따라서 Sum_Arr은 주소를 전달 받는 것이다. 그래서 다음과 같이 써도 상관이 없다.

int Sum_Arr(int * arr, int arrSize)
{
	...
}

이는 반대의 입장으로는 불가능하다. 만약 포인터를 전달 받을 때면, 위와 같은 코드만 가능하다.

  • 배열을 매개변수로 이용하는 것의 의미
    배열을 사용하지 않고 일반적인 변수를 전달할 때는 그 값을 복사해서 전달하는 식이었다. 근데 배열은 '주소'를 가르쳐주는 방식이었다. 주소를 가르쳐준다는 것은, 그 원본에 접근할 수 있다는 것이다. 값을 복사해서 전달하는 것은 변하지 않지만, 전달 내용이 주소라는 점에서 큰 차이가 발생한다.
    주소를 전달한다는 것은 장단점이 있다. 우선 배열이 클 경우에 배열의 값을 전달하는 것은 큰 메모리 복사가 일어난다는 것이므로 시간 손해가 일어난다. 하지만 단순히 주소를 전달하면 큰 메모리가 필요하지 않으므로 장점이다. 또한 원본을 바꿀 필요가 있다면 이것은 장점이다. 하지만 원본을 바꿀 필요가 없다면 단점이 된다. 하지만 이 단점은 const 제한자를 사용하여 보완할 수 있다.
int Sum_Arr(const int arr[], int arrSize)
{
	...
}

매개변수 자료형 앞에다가 const 제한자를 붙이면 그 원본 값을 바꿀 수 없다. 이를 어길려고 할 시 에러가 나온다.

profile
Question, Think, Select

0개의 댓글