Post

Reference Type의 특징

Reference Type의 특징
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 int[] origin = {1, 2, 3, 4, 5};
        int[] copied = Arrays.copyOf(origin, origin.length);
        System.out.println(Arrays.toString(copied));

        int[] copied2 = origin;
        System.out.println(Arrays.toString(copied2));

        System.out.println();

        origin[0] = 100;

        System.out.println(Arrays.toString(origin));
        System.out.println(Arrays.toString(copied));
        System.out.println(Arrays.toString(copied2));

출력 결과 :

1
2
3
[100, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[100, 2, 3, 4, 5]
  • copied2origin의 메모리 주소를 참조 하기 때문에 origin 원본 배열의 데이터가 바뀌면 copied2의 데이터도 바뀐다.

  • copyOf 함수를 쓰면 데이터를 복사해 새로운 메모리에 저장 한다.


1
2
3
4
5
        int[] arrA = {1, 2, 3};
        int[] arrB = {1, 2, 3};

        System.out.println(arrA == arrB);
        System.out.println(Arrays.equals(arrA, arrB));

출력결과 :

1
2
false
true
  • 서로 다른 메모리 주소를 ==으로 비교 하기 때문에 false가 나옴
  • Arrays.equals() 함수로 비교 하면 데이터 값을 비교 한다. true가 나옴

1
2
3
4
5
6
        int[][] mat = {
        {1, 2}, {3, 4}
        };
        System.out.println(Arrays.toString(mat));
        System.out.println(Arrays.deepToString(mat));// 재귀적으로 데이터를 문자열로 바꿈

객체도 reference type

  • 자바에서 모든 객체(Object)참조(reference) 타입
  • “값을 직접 저장하는 게 아니라, 객체가 존재하는 메모리 주소를 가리키는 참조(포인터 개념) 를 저장한다”는 뜻

1
2
3
4
5
Circle c1 = new Circle(10);
Circle c2 = new Circle(20);

Circle c3 = c2;

  • new Circle(10) → 새로운 Circle 객체가 힙(heap) 메모리에 생성됨

  • c1에는 그 객체의 주소(reference) 가 들어감

  • new Circle(20) → 또 다른 Circle 객체가 생성됨

  • c2에는 그 두 번째 객체의 주소(reference) 가 들어감

  • c3 = c2;c3c2주소를 그대로 복사함 (즉, 같은 객체를 가리킴)

1
2
3
4
5
6
7
8
9
10
11
12
Heap 메모리:
 ┌──────────┐
  Circle@A  radius = 10
 └──────────┘
 ┌──────────┐
  Circle@B  radius = 20
 └──────────┘

Stack (참조 변수):
 c1 ──► Circle@A
 c2 ──► Circle@B
 c3 ──┘ (같은 Circle@B)
1
2
c1.radius = 100;  // Circle@A의 radius가 100으로 변경됨
c2.radius = 200;  // Circle@B의 radius가 200으로 변경됨

순서

1
2
3
4
5
6
7
8
9
10
11
System.out.println(c1.radius); // 10
System.out.println(c2.radius); // 20
System.out.println(c3.radius); // 20 (c2와 동일 객체)

c1.radius = 100;
c2.radius = 200;

System.out.println(c1.radius); // 100 (c1은 별개 객체)
System.out.println(c2.radius); // 200
System.out.println(c3.radius); // 200 (같은 객체라 동일)

1
2
3
4
5
6
10
20
20
100
200
200
구분설명
기본형 (primitive)int, double, boolean 등. 값을 직접 저장
참조형 (reference)class, array, String, etc. 객체의 주소를 저장
= 연산객체 복사가 아니라 참조 주소 복사
c3 = c2;c3과 c2가 같은 객체를 가리킴
하나를 바꾸면같은 메모리의 값이 바뀌므로 둘 다 영향을 받음
This post is licensed under CC BY 4.0 by the author.