* vs & vs &

Nitroblue 1·2026년 4월 21일

Computer Science Basics

목록 보기
31/31
상황적절한 방법
하나의 객체 공유 (grid 등)& (reference)
객체들 간 연결 관계 (그래프, 트리)* (pointer)

내가 헷갈렸던 지점은

분명 DFS 문제 풀이때는 2차원 벡터를 매개변수로 받았을 때, 직접 값을 변경해주기 위해 &를 사용했었는데, 왜 BFS에서는 큐의 원소로 vertex 구조체를 넣으면서 관리하려니 안되는걸까?

우선 DFS에서 &가 잘 동작했던 이유는

  • void dfs(vector<vector<int>>& grid
    • grid는 하나의 객체
    • 함수 안에서도 그 동일 객체를 계속 사용
      -> 즉, 참조 하나로 충분

& (Reference)

  • Vertex& a = b;
    • a는 b의 별명이다.
    • 한 번 연결되면 다른 객체로 바꿀 수 없다.
      즉, 이 정점의 parent를 나중에 정점으로 바꾼다거나, 여러 정점을 컨테이너에 넣고 연결한다. 와 같은 동작이 불가능하거나 매우 제한되는 것.

단순히 '값 복사를 피하면서 직접 수정이 가능하다'가 아니라, 한 번 연결된 경우 수정이 불가한 비가역적인 기능이었다.

* (Pointer)

Vertex* p = &a;
p = &b;
  • 포인터는 주소를 저장하는 변수이기 때문에 a의 주소를 저장해두었다.
  • 포인터 p의 경우 저장중인 주소값을 다른 값으로 변경할 수 있다.
  • 따라서 여러 객체를 자유롭게 연결할 수 있는 것이다.
  • 여기서 쓰인 &는 참조가 아니라, 주소를 가져오는 연산자이다.

정리하자면, 핵심 원인은 값 복사 vs 동일 객체 참조의 차이였고, 나는 그 기능을 잘 이해하지 못한 채 참조 기능을 오용 및 남용하고 있었다.

최종 정리

참조(&)는 복사를 막고, 같은 객체를 쓰게 해주는 도구.
포인터(*)는 객체들 간의 연결 구조를 만들 수 있는 도구.

0개의 댓글