← 목록으로

[정처기 실기] Java 참조(Reference)

정보처리기사 실기 — Java 참조(Reference) 문제

참고: 2025년 2회 정보처리기사 실기 복원 문제


0. 한눈에 보기

항목내용
출제 포인트배열/변수에 참조를 다시 대입 vs 객체의 필드(값)를 수정
핵심 구분arr[i] = … → 참조만 바뀜 / arr[i].v = … → 객체 내용이 바뀜
자주 틀리는 점배열 칸을 바꿔도 원래 변수(a, b, c) 가 가리키는 대상은 그대로

한 줄 요약: 변수/배열 칸이 “어디를 가리키는지”를 바꾸면 참조가 바뀌고, .필드로 객체를 건드리면 같은 객체를 보는 모든 이름에 값이 반영된다.


1. 참고 문제

Java 참조 기출 유형 문제

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 변수 자체는 안 바뀐다.
arra는 처음에만 같은 객체를 공유했을 뿐, 이후 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객체A1
b객체B2
c객체C3
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
이름가리키는 객체비고
aA안 바뀜
bB안 바뀜
cC안 바뀜
arr[C, B, A]칸의 참조만 바뀜

여기서 많이 틀림: “배열을 바꿨으니 ac도 바뀌었다”고 생각하면 오답.

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)3arr[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. 시험용 체크리스트

문제를 보면 아래 순서로 표시한다.

  1. 객체에 이름 붙이기 — A(v=1), B(v=2), C(v=3)
  2. 배열이 지금 누구를 가리키는지 표로 적기
  3. 문장을 보고 분류하기
    • x = y / arr[i] = …참조 교체 (원래 변수는 유지되는지 확인)
    • x.필드 = …값 수정 (같은 객체를 보는 이름 전부 영향)
  4. 출력에 쓰인 변수(a.v, b.v …) 기준으로 최종 값 읽기
    → 배열이 아니라 출력 변수가 가리키는 객체를 본다

6. 자주 나오는 함정

함정올바른 이해
배열 swap = 변수 swaparr[0]arr[2]만 바뀜. a, c는 그대로
t = arr[0]이 객체 복사참조만 복사. tarr[0](당시)는 같은 객체
arr[1].v = …b는 그대로 2arr[1]이 계속 B를 가리키면 b.v도 같이 변함
출력에 arr를 안 쓰는데 배열만 추적최종은 a,b,c가 가리키는 객체의 v

7. 암기 문장

1) 왼쪽이 변수/배열칸 → 참조(주소) 교체. 다른 이름은 안 따라감. 2) 왼쪽이 .필드 → 객체 내용 수정. 같은 객체 보는 이름은 전부 반영. 3) 배열을 섞어도 a,b,c 변수는 자동으로 안 바뀐다. 4) 출력은 “출력에 나온 변수”가 가리키는 객체를 본다.