2016-08-25 4 views
-1

Java 및 C++에서 BST가 구현되는 방식을 비교하려고합니다. 자바에서는 노드는바이너리 검색 트리는 포인터없이 Java에서 어떻게 작동합니까?

class Node{ 
    int data; 
    Node left; 
    Node right; 
} 

추천하고 C에 보일 것이다 ++는 다음과 같습니다 자바 접근 방식이 작동하는 이유

class Node{ 
     int data; 
     Node *left; 
     Node *right;  
    } 

내가 같은 혼란 스러워요. C++에서 왼쪽 및 오른쪽 포인터는 다음 노드가 포함 된 메모리 영역을 가리키고 있음을 이해합니다. Java에서 나는 모든 것이 연결되는 것을 끝내지 못합니다. 왼쪽과 오른쪽은 노드에 대한 포인터가 아니라 노드 자체이므로 Java의 각 노드 객체는 3 노드 (자체 노드와 자식 노드)의 공간을 차지합니까? 누구나 실제로 모든 노드가 얼마나 정확하게 연결되어 있고 메모리 할당의 차이가 있는지에 관해서 여기서 실제로 무엇이 일어나는지 설명 할 수 있다면 매우 유용 할 것입니다.

또한 C++에서 동일한 작업을 수행 할 수 있습니까? 포인터 대신 노드 왼쪽과 노드를 가질 수 있습니까? 그렇다면 처음부터 포인터를 사용하면 어떤 이점이 있습니까? 고맙습니다!

+2

Java가 참조를 사용 중입니다. C++에는 또한 참조가 있습니다. 일부 언어에는 참조가 없습니다. –

+3

자바는 거의 모든 것을 위해 포인터를 사용합니다. 변수를 객체와 동일하게 설정할 때마다 객체에 대한 포인터 만 저장하면됩니다. 차이점은 Java가 포인터에 직접 액세스하거나 조작하거나 수학을 사용하지 못하게한다는 것입니다. 자동 및 때로는 원활하게 처리합니다. – kbelder

+0

@ArchbishopOfBanterbury 아니요, 이것들은 전혀 이해가되지 않습니다. 만약 당신이 말한 것처럼'left'와'right'가''binary_search_tree' 인스턴스 "라면,이 클래스를 사용할 때마다 런타임 오류가 발생할 것입니다. 메모리 할당이 중지되지 않습니다). Java 참조는 인스턴스가 아닙니다. 참조에 인스턴스를 할당 할 수 있지만 'null'일 수도 있습니다 ('null'은 인스턴스의 인스턴스가 아닙니다). – Xiobiq

답변

6

Java 코드에서 클래스 형식 (leftright) 멤버 선언 은 암시 적으로 포인터를 선언합니다. 대부분의 모든 것이 포인터를 통해 처리되기 때문에 Java에서 포인터에 대한 특별한 표기법은 없습니다. 이것들은 이라 불리며, Java 언어 사양에서는 포인터이지만, 대부분의 Java 프로그래머는 을 참조이라고합니다.

예를 들어 본질적으로 Java와 C++에서 다른 구문이지만 C++ 포인터 나 C++ 참조는 Java 포인터에 직접 해당하지 않습니다.

참고 : Java에 포인터가 없다는 인수가 발생할 수 있습니다. 어떤 이유에서 나는 그들이 좋아하는 언어의 사양에 익숙하지 않은 이유가 무엇이며 왜 그들은 화면에서 NullPointerException을 무시할 수 있습니까?) 일부 Java 프로그래머는 언어에 포인터가 있다는 것을 맹렬히 부정 할 것입니다. 이것은 수수께끼이지만 안전하게 무시할 수 있습니다.

+0

C 또는 C++에서 포인터를 조작 할 수있는 것과 같은 방법으로 Java 참조를 조작 할 수 없습니다. 그리고 물론 C와 C++에서 포인터를 만들 수는 있지만 Java에서 기본 유형에 대한 참조를 얻을 수는 없습니다. – NullUserException

+0

나는 종종이 포인터 공포에 대해 궁금해했다. 아마도 C 포인터가 단일 객체를 가리키는 것 이상을 수행하기 때문일 수 있습니다. – juanchopanza

+0

그래서 내가 올바르게 이해한다면, 위의 두 코드 스 니펫은 본질적으로 같은 것을합니다. 포인터없이 C++에서 Node 클래스를 작성하면 어떻게됩니까? 위의 2와 완전히 다를 것입니까? –

관련 문제