본문 바로가기
Java

[Java] Java 에도 pointer가 있는가?

by 꾸압 2022. 8. 13.

 

<선결론>

  - 없음

 


 

<개념>

  - C/C++ 에서 Pointer는 주소값을 가진 변수.

    ==> Pointer란?

            * algebraic data type이다.

            * 다른 data type 을 가지는, null인 data type.

            * 엄밀히 말해 Memory address를 명시적으로 다룰 수 있는 interface 환경의 data type에만 써야함.

 

  - Java 의 Class는 주소값 없이 그저 가져다 쓰는 참조. (참조 변수 new)

 


 

<기능적 차이>

  - C++ 에는 reference(참조) 가 따로 있음. 이 reference가 Java의 Class 와 비슷한 기능을 하지만 또 다름.

    ==> C++은 한번 Reference하면 바꿀 수 없지만, Java는 가능.

    ==> C++의 Reference는 Null 로 초기화 할 수 없지만, Java는 가능.

    ==> C++의 Reference는 할당 후 변경 불가지만, Java는 가능.

    ==> C++의 Reference에 Null을 할당 후 사용하면 application이 죽지만, Java는 NullPointerException 예외 발생

 

  - Pointer를 reference 처럼 쓸 수 있지만, Reference를 Pointer처럼 못 씀. (여기서 오해가 발생한 듯)

 

  - C++의 Smart Pointer 또한 Java의 Reference 와 다르다. Smart Pointer는 변수가 scope를 벗어나면 memory가 해제. Java는 유지.

 

  - Pointer를 통해 C/C++은 low-level(Hardware) 제어를 함.

 

  - Java 에서 low-level 제어가 불가능한게 아님. low-level 언어를 경유하면 가능.

    1) JNI를 통해 제어 가능.

      ==> C/C++ 등으로 wrapping된 low-level 드라이버(api)를 만들고, 이를 Java와 연동되는 메커니즘(framework)인 JNI로 build.

    2) IPC 사용

      ==> low-level 제어를 하는 다른 프로그램 언어로 만들고, 이 프로그램을 독립 수행시킨 뒤 Java와 IPC로 통신.

    3) 굳이 이렇게 까지 쓸 필요가 있을까? overhead(손해)다.


 

<왜 Java엔 Pointer가 없는가?>

  - Java는 객체의 접근이 모두 안전하게 처리된다는 보안의 중요성을 전제로 설계한 언어.

  - 앞선 이유들로 Pointer를 제외. C++의 Reference와 비교만해도 Java의 것이 훨씬 안정적이다.

 


 

<Deep Knowledge>

  - 모든 컴파일러에서 변수는 주소값.

    ==> user가 작성한 변수명/함수명은 compile 시, 절대 주소든 상대주소든 특정 address로 번역되기에.

    ==> 상대 주소는 complie 시 결정&고정, 절대 주소는 매 실행 때마다 달라짐.

 

  - Pointer가 있는 언어(C)는 절대 주소, 상대 주소 모두 참조&사용이 가능

  - Pointer가 없는 언어(Java)는 상대 주소만을 사용하며, 절대 주소는 참조&활용이 차단.

 

  * Pointer가 없는 언어는 직접 접근/활용이 제한된 언어.

 


 

<출처 1> https://kldp.org/node/70013

<출처 2> https://stackoverflow.com/questions/4305673/does-c-have-references

<출처 3>

 

'Java' 카테고리의 다른 글

[Java] public static void main(String[] args) 의미  (0) 2022.06.08

댓글