← 질문 목록
#83깊이 0
대입 뒤 한쪽을 바꿀 때 결과가 갈리는 이유는?
값 타입 대입은 값 자체를 복사한다. 참조 타입 대입은 같은 객체를 가리키는 참조를 복사한다. 값 안의 참조 필드는 여전히 같은 객체를 가리킬 수 있다.
| 기준 | 값 의미론 | 참조 의미론 |
|---|---|---|
| 대입 결과 | 값 자체 복사 | 같은 객체의 참조 복사 |
| 변경 영향 | 값 필드는 분리 | 별칭으로 공유 |
| 동등성 | 값 비교가 자연스러움 | 값·정체성 구분 |
이 구분은 스택과 힙의 저장 위치와 같지 않다. 값도 최적화나 캡처에 따라 힙에 놓일 수 있고 참조 값 자체는 스택 프레임에 놓일 수 있다.
Java처럼 인자를 항상 값으로 전달하는 언어도 객체 참조 값을 복사해 넘긴다. 호출자는 같은 객체의 변경을 보지만 자신의 변수 재대입은 영향받지 않는다.
가변 참조 객체는 별칭과 동시성 위험을 키운다. 불변 객체와 방어적 복사는 공유 위험을 줄이지만 새 객체 생성과 복사 비용을 낸다.