Java에서 포인터를 사용하려면 어떻게 해야 하나요?
자바에 포인터가 없다는 것은 알지만, 자바 프로그램은 포인터로 만들 수 있고, 자바에 정통한 소수만이 할 수 있다고 들었습니다.그게 사실인가요?
Java의 모든 객체는 참조이며 포인터처럼 사용할 수 있습니다.
abstract class Animal
{...
}
class Lion extends Animal
{...
}
class Tiger extends Animal
{
public Tiger() {...}
public void growl(){...}
}
Tiger first = null;
Tiger second = new Tiger();
Tiger third;
null 참조 해제:
first.growl(); // ERROR, first is null.
third.growl(); // ERROR, third has not been initialized.
에일리어싱 문제:
third = new Tiger();
first = third;
셀 손실:
second = third; // Possible ERROR. The old value of second is lost.
먼저 이전 값인 second가 더 이상 필요하지 않음을 확인하거나 다른 포인터에 second 값을 할당하여 이 작업을 안전하게 수행할 수 있습니다.
first = second;
second = third; //OK
두 번째 값(NULL, new...)은 잠재적인 오류와 마찬가지로 가리키는 개체를 잃을 수 있습니다.
합니다(Java 시시시(((((((((((((((((((((((((( 。OutOfMemoryError
신규로 콜했을 때, 할당자가 요구된 셀을 할당할 수 없는 경우).이는 매우 드물며 일반적으로 도주 재귀로 인해 발생합니다.
언어의 관점에서 오브젝트를 가비지 컬렉터에 폐기하는 것은 오류가 아닙니다.프로그래머가 알아야 할 사항일 뿐입니다.같은 변수가 다른 시간에 다른 개체를 가리킬 수 있으며 포인터가 참조하지 않으면 이전 값이 회수됩니다.그러나 프로그램의 로직이 오브젝트에 대한 참조를 적어도1개 유지해야 하는 경우 오류가 발생합니다.
초보자라면 종종 다음과 같은 오류를 범합니다.
Tiger tony = new Tiger();
tony = third; // Error, the new object allocated above is reclaimed.
당신이 말하고자 하는 것은 아마도 다음과 같습니다.
Tiger tony = null;
tony = third; // OK.
부적절한 주조:
Lion leo = new Lion();
Tiger tony = (Tiger)leo; // Always illegal and caught by compiler.
Animal whatever = new Lion(); // Legal.
Tiger tony = (Tiger)whatever; // Illegal, just as in previous example.
Lion leo = (Lion)whatever; // Legal, object whatever really is a Lion.
C의 포인터:
void main() {
int* x; // Allocate the pointers x and y
int* y; // (but not the pointees)
x = malloc(sizeof(int)); // Allocate an int pointee,
// and set x to point to it
*x = 42; // Dereference x to store 42 in its pointee
*y = 13; // CRASH -- y does not have a pointee yet
y = x; // Pointer assignment sets y to point to x's pointee
*y = 13; // Dereference y to store 13 in its (shared) pointee
}
Java 포인터:
class IntObj {
public int value;
}
public class Binky() {
public static void main(String[] args) {
IntObj x; // Allocate the pointers x and y
IntObj y; // (but not the IntObj pointees)
x = new IntObj(); // Allocate an IntObj pointee
// and set x to point to it
x.value = 42; // Dereference x to store 42 in its pointee
y.value = 13; // CRASH -- y does not have a pointee yet
y = x; // Pointer assignment sets y to point to x's pointee
y.value = 13; // Deference y to store 13 in its (shared) pointee
}
}
UPDATE: 코멘트에서 제시된 바와 같이 C에 포인터 산술이 있다는 점에 유의해야 합니다.그러나 자바에는 그것이 없습니다.
Java에는 포인터 데이터형이 없기 때문에 Java에서는 포인터를 사용할 수 없습니다.몇 안 되는 전문가도 자바 포인터를 사용할 수 없습니다.
의 마지막 포인트도 참조해 주세요.자바 언어 환경
Java ★★★★★★★★★★★★★★★★★★★★★★★★★★★」 이 Java로 할 수 . 그러면 이 포인터는 다른 개체로 설정되거나null
원래 오브젝트는 그대로 존재합니다(가비지 컬렉션 제외).
자바에서 할 수 없는 것은 포인터 산술이다.특정 메모리 주소를 참조 해제하거나 포인터를 늘릴 수 없습니다.
로우레벨을 취득하려면 Java 네이티브인터페이스를 사용하는 방법밖에 없습니다.그 경우에도 로우레벨 부분은 C 또는 C++로 해야 합니다.
Java에는 포인터가 있지만 C++ 또는 C에서 조작할 수 있는 방법으로 포인터를 조작할 수 없습니다.오브젝트를 건네줄 때는 포인터를 그 오브젝트에 건네주는 것입니다만, C++와 같은 의미는 아닙니다.해당 개체는 참조를 취소할 수 없습니다.네이티브액세서를 사용하여 값을 설정하면 Java가 포인터를 통해 메모리 위치를 인식하기 때문에 값이 변경됩니다.하지만 포인터는 불변이다.포인터를 새 위치로 설정하려고 하면 다른 로컬 개체와 이름이 같은 새 로컬 개체가 생성됩니다.원래 개체는 변경되지 않습니다.다음은 그 차이를 보여주는 간단한 프로그램입니다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone {
public static void main(String[] args) throws java.lang.Exception {
System.out.println("Expected # = 0 1 2 2 1");
Cat c = new Cat();
c.setClaws(0);
System.out.println("Initial value is " + c.getClaws());
// prints 0 obviously
clawsAreOne(c);
System.out.println("Accessor changes value to " + c.getClaws());
// prints 1 because the value 'referenced' by the 'pointer' is changed using an accessor.
makeNewCat(c);
System.out.println("Final value is " + c.getClaws());
// prints 1 because the pointer is not changed to 'kitten'; that would be a reference pass.
}
public static void clawsAreOne(Cat kitty) {
kitty.setClaws(1);
}
public static void makeNewCat(Cat kitty) {
Cat kitten = new Cat();
kitten.setClaws(2);
kitty = kitten;
System.out.println("Value in makeNewCat scope of kitten " + kitten.getClaws());
//Prints 2. the value pointed to by 'kitten' is 2
System.out.println("Value in makeNewcat scope of kitty " + kitty.getClaws());
//Prints 2. The local copy is being used within the scope of this method.
}
}
class Cat {
private int claws;
public void setClaws(int i) {
claws = i;
}
public int getClaws() {
return claws;
}
}
이것은 Ideone.com 에서 실행할 수 있습니다.
Java에는 C와 같은 포인터가 없지만 변수에 의해 "참조"되는 새로운 객체를 힙에 만들 수 있습니다.포인터의 부족은 Java 프로그램이 메모리 위치를 부정하게 참조하는 것을 막고 Java Virtual Machine에서 가비지 컬렉션을 자동으로 수행할 수 있도록 하는 것입니다.
안전하지 않은 클래스를 사용하여 주소 및 포인터를 사용할 수 있습니다.그러나 이름에서 알 수 있듯이 이러한 방법은 안전하지 않으며 일반적으로 좋지 않습니다.잘못 사용하면 JVM이 랜덤으로 사망할 수 있습니다(실제로 같은 문제가 발생하면 C/C++에서 포인터를 잘못 사용합니다).
당신은 포인터에 익숙해져 있고 그것이 필요하다고 생각할 수 있지만(다른 방법으로 코드화하는 방법을 모르기 때문에), 당신은 그렇지 않다는 것을 알게 될 것이고 당신은 그것을 하는 것이 더 나을 것이다.
엄밀히 말하면 모든 Java 객체는 포인터입니다.그러나 모든 원시 유형은 값입니다.이러한 포인터를 수동으로 제어할 수 있는 방법은 없습니다.Java는 내부적으로 pass-by-reference를 사용합니다.
그렇지 않아, 아니야.
Java에는 포인터가 없습니다.만약 당신이 정말로 원한다면, 당신은 성찰과 같은 것을 중심으로 그것들을 모방해 볼 수 있지만, 그것은 어떠한 이점도 없이 포인터의 모든 복잡함을 가질 것이다.
Java는 포인터가 필요 없기 때문에 포인터가 없습니다.이 질문에서 어떤 대답을 원하십니까? 즉, 마음속으로는 어떤 것에 사용할 수 있기를 원하십니까?아니면 단지 호기심이었습니까?
Java의 모든 개체는 기본 요소를 제외한 참조 복사를 통해 함수에 전달됩니다.
즉, 포인터 복사본을 개체 자체의 복사본이 아니라 원래 개체로 보냅니다.
예를 들어 이해하시려면 댓글을 남겨주세요.
다른 사람들이 말했듯이, 짧은 대답은 "아니오"입니다.
물론 Java 포인터로 재생되는 JNI 코드를 작성할 수 있습니다.달성하려는 목표에 따라 다른 곳으로 갈 수도 있고 그렇지 않을 수도 있습니다.
배열을 만들고 인덱스를 사용하여 배열로 작업함으로써 언제든지 점을 시뮬레이션할 수 있습니다.다시 한 번 말하지만, 당신이 무엇을 달성하려고 하는가에 따라, 그것은 유용할 수도 있고 아닐 수도 있습니다.
'안드로이드 디컴파일링'이라는 책으로부터
보안은 Java에서 포인터를 사용하지 않기 때문에 해커가 응용 프로그램에서 벗어나 운영체제로 침입할 수 없습니다.포인터가 없다는 것은 메모리 할당과 해방 처리를 다른 것(이 경우는 JVM)이 해야 한다는 것을 의미합니다.메모리 누수는 또한 과거의 일이 되어야 한다, 혹은 이론상으로는 그렇다.C와 C++로 작성된 일부 애플리케이션은 프로그래머가 불필요한 메모리를 적절한 타이밍에 해방하는 데 주의를 기울이지 않기 때문에 메모리 누설이 체처럼 발생하는 것으로 악명이 높다.이것을 읽는 사람이 그러한 죄를 짓는 것은 아니다.가비지 컬렉션을 사용하면 프로그래머의 생산성이 향상되어 메모리 문제를 디버깅하는 시간이 단축됩니다.
Java 참조 유형은 Java에서 포인터에 대한 포인터를 가질 수 없기 때문에 C 포인터와 동일하지 않습니다.
리터럴에 대한 힌트도 얻을 수 있습니다.직접 구현해야 합니다.이것은 전문가에게는 매우 기본적인 것입니다;).포인터를 구현하기 위한 기본이 되는 int/object/long/byte 및 voila 배열을 사용합니다.이제 int 값은 해당 배열 int[]에 대한 포인터가 될 수 있습니다.포인터를 늘릴 수도 있고, 줄일 수도 있고, 곱할 수도 있습니다.너 정말 포인터 산술이 있구나!이것이 1000 int Atribute 클래스를 구현하고 모든 Atribute에 적용되는 범용 메서드를 갖는 유일한 방법입니다.int[] 대신 byte[] 배열을 사용할 수도 있습니다.
하지만 자바에서 리터럴 값을 참조로 전달해 주셨으면 합니다.뭔가 비슷한 게을러진 것 같아
//(* telling you it is a pointer) public void myMethod(int* intValue);
주소를 유지하는 변수를 포인터라고 하며 객체 hold address.so 객체가 포인터 변수이기 때문에 모든 Java 객체는 포인터입니다.
java는 배열 이름이 첫 번째 인덱스에 대한 포인터임을 알면 쉽게 포인터를 가질 수 있습니다.그래서 배열을 함수로 넘길 때 각 괄호를 쓰지 않습니다.배열이 참조이기 때문입니다.
public class Main
{
public static void func ( int ptr1[] , int ptr2[] )
{
int temp;
temp = ptr1[0];
ptr1[0] = ptr2[0];
ptr2[0] = temp;
}
public static void main(String[] args) {
int x = 5; int y = 8;
// in c language
// int *p = &x; int *q = &y;
// in Java
int p[] = new int[1];
int q[] = new int[1];
p[0] = x; // same as pointer
q[0] = y; // same as pointer
func( p , q ); // passing address ( refrence )
System.out.println( " After Swap " );
System.out.println( "x = " + p[0] + " " + "y = " + q[0] );
}
}
언급URL : https://stackoverflow.com/questions/1750106/how-can-i-use-pointers-in-java
'programing' 카테고리의 다른 글
SQL/MariaDB INSERT 결과를 얻는 방법 (0) | 2022.11.06 |
---|---|
Larabel 5에 외부 CSS 및 JS 파일을 포함하는 방법 (0) | 2022.11.06 |
PHP 배열이 연관성이 있는지 순차적인지 확인하는 방법 (0) | 2022.10.27 |
useEffect 후크 내부의 상태를 설정할 수 있습니까? (0) | 2022.10.27 |
반응: 컴포넌트 함수 내에 "this"가 정의되어 있지 않습니다. (0) | 2022.10.27 |