[정처기 실기] Java 참조(Reference)
정보처리기사 실기 — Java 참조(Reference) 문제
0. 한눈에 보기
| 항목 | 내용 |
|---|---|
| 출제 포인트 | 배열/변수에 참조를 다시 대입 vs 객체의 필드(값)를 수정 |
| 핵심 구분 | arr[i] = … → 참조만 바뀜 / arr[i].v = … → 객체 내용이 바뀜 |
| 자주 틀리는 점 | 배열 칸을 바꿔도 원래 변수(a, b, c) 가 가리키는 대상은 그대로 |
한 줄 요약: 변수/배열 칸이 “어디를 가리키는지”를 바꾸면 참조가 바뀌고,
.필드로 객체를 건드리면 같은 객체를 보는 모든 이름에 값이 반영된다.
1. 참고 문제

public class Main {
public static class BO {
public int v;
public BO(int v) {
this.v = v;
}
}
public static void main(String[] args) {
BO a = new BO(1);
BO b = new BO(2);
BO c = new BO(3);
BO[] arr = {a, b, c};
BO t = arr[0];
arr[0] = arr[2];
arr[2] = t;
arr[1].v = arr[0].v;
System.out.println(a.v + "a" + b.v + "b" + c.v);
}
}
정답: 1a3b3
2. 핵심 개념 — 참조 vs 객체
Java에서 BO a = new BO(1); 는 두 층으로 나뉜다.
| 구분 | 의미 | 예시 |
|---|---|---|
| 참조(변수) | 객체의 주소(위치) 를 들고 있는 이름 | a, b, c, arr[0] |
| 객체(힙) | 실제 데이터(v)가 들어 있는 상자 | new BO(1) 로 만든 인스턴스 |
변수 a ──► [ BO | v=1 ]
변수 b ──► [ BO | v=2 ]
변수 c ──► [ BO | v=3 ]
a = c처럼 변수에 다른 참조를 대입 →a가 가리키는 대상만 바뀜. 원래 객체는 그대로.a.v = 9처럼 필드를 수정 →a가 가리키는 그 객체의 내용이 바뀜. 같은 객체를 가리키는 다른 이름에도 보임.
3. 언제 참조가 바뀌고, 언제 안 바뀌나
3.1 참조가 바뀌는 경우 (가리키는 대상 교체)
대입의 왼쪽이 변수/배열 칸 자체일 때.
| 코드 | 의미 |
|---|---|
a = b; | a가 이제 b와 같은 객체를 가리킴 |
arr[0] = arr[2]; | 배열 0번 칸의 참조만 교체 |
BO t = arr[0]; | t에 참조 복사 (객체 복사가 아님) |
배열 칸을 바꿔도
a,b,c변수 자체는 안 바뀐다.
arr와a는 처음에만 같은 객체를 공유했을 뿐, 이후arr[0]만 다른 곳을 가리킬 수 있다.
3.2 참조는 그대로, 객체 내용만 바뀌는 경우
대입의 왼쪽이 .필드 일 때.
| 코드 | 의미 |
|---|---|
a.v = 10; | a가 가리키는 객체의 v 변경 |
arr[1].v = arr[0].v; | arr[1]이 가리키는 객체의 v 변경 |
이때
arr[1]과b가 같은 객체를 보고 있으면,b.v도 같이 바뀐 것처럼 보인다.
(b의 참조가 바뀐 게 아니라, 공유 객체의 값이 바뀐 것)
3.3 한눈에 비교
| 구분 | 코드 패턴 | 변수 a,b,c의 참조 | 객체 안 v |
|---|---|---|---|
| 참조 교체 | arr[i] = arr[j]; / x = y; | 왼쪽 변수/칸만 변경 | 그대로 |
| 값 수정 | x.v = …; / arr[i].v = …; | 그대로 | 변경됨 (공유자 전원 반영) |
| 참조 복사 | t = arr[0]; | t만 새 이름 생김 | 그대로 |
4. 문제 추적 (단계별)
Step 0 — 생성 직후
| 이름 | 가리키는 객체 | v |
|---|---|---|
a | 객체A | 1 |
b | 객체B | 2 |
c | 객체C | 3 |
arr | [A, B, C] | — |
Step 1 — 배열 0번과 2번 교환 (참조만 교체)
BO t = arr[0]; // t → A
arr[0] = arr[2]; // arr[0] → C
arr[2] = t; // arr[2] → A
| 이름 | 가리키는 객체 | 비고 |
|---|---|---|
a | A | 안 바뀜 |
b | B | 안 바뀜 |
c | C | 안 바뀜 |
arr | [C, B, A] | 칸의 참조만 바뀜 |
여기서 많이 틀림: “배열을 바꿨으니
a와c도 바뀌었다”고 생각하면 오답.
Step 2 — 필드 대입 (객체 내용 수정)
arr[1].v = arr[0].v;
// arr[1] → B, arr[0] → C
// 즉 b.v = c.v → B의 v가 3으로 변경
| 객체 | v | 이유 |
|---|---|---|
A (a) | 1 | 건드리지 않음 |
B (b) | 3 | arr[1].v로 수정됨 |
C (c) | 3 | 값만 읽힘 |
Step 3 — 출력
System.out.println(a.v + "a" + b.v + "b" + c.v);
// 1 + "a" + 3 + "b" + 3 → 1a3b3
5. 시험용 체크리스트
문제를 보면 아래 순서로 표시한다.
- 객체에 이름 붙이기 — A(v=1), B(v=2), C(v=3)
- 배열이 지금 누구를 가리키는지 표로 적기
- 문장을 보고 분류하기
x = y/arr[i] = …→ 참조 교체 (원래 변수는 유지되는지 확인)x.필드 = …→ 값 수정 (같은 객체를 보는 이름 전부 영향)
- 출력에 쓰인 변수(
a.v,b.v…) 기준으로 최종 값 읽기
→ 배열이 아니라 출력 변수가 가리키는 객체를 본다
6. 자주 나오는 함정
| 함정 | 올바른 이해 |
|---|---|
| 배열 swap = 변수 swap | arr[0]과 arr[2]만 바뀜. a, c는 그대로 |
t = arr[0]이 객체 복사 | 참조만 복사. t와 arr[0](당시)는 같은 객체 |
arr[1].v = … 후 b는 그대로 2 | arr[1]이 계속 B를 가리키면 b.v도 같이 변함 |
출력에 arr를 안 쓰는데 배열만 추적 | 최종은 a,b,c가 가리키는 객체의 v |
7. 암기 문장
1) 왼쪽이 변수/배열칸 → 참조(주소) 교체. 다른 이름은 안 따라감.
2) 왼쪽이 .필드 → 객체 내용 수정. 같은 객체 보는 이름은 전부 반영.
3) 배열을 섞어도 a,b,c 변수는 자동으로 안 바뀐다.
4) 출력은 “출력에 나온 변수”가 가리키는 객체를 본다.