IT world

Java - 참조타입1 본문

코딩/Java

Java - 참조타입1

엄킹 2019. 11. 27. 11:50

1. 데이터 타입 분류


프로그램이 하는 일은 결국 데이터를 처리하는 것이다. 따라서 데이터를 얼마나 잘 다루느냐가 좋은 프로그램을 작성할 수 있는 관건이 된다. 데이터를 잘 다루기 위해서는 데이터 타입에 대해서 제대로 이해할 필요가 있다.


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


* 기본 타입(값 타입) : stack영역에 저장된다

- 정수타입 : byte, char, short, int, long

- 실수타입 : float, double

- 논리타입 : boolean


* 참조 타입 : heap영역에 저장된다.

- 배열타입

- 열거타입

- 클래스

- 인터페이스

- String


기본타입과 참조타입으로 선언된 변수의 차이점은 저장되는 값이 무엇이냐이다. 기본 타입의 변수들은 실제 값을 변수안에 저장하지만 참조 타입으로 선언된 변수는 메모리의 번지를 값으로 갖는다.


기본 타입 변수                                           참조 변수

실제값                                    100번지----> 100번지 객체                 이런 식으로 각각의 메모리에 저장된다.


기본 타입의 변수와 값은 stack영역에 생성되며 객체의 변수는 참조변수라는 이름으로 stack에 생성되지만 실제 값은 heap영역에 생성되어 해당 메모리의 주소를 참소변수의 값으로 가지게 되는 것이다.


만약 참조하는 변수나 필드가 없다면 의미없는 객체가 되기 때문에 쓰레기로 취급하고 JVM은 쓰레기 수집기(Garbage Collector)를 실행시켜 힙영역에서 자동으로 제거한다.









2. 참조 변수의 ==, != 연산

 

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


참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 주소값을 비교하는 것이 된다. 동일한 주소 값을 갖고 있다는 것은 동일한 객체를 참조한다는 의미이다. 따라서 동일한 객체를 참조하고 있을 경우 == 연산의 결과는 true이고 != 연산의 결과는 false이다.


[예제]



[출력 결과]


사진을 보면 array1이라는 배열객체를 만들고 array1을 array2에 대입했고 새로운 배열 array3를 만들었다.


==, != 연산을 출력해보면 array1과 array2는 같은 객체의 주소를 가지고 참조하고 있으므로 동일한 객체라고 판단하여 true, 


array1과 array3는 배열내부의 원소들의 값이 동일해도 서로 다른 객체에 생성된 것이기 때문에 동일하지 않은 객체라고 판단하여 false를 출력한다.







3. null과 NullPointerException


참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다. null값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.


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


위에 작성한 예를 사용하자면 array1 == null; 이라고 하면 array1은 배열객체를 참조하고 있으므로 null이 아니여서 false를 출력한다.

만약 int[] array4 = null; 일 경우 array4 == null이라면 true를 출력한다.


자바는 프로그램 실행 도중에 발생하는 오류를 예외(Exception)라고 부른다. 예외는 사용자의 잘못된 입력으로 발생할 수도 있고 프로그래머가 코드를 잘못 작성해서 발생할 수도 있다. 


참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나로 NullPointerException이 있다. 이 예외는 참조 타입 변수를 잘못 사용하면 발생한다. 참조 타입 변수가 null을 가지고 있을 경우, 참조 타입 변수는 사용할 수 없으며 참조변수를 사용하는 것은 곧 객체를 사용하는 것을 의미하는데 참조할 객체가 없으므로 사용할 수 없는 것이다. 따라서 null값의 참조변수를 사용하면 해당 예외가 발생한다.

[arr 배열에 초기값으로 null을 사용]



[NullPointerException 출력 결과]


출력 결과처럼 현재 main스레드에서 예외가 발생하였고 NullPointerException의 내용인 것을 확인할 수 있다.


arr은 배열 타입 변수이므로 참조 타입 변수이다. 그래서 null로 초기화가 가능하고 이 상태에서 arr[0]에 10을 저장하려고 하면 NullPointerException이 발생한다. arr변수가 참조하는 배열 객체가 없기 때문이다.





'코딩 > Java' 카테고리의 다른 글

Java 클래스  (0) 2019.11.28
객체지향 프로그래밍(OOP)  (0) 2019.11.27
Java란  (0) 2019.11.25
Java - 정수와 실수  (0) 2019.03.14
Java - 변수  (0) 2019.03.14
Comments