프리미티브에 대한 참조에 의한 전달과 동일한 Java
C에서 참조에 의한 전달을 사용하면 함수가 범위 외부의 변수를 수정할 수 있습니다. 그러나 Java는 값 전달 방식으로 작동하므로 기본 요소에 대해 동일한 효과를 얻기가 어렵습니다.
다음 코드를 고려하세요.
public class XYZ { public static void main(String[] args) { int toyNumber = 5; XYZ temp = new XYZ(); temp.play(toyNumber); System.out.println("Toy number in main " + toyNumber); } void play(int toyNumber) { System.out.println("Toy number in play " + toyNumber); toyNumber++; System.out.println("Toy number in play after increment " + toyNumber); } }
이 코드의 결과는 다음과 같습니다.
Toy number in play 5 Toy number in play after increment 6 Toy number in main 5
C와 달리 play() 내에서 toyNumber를 변경해도 main()의 값에는 영향을 주지 않습니다. 이는 Java가 참조가 아닌 복사로 기본 값을 전달하기 때문입니다.
대체 접근 방식
1. 객체 래퍼 사용:
한 가지 접근 방식은 기본 요소를 객체에 래핑하고 객체를 참조로 전달하는 것입니다.
class ToyNumber { int toyNumber; }
public static void main(String[] args) { ToyNumber toyNumber = new ToyNumber(5); XYZ temp = new XYZ(); temp.play(toyNumber); System.out.println("Toy number in main " + toyNumber.toyNumber); }
void play(ToyNumber toyNumber) { System.out.println("Toy number in play " + toyNumber.toyNumber); toyNumber.toyNumber++; System.out.println("Toy number in play after increment " + toyNumber.toyNumber); }
이 방법을 사용하면 다음이 가능합니다. play()에서 변경된 내용이 main()에 반영됩니다. 하지만 객체를 생성함으로써 추가적인 오버헤드가 발생합니다.
2. 값 반환:
또 다른 옵션은 수정된 값을 반환하는 것입니다.
int play(int toyNumber) { ... return toyNumber; }
public static void main(String[] args) { int toyNumber = 5; toyNumber = temp.play(toyNumber); System.out.println("Toy number in main " + toyNumber); }
이 접근 방식은 효과적이지만 반환 값을 받으려면 호출 사이트를 변경해야 합니다.
3. 정적 또는 클래스 변수:
play() 및 main()이 동일한 클래스 또는 클래스 인스턴스 내에 있는 경우 정적 또는 클래스 변수 사용을 고려하세요.
class XYZ { static int toyNumber = 5; ... }
public static void main(String[] args) { XYZ.play(); System.out.println("Toy number in main " + XYZ.toyNumber); }
static void play() { ... XYZ.toyNumber++; ... }
이 방법을 사용하면 두 함수 모두 동일한 변수를 수정할 수 있지만 동시성 문제가 발생할 수 있으므로 멀티 스레드에는 권장되지 않습니다. 응용 프로그램입니다.
위 내용은 Java에서 프리미티브에 대한 참조별 전달 효과를 어떻게 달성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!