programing

Java에 포인터가 있습니까?

nicescript 2021. 1. 13. 23:34
반응형

Java에 포인터가 있습니까?


Java에 포인터가없는 경우 Java에서 new키워드는 무엇을합니까?


지적했듯이 Java에는 참조가 있습니다. 이것들은 어떻게 다릅니 까?

  1. 당신은 이것들에 대해 산술이나 다른 연산을 수행 할 수 없습니다.
  2. 그들은 개체를 포함하는 메모리를 가리 키지 않는다 (즉, 그들은 다른 이름으로 포인터하지 않습니다). JVM은 VM 메모리 내에서 객체를 자유롭게 이동할 수 있으며 대부분 가비지 수집 중에 수행됩니다. 그러나 참조는 메모리 내에서의 움직임에도 불구하고 여전히 해당 객체를 가리 킵니다.

따라서 이들은 C ++ 참조 (객체를 직접 가리킴)와는 다릅니다. 아마도 더 나은 이름은 handle 일 것 입니다.


Java에는 포인터가 없습니다. Java에는 참조가 있습니다.

좋은 점이지만 포인터에는 일반적으로 사용하거나 사용하지 않을 수있는 추가 작업이 있습니다. 작업이 안전하지 않을 수 있으므로 참조에는 이러한 작업이 없습니다.

예를 들어 포인터를 사용하여 다음과 같이 배열의 첫 번째 요소를 인덱싱하는 경우 :

int squares[] = {1, 4, 9, 16, 25, 36, 49};
int* intPointer = squares;

포인터를 역 참조하고 "1"값을 얻고 싶을 수도 있지만 다음과 같이 할 수도 있습니다.

intPointer++

그런 다음 포인터를 역 참조하면 "4"값을 얻게됩니다. 잠시

intPointer++;

역 참조되면 "9"값을 제공합니다. 이는 ++ 연산이 포인터를 메모리에서 한 "단위"앞으로 이동하기 때문입니다.

이 문제는 C / C ++ 유형 검사 시스템의 약점에서 비롯됩니다 (C ++는 C와의 호환성을 유지해야하므로 동일한 문제가 허용됨). 포인터는 메모리에 주소를 저장하고 ++ 연산은 주소에 적절한 수의 바이트를 추가합니다. 많은 시스템에서 ++ ing int는 4 바이트를 추가하지만 포인터가 char 포인터 인 경우 ++ ing은 1 바이트 만 추가해야합니다. 포인터의 기본 데이터 유형은 메모리의 주소이므로 다음은 합법적이지만 권장되지 않습니다.

char* charPointer = squares;
charPointer++;

void* voidPointer = squares;
voidPointer++;

포인터는 메모리의 주소이기 때문에 컴퓨터의 메모리 비트를 (올바르게) 나타낼 수 있지만 기본 데이터가 포인터의 유형과 정렬을 매핑 할 때만 적절하게 역 참조됩니다. 포인터를 안전하게 만들기 위해 많은 코드로 관리되지 않는 포인터의 경우 원하는 정보의 데이터 유형 (또는 정렬)을 벗어날 수 있으며 역 참조가 재난으로 끝날 수 있습니다. 사용자 지정 코드로이 문제를 해결하려고하면 하나의 포인터 속도가 너무 느려져 성능 문제를 발견 할 수 있으며 사용자 지정 "포인터 관리"코드에 오류를 추가 할 수있는 문이 열립니다.

Java 측에서는 참조를 반환하여 이러한 모든 문제를 해결합니다. 참조는 메모리의 어떤 위치도 참조하지 않습니다. Java는 내부 "포인터 참조"테이블을 유지합니다. 이 테이블은 참조를 가져 와서 해당 데이터가 메모리에 상주 할 수있는 모든 위치에 관련된 데이터를 반환합니다. 이것은 각각의 "dereferencing"에 대해 두 번의 조회, 참조 테이블에서 하나의 조회, 기계의 메모리에서 하나의 조회가 수행되기 때문에 코드 실행 속도가 느려집니다.

참조를 사용하는 Java의 큰 장점은 포인터 주소가 될 주소를 깨지 않고 메모리를 이동할 수 있다는 것입니다. C 프로그램에서 데이터를 새 메모리 위치로 이동하면 프로그램의 다른 부분에 데이터에 대한 포인터가 있는지 여부를 알기가 매우 어렵습니다. 메모리가 이동 한 후 부실 포인터가 역 참조되면 프로그램은 손상된 데이터에 액세스하고 일반적으로 충돌이 발생합니다.

실행중인 프로그램에서 메모리를 이동하는 기능을 통해 프로그램은 메모리를 쉽게 재활용 할 수 있습니다. 메모리 청크가 필요하지 않은 프로그램은 사용하지 않은 메모리를 해제 할 수 있지만 이로 인해 사용 된 메모리 청크 사이에 사용되지 않은 메모리 구멍이 생깁니다. 내부적으로 컴퓨터는 상당히 큰 메모리 페이지를 사용합니다. 드물게 사용 된 메모리 페이지에서 사용 된 비트를 다른 페이지로 이동할 수 있다면 메모리 페이지를 해제 할 수 있습니다. 이렇게하면 메모리에 대한 데이터 밀도가 증가하여 캐시 성능이 향상됩니다. 때때로 이것은 매우 극적인 성능 향상으로 이어집니다.

Java의 가비지 수집기는 참조 집합에 대한 데이터 액세스를 일시적으로 차단하여 참조 사용을 활용합니다. 액세스가 차단되는 동안 데이터를 압축하여 이동합니다. 차단 후 주소 테이블에 대한 참조는 새 메모리 주소를 갖습니다. 코드의 "기능적"계층은 처음에 주소를 알지 못했기 때문에이 작업은 실행중인 Java 프로그램을 중단시키지 않습니다.


Java에는 데이터에 대한 참조를 메모리에 저장하는 변수의 의미에서 포인터가 있습니다. Java에서 Object 유형의 모든 변수는 이러한 의미에서 포인터입니다.

그러나 Java 언어는 C와 같은 언어로 수행 할 수있는 것처럼 포인터 값에 대한 산술 연산을 허용하지 않습니다.


new (대략) 다음을 수행합니다.

  1. 생성중인 클래스의 인스턴스 크기와 부기 용 약간의 공간과 동일한 힙 메모리의 연속 된 사용 가능한 블록을 찾습니다.
  2. 공간을 0으로 지정하고 사용 가능한 목록에서 제거
  3. 생성자 실행
  4. 생성 된 인스턴스에 대한 참조 (다른 게시물에서 설명했듯이 포인터가 아님)를 반환합니다.

Java 에는 " reference " 라는 이름으로 알려진 포인터 있습니다 .

사람들이 "자바에는 포인터가 없습니다"라고 말하면 일반적으로 포인터 개념을 C 및 C 파생 언어에서 발견되는 포인터의 특정 구현 및 기능과 혼동합니다.

특히:

  • 자바 참조 는 임의의 주소로 설정할 수 없습니다 . Pascal이나 Fortran 포인터도 (표준) 할 수 없습니다.
  • Java 참조 는 변수를 가리 키도록 설정할 수 없습니다 . 파스칼 포인터도 (표준) 할 수 없습니다.
  • Java 참조 는 포인터 산술을 지원하지 않습니다 . Pascal이나 Fortran 포인터도 마찬가지입니다.
  • Java 참조 는 객체의 일부 (예 : 배열의 세 번째 요소)를 가리킬 수 없습니다 . 파스칼 포인터도 마찬가지입니다.

또한 널리 퍼진 믿음과는 달리 포인터가 반드시 주소 일 필요없습니다 . 포인터는 일반적으로 주소로 구현되지만 C 또는 C ++에서도 그렇게 할 필요가 없습니다.


java.lang.NullPointerException

사람들은 인터뷰에서 "자바에는 포인터가 없다"고 말했습니다. 나는 보통 그들에게 자바 코드를주고 그들이이 코드에서 무슨 일이 일어나고 있는지 설명하게한다.

public class TestPointers {

    public static void main(String args[]) {
        Object p1, p2;
        p1 = new Object();
        p2 = p1;
        p1 = null;
        System.out.println(p2);
    }
}

Java has references. All objects are accessed through having references to their instances. You create a new instance using new, which returns a reference to the object.

Java references are not like pointers in C, you cannot "look under the hood" at the raw memory that makes up the object.


new in Java returns a reference to the newly created object.


new returns reference. it has some similarities with pointers (if you pass to function, reference is passed, same as with pointer), but there is no pointer arithmetics.


Java Does not have Pointers. The operator "new" is used to the reference variable in java.


Java does not support or allow pointers. (Or more properly , Java does not support pointers that can be accessed and/or modified by the programmer.) Java cannot allow pointers, because doing so would allow Java applets to breach the firewall between the Java execution environment and the host computer. (Remember , a pointer can be given any address in memory - even addresses that might be outside the Java run-time system.)


In java we come across certain keywords used as reference for example this keyword is used to refer the variables of same class. The operator new is used as reference to an object.

ReferenceURL : https://stackoverflow.com/questions/2629357/does-java-have-pointers

반응형