[Java] 참조 타입

박세진·2021년 1월 19일
1
post-thumbnail

어느 언어를 배우던 기본은 데이터타입 을 이해하는 것 이라 생각한다. 이번에는 자바의 데이터타입에 대해 정리하면서 잘 이해가 가지 않았지만 넘어갔던 부분이 있다면 다시 한번 되짚어보고자 한다.

자바의 데이터 타입

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

  • 기본타입 : 정수, 실수, 문자, 논리 리터럴을 저장하는 타입
  • 참조타입 : 객체의 번지를 참조하는 타입. (배열타입,열거타입,클래스,인터페이스)

리터럴 : 변수 및 상수에 저장되는 값 자체를 말한다.

기본 타입으로 선언된 변수와 참조 타입으로 선언된 변수의 차이는 저장되는 값이 무엇이냐이다.
기본 타입을 이용해 선언된 변수는 실제 값을 변수 안에 저장하지만,
참조 타입을 이용해 선언된 변수는 메모리의 번지를 값으로 갖는다.
(번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부른다)

int age = 25;
String name = "박세진";

int형 변수인 age는 직접 값을 저장하고 있지만, String 클래스 변수인 name은 힙 영역의 String 객체의 주소 값을 가지고 있다.

[참고]
JVM 의 메모리 영역에 대해서 잘 모른다면 이 글을 참고하면 좋을 것 같다.
[Java] static 뜯어보기 !
https://velog.io/@sezzzini/Java-static-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0

변수 : 값을 저장할 수 있는 메모리 상의 공간
변수의 값은 바뀔 수 있으며, 하나의 변수에는 단 하나의 값 만을 저장할 수 있음.
여러번 저장하면 마지막에 저장한 값을 갖게 된다.
변수를 사용하기 위해서는 선언을 해야하고, 변수가 선언되면 메모리에 변수의 타입에 알맞은 크기의 저장공간이 확보된다.

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

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

(이 때 참조 타입 변수의 값 = Heap 영역의 객체 주소 이므로, 결국 주소값을 비교하는 것!)

null과 NullPointerException

참조 타입 변수는 Heap 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다.
null 값도 초기값으로 사용될 수 있기 때문에, null로 초기화된 참조 변수는 stack 영역에 생성된다.
참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나로 NullPointerException이 있다. 참조 타입 변수를 사용하는 것은 곧 객체를 사용하는 것을 의미하는데, 참조 타입 변수가 null을 가지고 있다면 곧 참조할 객체가 없다는 것이므로 사용할 수가 없다. 하지만 프로그래머의 실수로 null값을 가지고 있는 참조변수를 사용한다면 이 예외가 발생한다.

[참고]
String은 클래스 타입이므로 참조 타입이다.
자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어있다.
아래의 경우 name1, name2은 동일한 String 객체를 참조한다.

String name1 = "박세진";
String name2 = "박세진";

하지만 아래처럼 new 연산자를 사용해서 직접 String 객체를 생성하는 경우, name1과 name2는 서로 다른 String 객체를 참조한다.

String name1 = new String("박세진");
String name2 = new String("박세진");

동일한 String 객체이든, 다른 String 객체이든 상관없이 문자열만을 비교할 때는 String 객체의 equals 메소드를 사용해야 한다.


위에서 String 객체는 참조 타입이므로 초기값으로 null을 대입할 수 있다고 했다. 다음 코드처럼 name 변수가 String 객체를 참조하였으나, null을 대입함으로써 더이상 String 객체를 참조하지 않도록 할 수 있다.

String name = "박세진";
name = null;

그렇다면 참조를 잃은 String 객체는 어떻게 될까?
JVM은 참조되지 않은 객체를 쓰레기 객체로 취급하고, Garbage Collector를 구동시켜서 메모리에서 자동으로 제거한다.

글을 마치면서

배열에 대해서도 같이 쓰려고 하였지만, 배열은 따로 글을 작성하여 리스트와 비교해 주는 것이 더 좋을 것 같아서 같이 적지 않았다.
참조 타입은 기존에 알고 있던 것을 복습하는 개념으로 가볍게 적어보았다.

글을 작성하다보니 처음 자바를 배웠을 때가 새록새록 떠오른다. 객체의 값을 저장하는게 아니라, 메모리의 주소를 저장한다는 것이 대체 무슨 말인지, 개념적으로도 잘 이해가 되지 않았다.
다시 한 번 정리를 하는 이 시점이 되니 어느정도 이해가 되는것 같다.
이럴 때마다 생각나는 말이 있다
익숙하지 않아서 그런것 뿐이야. 차분히 하면 잘 할수 있어.
오늘의 나는 어제의 나보다 자바에 좀 더 익숙해진 것이라 생각한다. 그 생각을 잊지 않고 앞으로 열심히 글을 써보려고 한다.

profile
계속해서 기록하는 개발자. 조금씩 성장하기!

0개의 댓글