[Java] 참조 타입 ①

kiteB·2021년 12월 21일
0

Java

목록 보기
5/35
post-thumbnail

[ 데이터 타입 분류 ]

자바의 데이터 타입은 크게 기본 타입(원시 타입: primitive type)과 참조 타입(reference type)으로 분류된다.

기본 타입으로 선언된 변수와 참조 타입으로 선언된 변수의 차이점은 저장되는 값이 무엇이냐이다.

  • 기본 타입byte, char, short, int, long, float, double, boolean을 이용해서 선언된 변수는 실제 값을 변수 안에 저장한다.
  • 참조 타입인 열거, 배열, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리의 번지를 값으로 갖는다. 번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부른다.


[ 메모리 사용 영역 ]

java.exeJVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 다음과 같은 세부 영역으로 구분해서 사용한다.


1. 메소드(Method) 영역

메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.

메소드 영역에는 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 런타임 상수풀(runtime constant pool), 필드(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(constructor) 코드 등을 분류해서 저장한다.


2. 힙(Heap) 영역

힙 영역은 객체와 배열이 생성되는 영역이다.

힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.

힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.


3. JVM 스택( Stack ) 영역

스택 영역은 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역이다.

JVM 스택은 메소드를 호출할 때마다 프레임을 추가(push)하고, 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.

프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가(push)되거나 제거(pop)된다.

  • 변수가 이 영역에 생성되는 시점은 초기화가 될 때인, 최초로 변수에 값이 저장될 때이다.
  • 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.


[ 참조 변수의 ==, != 연산 ]

기본 타입 변수의 ==, != 연산은 변수의 값이 같은지, 아닌지를 조사하지만,
참조 타입 변수들 간이 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다.

참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 주소값을 비교하는 것이 된다.
동일한 주소 값을 갖는다는 것은, 동일한 객체를 참조한다는 뜻이다.

위의 그림에서 refVar1refVar2는 서로 다른 객체를 참조하고 있으므로 ==, != 연산 결과는 다음과 같다.

refVar1 == refVar2	//결과: false
refVar1 != refVar2	//결과: true

refVar2refVar3은 동일한 객체를 참조하고 있으므로 ==, != 연산 결과는 다음과 같다.

refVar2 == refVar3	//결과: true
refVar2 != refVar3	//결과: false

[ nullNullPointerException ]

참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다.

1. null 값 확인

참조 타입 변수가 null 값을 가지는지 확인하려면 ==, != 연산을 수행하면 된다.

위의 그림에서 refVar1은 객체를 참조하므로 연산의 결과는 다음과 같다.

refVar1 == null	//결과: false
refVar2 != null	//결과: true

refVar2null 값을 가지므로 연산의 결과는 다음과 같다.

refVar2 == null	//결과: true
refVar2 != null	//결과: false

2. NullPointerException

NullPointerExceptionnull을 가지고 있는 참조 타입 변수를 사용할 때 발생하는 에러이다.

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

위와 같이, null 값을 갖는 intArray를 사용하면 NullPointerException이 발생하게 된다. (intArray 변수가 참조하는 배열 객체가 없기 때문이다!)

String str = null;
System.out.println("총 문자수: " + str.length());

String은 클래스 타입이므로 참조 타입이다. 따라서 str 변수도 null로 초기화가 가능하다.
이때도 마찬가지로 null 값을 갖는 String 객체의 length()라는 메소드를 호출하였으므로 NullPointerException이 발생한다.

NullPointerException은 자주 발생하는 에러이므로 잘 알아두자!

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글