코딩테스트
c++ 코딩 테스트 주의사항 -참조 전달
코앤미
2025. 2. 14. 11:50
void DFS(vector<int> &numbers, int &target,int sum,int n) {
.....
DFS(numbers, target, sum + numbers[n], n+1);
DFS(numbers, target, sum - numbers[n], n+1);
}
파라미터의 vector<int> &numbers, int &target 를 주목하자.
c에서 & == 참조값을 나타낸다.
즉, numbers 벡터, target의 '주솟값'을 전달하는 것이다.
따라서, 재귀 함수 등에서 전체 함수에 통용되는 값을 하나 유치하고 싶다면, 전역 변수를 쓰는 것 보다 & 를 통한 참조 전달을 활용하는 것이 더 깔끔하다.
* 매번 value를 전달하는 것은 매번 새로운 공간에 해당 value 값을 할당해주는 의미이기에, 그냥 value만 전달한다면 메모리 낭비.
꼭 이런 방식이 아닌, 포인터를 통한 전달도 가능하다.
1. 포인터 전달 (void dfs(int *p);)
void dfs(int *p) {
*p = 10; // 포인터를 통해 값을 변경
}
int main() {
int x = 5;
dfs(&x); // 주소를 전달
std::cout << x; // 출력: 10
}
특징:
- p는 메모리 주소를 저장하는 포인터.
- 함수 호출 시 int 변수의 주소(&x)를 전달해야 함.
- p 자체는 값(주소)을 복사하지만, *p를 사용하면 원본 값을 수정할 수 있음.
- NULL 체크 가능 (if (p) { ... })
2. 참조 전달 (void dfs(int &p);)
void dfs(int &p) {
p = 10; // 직접 변수 값을 변경
}
int main() {
int x = 5;
dfs(x); // 변수 자체를 전달
std::cout << x; // 출력: 10
}
특징:
- p는 변수 자체의 별칭(alias).
- 함수 호출 시 변수 x를 직접 넘김 (dfs(x);).
- 별도의 주소 연산(&) 없이도 원본 값 수정 가능.
- NULL 값이 불가능 (항상 유효한 변수를 참조해야 함).
3. 주요 차이점
차이점포인터 전달 (int *p)참조 전달 (int &p)
전달 방식 | 변수의 주소를 전달 (dfs(&x);) | 변수 자체를 전달 (dfs(x);) |
접근 방법 | *p로 원본 수정 | p 자체로 수정 가능 |
NULL 가능 여부 | p가 nullptr일 수 있음 | p는 항상 유효한 변수 |
가독성 | 포인터 연산 필요 (*p) | 일반 변수처럼 사용 가능 |
+@
2. const 참조 전달 (void dfs(const int &p);)
앞선 target & number는 재귀 함수 내에서 고정 값을 가진다. 이런 케이스에서 참조를 사용하면 원본을 바꾸게 되는 불상사가 생길 수 있다. 이럴 때 const
참조를 전달하는 것이 가장 좋다.
const 참조는 변수가 참조를 통해 변경되는 것을 허용하지 않는 참조다. 즉, const 참조를 매개 변수로 사용하면 함수가 인수를 변경하지 않는다는 것을 호출자에게 보장한다.
void DFS(const vector<int> &numbers, const int &target,int sum,int n) {
.....
// target = 3; 과 같이 참조한 위치의 value를 변경하려 시도하면 컴파일 에러 발생
DFS(numbers, target, sum + numbers[n], n+1);
DFS(numbers, target, sum - numbers[n], n+1);
}