C와 C++의 함수와 매개변수 전달
이 레슨에서는 함수에 매개변수를 넘기는 세 가지 방법, 즉 값, 포인터, 참조에 의한 전달을 비교합니다.
소개
기본적으로 함수에 변수를 넘기면 C와 C++는 복사본을 만들기 때문에, 함수 안에서 바꿔도 원래 변수에는 영향이 없습니다. 함수가 원본을 바꿀 수 있어야 한다면 호출하는 쪽에서 명시적으로 허락해야 합니다. C에서는 포인터로, C++에서는 참조로 합니다.
핵심 정리
- 컴파일러 경고(compiler warnings)를 켜고 모두 고치세요.
- 각 값의 타입과 수명(lifetime)을 정확히 이해하세요.
- 입력 데이터와 배열 인덱스의 범위를 항상 확인하세요.
C와 C++ 코드 예제
C
main.c
#include <stdio.h>
void swap_ints(int *left, int *right) {
int temporary = *left;
*left = *right;
*right = temporary;
}
int main(void) {
int a = 4, b = 9;
swap_ints(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
9 4
C++
main.cpp
#include <iostream>
void swap_ints(int& left, int& right) {
int temporary = left;
left = right;
right = temporary;
}
int main() {
int a = 4, b = 9;
swap_ints(a, b);
std::cout << a << ' ' << b << '\n';
}
9 4
C와 C++ 비교
C의 swap_ints 함수는 두 변수의 주소를 받아 * 연산자로 접근해 값을 맞바꿉니다. C++의 참조(reference)는 원래 변수의 다른 이름처럼 동작하므로, 문법은 더 짧으면서도 값을 실제로 바꿉니다. 매개변수의 const 키워드는 함수가 데이터를 읽기만 하고 바꾸지 않는다는 뜻입니다.
C
C는 작은 절차형 함수를 쓰고, 데이터가 메모리에 어떻게 표현되는지 그대로 드러냅니다.
C++
C++는 여전히 저수준 작업을 할 수 있으면서, 라이브러리 타입과 더 안전한 추상화를 더합니다.
연습 문제
두 버전을 모두 실행한 다음 코드를 바꿔 보면서 각 언어가 주는 안전성의 차이를 살펴보세요.
- 잘못된 입력과 경계값으로 테스트해 보세요.
- -Wall -Wextra -Wpedantic 옵션으로 컴파일해 경고를 더 많이 켜 보세요.
- 공통 선언은 헤더 파일에, 구현은 별도의 파일에 두어 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
- Distance Between Points Compute the straight-line distance between two points. 쉬움
- Days in a Month Return how many days a month has, including leap years. 쉬움