1. 참조
1) 복제
- 참조 자료형 데이터타입: new로 생성하는 데이터타입을 일컫는 말
- 복제의 개념
package chapter_13;
public class _01_Reference {
public static void runValue() {
int a = 1;
int b = a; // 1이 a라는 변수 안에 들어갔고 그것을 복제해서 b에 담음.
b = 2; // b안에 들어간 1을 2로 바꿔도 원본인 a 안에 들어간 1은 변하지 않음
System.out.println("runValue, " + a);
}
public static void main(String[] args) {
runValue(); // 1
}
}
2) 참조 예시
package chapter_13;
class A {
public int id;
A(int id) {
this.id = id;
}
}
public class _01_Reference {
public static void runValue() {
int a = 1;
int b = a; // 1이 기본데이터타입 int a라는 변수 안에 들어갔고 그것을 "복제"해서 b에 담음.
b = 2; // b안에 들어간 1을 2로 바꿔도 원본인 a 안에 들어간 1은 변하지 않음
System.out.println("runValue, " + a);
}
public static void runReference() {
A a = new A(1); // 인스턴스를 생성, 인스턴스 A 는 a 의 위치정보를 담음, 기본데이터타입이 아님, 객체의 참조값만 담고 있음
A b = a; // 원본이 같다는 것이 아니라 참조값에 대한 변수가 같다.
b.id = 2; // 인스턴스의 id 값을 기존의 1에서 2로 변경
System.out.println("runReference, " + a.id);
}
public static void main(String[] args) {
runValue(); // 1
runReference();// 2
}
}
3) 참조와 복제의 비교
- 복사를 하면 원본과 복사본이 생김, 복사본의 내용을 바꾸면 원본도 바뀌나?? 그렇지 않다.
- 만약 바로가기 만들기로 파일을 만들고 원본의 내용을 바꾸면 둘 다 같은 내용으로 바뀐다.
- 즉, 바로가기 파일은 원본을 참조한다는 것, 그리고 이렇게 만들어진 바로가기 파일은 적은 용량으로 만들어진다. 복제는 같은 용량의 파일이 생성된다는 것
- 2)의 내용을 설명하자면, a가 인스턴스로 들어가고 a와 b가 같다고 한다면 원본인 new A()의 내용을 수정한다면 참조하는 a, b는 둘 다 바뀐다는 것
4) 메소드의 매개변수 참조
package chapter_13;
public class _02_Reference2 {
static void _value(int b) { // 복제예시
b = 2;
}
static void runValue() {
int a = 1; // 기본 데이터타입 a 변수에는 1을 가짐
_value(a); // int a = b, 이때 b가 2라고 해도 이는 복제된 상태라 원본이 바뀌지 않음
System.out.println("runValue, " + a); // 1
}
static void _reference1(A b) { // 참조 예시 1, A b = a;
b = new A(2);
}
static void runReference1() {
A a = new A(1); // 참조, id = 1
_reference1(a);
System.out.println("runReference1, " + a.id); // 1
}
static void _reference2(A b) { // 참조 예시 2, A b = a;
b.id = 2;
}
static void runReference2() {
A a = new A(1); // 인스턴스가 1인 원본을 a가 참조하고 있는데 위에서 b가 2이므로 결과는 2
_reference2(a);
System.out.println("runReference2, " + a.id); // 2
}
public static void main(String[] args) {
runValue();
runReference1();
runReference2();
}
}
'Development > JAVA' 카테고리의 다른 글
(Java) Chapter16. Generic (0) | 2023.02.04 |
---|---|
(Java) Chapter14. enum (0) | 2023.01.29 |
(Java) Chapter13. Object (0) | 2023.01.23 |
(Java) Chapter12. 예외 (0) | 2023.01.23 |
(Java) Chapter11. 접근 제어자 (0) | 2023.01.17 |