| 상황 | 적절한 방법 |
|---|---|
| 하나의 객체 공유 (grid 등) | & (reference) |
| 객체들 간 연결 관계 (그래프, 트리) | * (pointer) |
내가 헷갈렸던 지점은
분명 DFS 문제 풀이때는 2차원 벡터를 매개변수로 받았을 때, 직접 값을 변경해주기 위해 &를 사용했었는데, 왜 BFS에서는 큐의 원소로 vertex 구조체를 넣으면서 관리하려니 안되는걸까?
우선 DFS에서 &가 잘 동작했던 이유는
void dfs(vector<vector<int>>& gridgrid는 하나의 객체
a는 b의 별명이다.- 한 번 연결되면 다른 객체로 바꿀 수 없다.
즉,이 정점의 parent를 나중에 정점으로 바꾼다거나,여러 정점을 컨테이너에 넣고 연결한다.와 같은 동작이 불가능하거나 매우 제한되는 것.
단순히 '값 복사를 피하면서 직접 수정이 가능하다'가 아니라, 한 번 연결된 경우 수정이 불가한 비가역적인 기능이었다.
Vertex* p = &a;
p = &b;
- 포인터는 주소를 저장하는 변수이기 때문에 a의 주소를 저장해두었다.
- 포인터 p의 경우 저장중인 주소값을 다른 값으로 변경할 수 있다.
- 따라서 여러 객체를 자유롭게 연결할 수 있는 것이다.
- 여기서 쓰인
&는 참조가 아니라, 주소를 가져오는 연산자이다.
정리하자면, 핵심 원인은 값 복사 vs 동일 객체 참조의 차이였고, 나는 그 기능을 잘 이해하지 못한 채 참조 기능을 오용 및 남용하고 있었다.
참조(&)는 복사를 막고, 같은 객체를 쓰게 해주는 도구.
포인터(*)는 객체들 간의 연결 구조를 만들 수 있는 도구.