본문 바로가기
IT 개인 공부/Java

[Java] Java에 포인터가 없는 이유 - 포인터(Pointer) vs 참조(Reference)

by Libi 2021. 8. 20.
반응형

C나 C++ 에는 포인터라는 개념이 존재하지만 Java에는 포인터라는 개념을 사용하지 않는다. 비슷한 개념으로 참조라는 것을 사용한다.

그렇다면 왜 Java에는 포인터가 존재하지 않을까?

그전에 포인터(Pointer)와 참조(Reference)의 차이를 간단하게 알고 넘어가자.

 

포인터, 참조 모두 주소를 통해 원본 데이터에 접근하는 공통 기능을 가진다.

다만, 포인터는 메모리를 직접 핸들링할 수 있지만 참조는 메모리를 직접 핸들링할 수 없다는 차이점이 존재한다.

포인터는 주소 값을 임의의 메모리 주소로 변경할 수 있다. 만약 개발자가 실수로 주소 값을 변경해버리면 segment fault 같은 문제가 발생할 가능성이 생기게 된다.

하지만 참조는 직접 메모리에 접근이 불가능하기 때문에 주소 값을 임의의 메모리 주소로 변경할 수 없다. 물론 직접적으로 메모리에 접근이 불가능한 것이지 new 키워드로 생성한 경우 내부적으로는 메모리 주소에 접근한다.

 

즉, 포인터를 사용하면 유연성과 성능을 향상시킬 수 있지만 안정성이 떨어지기 때문에 Java에서는 포인터라는 개념을 제거하였다.

제거하였다라기 보다는 개발자에게 제공하지 않는다는 말이 더 맞는 것 같다.

 

또한, JVM의 Garbage Collector의 동작 원리를 보면 포인터가 존재하면 안 되는 이유를 확인할 수 있다.

이를 알기 위해선 Garbage Collector의 동작 원리를 이해해야 한다. 만약 동작 원리를 모른다면 아래의 글을 참고하길 바란다.

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

 

[Java] 가비지 컬렉터(Garbage Collector)

C, C++은 개발자가 메모리를 직접 관리해야 하지만 Java에서는 개발자가 별도로 관리할 필요가 없이 JVM의 Garbage Collector에서 알아서 메모리를 관리해 준다. 가비지 컬렉터는 이름 그대로 쓰레기를

sorjfkrh5078.tistory.com

 

GC의 동작원리를 살펴보면 처음에 Eden 영역에 객체들이 저장되다가 Eden 영역이 꽉 차게 되면 UnReachable Object를 제거하고 살아남은 객체를 Survivor1 영역으로 옮기게 된다.

만약, Survivor1 영역이 다 차게 되면 Survivor2 영역으로 옮기게 되고, age를 기준으로 Old 영역으로 옮기게 된다.

즉, GC가 실행될 때마다 Heap 영역의 객체의 주소가 계속 바뀐다는 것을 알 수 있다.

 

만약 포인터를 통해 주소를 직접 접근할 수 있다면 어떤 문제가 발생할까?

사용하고자 했던 객체의 주소가 100번지였는데 GC로 인해 200번지로 이동하였다고 하자. 다시 해당 객체를 사용하려고 하는데 개발자가 실수로 200번지가 아닌 201번지에 있는 객체를 접근했다고 하자.

전혀 상관없는 객체를 건드릴 수 있다는 것은 치명적인 오류를 발생시킬 수 있다.

하지만 참조로 접근한다면 주소가 변경되어도 원하는 객체에 보다 안전하게 접근할 수 있다.

사람은 언제나 실수할 수 있기 때문에 Java에서는 포인터를 통해 직접 주소를 접근하지 말고 참조를 통해 접근하도록 하여 안정성을 높인 것이다.

 

 

 

[ Reference ]

· https://hashcode.co.kr/questions/4973/c-%ED%8F%AC%EC%9D%B8%ED%84%B0-vs-java-%EC%B0%B8%EC%A1%B0%ED%98%95-%EB%B3%80%EC%88%98-vs-%EA%B8%B0%ED%83%80-%EC%96%B8%EC%96%B4-%EB%B9%84%EA%B5%90

· https://m.blog.naver.com/mdown/221316604612

 

 

반응형

'IT 개인 공부 > Java' 카테고리의 다른 글

[Java] 컬렉션 팩토리 : of  (0) 2021.09.26
[Java] 상속(Inheritance) vs 위임(Delegation)  (1) 2021.08.22
[Java] 가변인자(Varargs)  (0) 2021.08.16
[Java] 명명 관습(Naming Conventions)  (0) 2021.08.14
[Java] JVM, JRE, JDK  (0) 2021.07.22

댓글