영운's 블로그

[Java] 자바에서 포인터가 아닌 참조(Reference) 자료형을 사용하는 이유는? 본문

자바

[Java] 자바에서 포인터가 아닌 참조(Reference) 자료형을 사용하는 이유는?

오영운(you88) 2022. 7. 11. 11:57

 

 

포인터와 참조 자료형 모두 주소값을 저장한다.

C, C++ 같은 언어는 포인터를 사용하며 Java 참조 자료형을 사용한다.

그렇다면 포인터와 참조 자료형의 차이는 무엇이고 Java는 왜 참조 자료형을 사용하는지 그 이유를 알아보자

 

 

포인터와 참조(Reference) 자료형의 차이

 

포인터는 임의의 메모리 주소를 저장 가능하고 참조 자료형은 임의의 메모리 주소를 저장할 없다.  

개발자는 포인터에 임의로 0x100000e64 같은 주소를 저장할 있다. 이 과정에서 포인터에 잘못된 주소를 저장할 수도 있으며 그에 따라 'segment fault' 같은 오류가 발생하는 것은 모두 개발자의 책임이다.

 

자바의 참조 자료형 개발자가 임의로 메모리 주소를 지정하여 저장하는 것이 불가능하다.

개발자가 참조 자료형에 new 키워드로 생성한 객체를 선언하면 JVM 대신 참조 자료형에 객체의 주소를 저장한다.

 

 

자바는 포인터가 아닌 참조 자료형을 사용할까?

 

 

답은 Java만이 갖고 있는 독특한 특징인 JVM(Java Virtual Machine) GC(Garbage Collector 있다.)

그림을 통해 있듯 객체는 생성 시 (Heap) 영역에 저장되고 참조변수는 스택(Stack)영역에 선언되어 객체의 영역 주소를 저장한다. 객체가 저장된  메모리의 특정 영역이 차면 Garbage Collector는 이상 스택(Stack)에서 참조되지 않은 (Heap) 영역의 객체들을 제거하고  과정에서 GC 의해 제거되지 않은 객체들도 메모리의 다른 영역으로 이동된다. 결국 Heap 영역에서 객체의 주소는 고정적이지 않다.

 

따라서 Java에서 개발자가 임의로 메모리 값을 설정할 있는 포인터를 허용한다면 개발자는 Garbage Collector 의해 주소값이 바뀌어도 이를 알지 못하고 기존의 주소값으로 접근을 시도하여 개발자가 의도하지 않은 엉뚱한 주소에 접근하게 된다.

 

 

포인터와 참조 자료형의 장단점 비교

 

  포인터 참조(Reference)
메모리 설정 자율성 높다 낮다
메모리 관리 편의성 낮다 높다
안전성 낮다 높다
성능 높다 낮다

 

1. 메모리 설정 자율성

앞서 언급했듯 포인터는 개발자가 임의로 메모리 값을 설정하고 해당 메모리에 직접 접근이 가능하기에 참조 자료형에 비해 상대적으로 메모리 설정 자율성이 높다.

 

2. 메모리 관리 편의성

자바는 참조 자료형을 사용하는 대신 Garbage Collector를 사용하여 개발자 대신 참조되지 않는 메모리는 자동으로 해제하여 메모리를 효율적으로 관리한다.

 

3. 안전성

메모리 설정의 자율성과 반대되는 개념인데 포인터는 개발자가 임의의 메모리를 설정할 수 있기에 그에 따라 잘못된 메모리에 접근하여 segmant fault 오류가 발생할 가능성이 있다. 하지만 자바는 JVM과 GC를 통해 스스로 메모리 관리를 하고 개발자가 직접적으로 메모리에 접근하는 것을 막아 이러한 오류를 방지한다.

 

4. 성능

자바의 JVM과  GC가 편리하기는 하지만 이것 자체가 리소스를 소비하기 때문에 성능상으로는 포인터를 사용하는 C나 C++이 더 우세하다. 실제로 극한의 성능을 발휘해야 하는 곳에서 Java보다 C언어를 사용하는 이유가 바로 이것이다.

 

 


참고

https://sorjfkrh5078.tistory.com/278

https://sorjfkrh5078.tistory.com/77?category=1007499 

 

Comments