본문 바로가기

Development/JAVA

(Java) Chapter15. Reference

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