티스토리 뷰

Programming/Java

Java :: 자바 :: Reference type

디빌리 2013. 4. 28. 23:18

What is the reference type?


  자바의 자료형은 크게 기본형과 레퍼런스 타입으로 분류할 수 있다. 레퍼런스 타입은 new 연산자를 통해서 힙(heap) 영역에 생성되는 자료형들을 의미한다. 레퍼런스 타입으로는 클래스, 배열, 인터페이스가 있다.

프로그래밍 언어에서 포인터와 레퍼런스는 다른 메모리 공간에 대한 주소를 가지고 있따는 점에서 매우 유사하기 때문에 혼동되는 개념이다. 포인터 혹은 레퍼런스 타입이 가리키고 있는 곳의 값에 접근하는 것을 디레퍼런스(dereference)라고 한다. 자바는 C++와는 달리 포인터를 지원하지 않고, 레퍼런스만 지원한다. 포인터와 자바 언어에서 사용되는 레퍼런스는 다음과 같은 차이점을 가지고 있다.



Pointer

Java reference

연산 

산술 연산 가능 

산술 연산 불가능 

디레퍼런스 방법 

명시적인 연산자를 사용 

ex. '->'

자동적으로 이루어짐 

가리킬 수 있는 메모리 영역 

메모리에 존재하는 임의의 장소 

힙(heap) 영역의 객체 

값의 직접 기술 가능성 

값 자체를 기술할 수 있다

(ex. pi = 0xefff9ec)

간접적인 방법 사용 




How to create a reference type in Java?


  자바에서 레퍼런스 타입들을 어떻게 생성하고, 이것들이 메모리어 어떻게 할당되는지 알아보도록 하자. C++ 프로그래밍 언어는 자바 언어와 유사하지만, C++언어에서 객체를 생성하는 방법과 자바에서 객체를 생성하는 방법은 약간 다르다. 다음 표에서 보는 것과 같이 C++에서는 Car라는 클래스 타입의 변수를 직접 선언하는 경우(방법1)와 Car라는 클래스 타입의 포인터로 선언하는 경우(방법 2)가 있다.

  방법 1을 사용하면 변수가 런 타임 스택(run time stack)에 Car 타입으로 생성된다. 그러나 방법 2와 같이 new 연산자를 사용하는 경우에 Car 타입을 위한 공간은 힙(heap) 영역에 생성되고, 이곳의 포인터 값(주소 값)이 pmycar 변수에 할당된다. 방법1과 2는 Car 객체의 cost라는 속석에 접근하는 방법도 판이하다. 방법 1의 경우에는 '.' 연산자를 이용하지만, 방법 2의 경우에는 '->' 연산자를 이용한다.


 

C++ 

Java 

 객체 생성 방법

방법1.
Car mycar;

mycar.cost = 500; 

Car mycar;

mycar = new Car();

mycar.cost = 500;

 방법2.
Car * pmycar;
pmycar = new Car();

pmycar -> cost = 500;


  기본 자료 타입의 변수를 선언하면 메모리에 공간이 할당된다. 그러나 레퍼런스 타입은 new를 이용해서 생성하기 전까지는 메모리 공간이 할당되지 않는다. 다음 예는 기본 자료 타입인 int 형과 레퍼런스 타입은 Car 클래서의 선언과 메모리가 할당되는 과정을 보여준다.


 1. int a = 100;

 2. Car mycar;

 3. mycar = new Car();

 4. Car yourcar = mycar;


  a, mycar, yourcar 등의 변수는 함수 안에서 선언되는 경우에 지역변수라고 하고, 지역 변수는 스택(run time stack)영역에 메모리가 할당된다. 스택에 할당된 지역 변수들은 함수가 실행되는 동안에만 존재하게 되고, 함수가 끝나면 자동적으로 사라진다. 반면에 new Car()를 통해서 만들어진 Car 객체는 힙(heap) 영역에 만들어진다. 힙 영역에 만들어진 데이터나 객체는 별도로 삭제하지 않는 한 계속적으로 존재하게 된다. C나 C++에서는 힙 영역에 만들어진 데이터를 삭제하는 함수가 있지만, 자바에는 이러한 함수가 존재하지 않는다. 대신 가비지 콜렉터(garbage collector)가 자동적으로 더 이상 사용되지 않는 객체들을 삭제한다. 클래스의 정보와 메소드 내용들은 메소드 영역에 저장된다.



출처 : 프로그래머를 위한 JAVA2, 홍릉과학출판사

'Programming > Java' 카테고리의 다른 글

Java :: 문서화 주석  (0) 2015.11.05
Java :: 환경변수 설정  (0) 2014.09.01
Java :: 자바 :: Scanner Class  (2) 2012.11.02
Java :: 자바 :: StringTokenizer 클래스  (0) 2012.11.02
Java :: 자바 :: Vector 클래스  (1) 2012.11.02
댓글