참조값에 접근한다는 것은 설계도와 부지 위치에 접근해서 같이 공동 작업을 하는 것이다.
기본형은 실제 값이 저장되어 독립적으로 관리되지만,
참조형은 변수에는 객체 위치(참조값)가 저장되어 여러 변수가 동일한 객체를 참조할 수 있다.
* 기본값 (원시 자료형): 변수에는 실제 값이 직접 저장되며, 각 변수는 독립적으로 값을 가지고 있다.
* 참조값 (참조 자료형): 변수에는 객체의 위치(참조값)가 저장되며, 여러 변수가 동일한 객체를 참조할 수 있다.
[이해 도모를 위한 코드 예시 : 참조값 대입 이해하기]
public class BuildingExample {
public static void main(String[] args) {
// 건물을 쌓아올리기 위한 건물 부지 위치(참조)를 나타내는 참조값 X
int[] X = new int[2];
// a 업체가 건물 부지 위치 X에 건물을 쌓아올림
X[0] = 1; // 준공일
System.out.println("a 업체가 X 부지에 건물을 쌓아올림 (준공일: " + X[0] + ")");
// b 업체가 a 업체로부터 정보를 공유받아 작업 수행
int b = X[0]; // b 업체는 a 업체가 준공한 결과를 참조
System.out.println("b 업체가 a 업체로부터 정보를 공유받음 (준공일: " + b + ")");
// b 업체는 X 부지에 방문하여 독립적으로 작업 수행
System.out.println("b 업체가 X 부지에 방문하여 독립적으로 작업을 진행함");
}
}
1) `int [] X = new int[2];` : `X`는 건물 부지 위치를 가리키는 참조값이다. (2개의 건물을 쌓겠다고 생성도 완료)
2) `X[0] = 1;` : 즉 `a` 업체가 `X` 부지(위치)에 (참조)접근하여 1이라는 준공일을 설정하고, 건물을 쌓아올린다.
3) `b = X[0];` : `a` 업체가 `b` 업체에게 건물과 관련 내용을 전달한다.
`b` 업체는 `X` 부지(위치)의 참조값을 공유받아 해당 부지에 방문하여 독립적으로 작업을 진행한다.
∴ 두 업체는 독립적으로 작업을 진행하지만, 건물 부지 위치 `X`와 준공된 결과는 동일하게 나타날 것이다.
(같은 객체/인스턴스를 공유한다는 뜻)
`X`는 건물 부지(위치)를 가리키는 참조값이며, `a` 업체가 `X` 부지에 건물을 쌓아올리고,
이를 넘겨 받은 `b` 업체가 독립적으로 작업하되 부지의 결과는 공유됨.
[p.7 / 참조형 코드] 궁극적으로 설계도와 부지 위치에 접근해서 같이 공동 작업을 하는 것 ⇒ 참조값에 접근
public static void main(String[] args) {
Data dataA = new Data(); //설계툴로 설계도 위치(참조값) 확인
dataA.value = 10; //설계툴로 확인한 설계도 위치(참조값)에 값을 넣는 것
Data dataB = dataA; //설계툴로 설계도 위치(참조값) 전달 받음 -> 근데 이미 설계도는 작성중
System.out.println("dataA 참조값 = " + dataA);
System.out.println("dataB 참조값 = " + dataB);
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
//dataA변경
dataA.value = 20;
System.out.println("변경 dataA.value = 20 ");
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value); //같은 설계도를 수정하는 것이기에
//data B변경
dataB.value = 30;
System.out.println("변경 dataB.value = 30 ");
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
}
참조값은 객체의 위치를 나타내며, 이를 통해 여러 변수가 동일한 객체를 가리킬 수 있다.
따라서 하나의 변수가 객체를 수정하면, 다른 변수를 통해서도 동일한 수정이 반영된다.
이것이 참조 자료형에서 참조값에 접근한다는 의미이다.
- 헷갈리면 변수값에 참조값 자체와 프로세스 흐름을 그리며 생각 해보기
>> (참고) 출력값
dataA 참조값 = ref.Data@2f4d3709 //설계툴로 확인한 설계도 위치
dataB 참조값 = ref.Data@2f4d3709 //a에게 공유받은 설계도 위치
dataA.value = 10
dataB.value = 10
변경 dataA.value = 20
dataA.value = 20
dataB.value = 20
변경 dataB.value = 30
dataA.value = 30
dataB.value = 30
[p.4 / 기본형 코드] 변수에 실제 값 대입 => 각 개체들은 따로 존재한다고 이해하자
public static void main(String[] args) {
int a = 10; //a야 종이 10개 챙겨라
int b = a; //b야 a랑 똑같이 종이 챙겨라
a = 20; //a야 그냥 20개 챙겨라
System.out.println("a = " + a);
System.out.println("b = " + b);
//출력값 a = 20, b = 10;
}
여기서 변수 `a`에는 먼저 10이라는 값이 대입되고, 그 다음에 변수 `b`에는 변수 `a`의 값이 대입된다.
따라서 `b`도 10이 되며, 그 후 변수 `a`에는 20이라는 값이 대입되므로, `a`는 20이 된다.
즉 값이 복사되어 전달되기 때문에 발생하는 결과이다.
이는 한 줄씩 선언되는 내용이 독립적으로 처리되며, 한 변수의 값을 변경해도 다른 변수에는 영향을 미치지 않는다.
[이해 도모를 위한 예시 : 기본값 / 참조값(배열, 객체) 이해하기]
1. 기본값 (원시 자료형)
└─ int a = 10;
└─ 변수 a는 직접적으로 값 10을 가지며, 값이 변수에 직접 대입된다.
2. 참조값 (참조 자료형)
a) 배열 (Array)
└─ int[] student = new int[2];
└─ 여기서 student는 배열을 가리키는 참조값이며, 두 개의 건물(인덱스)을 만드는 것과 같다.
└─ student[0] = 10;
└─ 첫번째 건물(인덱스)에 값을 넣는 것이며,
student[0]는 '값이 저장된(부지가 확정된) 위치'를 가리키는 참조값이다.
b) 객체 (Object)
└─ Student st = new Student();
└─ st는 Student '클래스의 인스턴스를 가리키는 참조값(설계도의 위치)'이다.
이는 설계도에 접근하고 건물을 만들기 위해 설계툴(new Student())을 사용하는 것과 같다.
▶ 클래스 도입과 객체 이해하기
https://zoooom-in.tistory.com/43
[김영한_자바기본][1.클래스와 데이터] 클래스 도입, 객체 이해하기(인스턴스) (p.15-23)
Class는 설계도로, 객체(인스턴스)는 설계도를 구현한 설계툴로 보자 정보 참조는 설계툴을 통해 이루어지며, 입력 전까지는 설계툴에는 원본(설계도면) 위치만 뜬다. [코드 읽기 전, 이해 도모를
zoooom-in.tistory.com
▶ 배열의 생성과 선언 이해하기
https://zoooom-in.tistory.com/44
[김영한_자바입문][9.배열] 배열의 선언과 생성 이해하기 (p.2-7)
배열 선언은 아파트 부지 확보, 생성은 몇 개의 아파트를 확보할 것인지 배열의 값 할당은 부지를 참조해 실제 준공일을 기입한다. 할당 전까지는 부지 주소만 참조되어 나타난다. [코드 읽기 전
zoooom-in.tistory.com
'Java > [inflearn] 자바 기본' 카테고리의 다른 글
[김영한_자바기본][2.기본형과 참조형] 상품 주문 시스템 개발_문제 풀이 해석 보충 (p.30-34) (2) | 2024.02.06 |
---|---|
[김영한_자바기본][3. 객체 지향 프로그래밍] 매서드 보충 (0) | 2024.02.05 |
[김영한_자바기본][2.기본형과 참조형] Null/NullPointerExcepiton 이해 (p.23-29) (0) | 2024.02.02 |
[김영한_자바기본][1.클래스와 데이터] (보충) 클래스 도입/객체 사용/ 배열 도입 (p.16-34) (2) | 2024.02.02 |
[김영한_자바기본][1.클래스와 데이터] 클래스 도입, 객체 이해하기(인스턴스) (p.15-23) (0) | 2024.01.24 |