개발공부/JAVA

[JAVA] 참조 타입

jnnjnn 2024. 2. 27. 23:44

자바에서 데이터 타입은 기본 타입과 참조 타입으로 나뉜다. 기본 타입으로 선언된 변수는 값 자체를 저장하고 있지만 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장한다. 참조 타입으로는 배열, 열거, 클래스, 인터페이스가 있다.

 

변수들은 모두 스택이라는 메모리 영역에 생성되는데 참조 타입의 경우 힙 메모리 영역의 참조 타입 번지를 저장한다.

 

참조 번지의 값을 알고 싶으면 System.identityHashcode()를 사용하면 된다

// new : 메모리 공간 확보
        // 연산결과 : 확보된 메모리 공간 위치(주소, hashCode)

        int[] arr = new int[]{2, 3};

        // arr가 가진 실제 값을 알고 싶을 때
        // System.identityHashCode 메소드 사용
        int address = System.identityHashCode(arr);
        System.out.println(address);

 

참조 타입의 값을 == 또는 !=로 비교할 때는 힙 영역에 저장된 부분을 비교하는 것이 아닌 참조 타입의 번지를 저장하는 것이다.

 

        int[] arr1;
        int[] arr2;
        int[] arr3;

        arr1 = new int[]{1, 2, 3};
        arr2 = new int[]{1, 2, 3};
        arr3 = arr2;

        System.out.println(arr1 == arr2); // false
        System.out.println(arr2 == arr3); // true;

 

참조 타입 변수는 아직 번지를 저장하지 않았다는 뜻으로 null 값을 가질 수 있다.

이때 변수가 null 값을 가진 객체를 사용하려고 할 때 NullPointerException이라는 예외가 발생한다.