Language/JAVA

[JAVA] 참조 타입

IT수정 2024. 9. 3. 21:49

자바의 데이터 타입은 크게 기본 타입(Primitive type)과 참조 타입(Reference type)이 있다. 이 글에서는 참조 타입에 대해 알아보자. 참조 타입이란 객체(Object)의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입이 있다.

 

기본 타입과 참조 타입의 차이점은 저장되는 값이다. 기본 타입으로 선언된 변수는 값 자체를 저장하고 있지만, 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장한다. 참조 타입의 변수들은 모두 스택(Stack)이라는 메모리 영역에 생성된다.

 

메모리 사용 영역

메모리 사용 영역

 

메서드 영역

바이트코드 파일을 읽은 내용이 저장되는 영역으로 클래스별로 상수, 정적 필드, 메서드 코드, 생성자 코드 등이 저장된다.

 

힙 영역

객체가 생성되는 영역이다. 객체의 번지는 메소드 영역과 스택 영역의 상수와 변수에서 참조할 수 있다.

 

스택 영역

메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역이다. 메서드 호출이 끝나면 프레임은 자동 제거된다. 프레임 내부에는 로컬 변수 스택이 있다. 여기에서 기본 타입 변수와 참조 타입 변수가 생성되고 제거된다.

 

참조 타입 변수의 ==, != 연산

참조 타입 변수의 값은 객체의 번지 이므로 참조 타입 변수의 ==, != 연산자는 번지를 비교하는 것이 된다. 번지가 같다면 동일한 객체를 참조하는 것이고, 다르다면 다른 객체를 참조하는 것이다.

public class Example {
	public static void main(String[] args) {
    	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);
        System.out.println(arr2 == arr3);
        }

 

실행 결과는 false, true가 나오게 된다. 저장 항목이 같을지라도, 서로 다른 객체를 참조하기 때문이다.

 

Null과 NullPointerException

참조 타입 변수는 아직 번지를 저장하고 있지 않다는 뜻으로 null 값을 가질 수 있다. null도 초기값을 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.

 

 

자바는 프로그램을 실행하는 도중에 발생하는 오류를 예외(Exception)라고 부른다. 참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나가 NullPointerException이다.

int[] intArray = null;
intArray[0] = 10; // NullPointerException

 

배열 변수 infArray가 참조하는 배열 객체가 없으므로 10을 저장할 수 없기 때문에 NullPointerException이 발생한다.

 

앞으로 NullPointerException이 발생하면 예외가 발생된 곳에서 null인 상태의 참조 변수가 사용되고 있음을 알아야 한다.

'Language > JAVA' 카테고리의 다른 글

[JAVA] 배열(Array)  (0) 2024.09.03
[JAVA] 문자열(String)  (2) 2024.09.03
[JAVA] break 문과 continue 문  (0) 2024.09.03
[JAVA] while 문  (0) 2024.09.03
[JAVA] for 문  (0) 2024.09.03