English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
면접 복사하기:/시험 문제:
객체가 메서드로 전달되면, 이 메서드는 해당 객체의 속성을 변경할 수 있으며, 변경된 결과를 반환할 수 있습니다. 이렇게 되면 여기서는 값 전달인지 참조 전달인지는 무엇인가요?
답변:
값 전달입니다. Java 언어의 메서드 호출은 매개변수의 값 전달만 지원합니다. 객체 인스턴스가 메서드로 전달될 때, 매개변수의 값은 해당 객체의 참조입니다. 객체의 속성은 호출 중에 변경될 수 있지만, 객체 참조의 변경은 호출자에 영향을 미치지 않습니다.++C#에서는 참조를 전달하거나 출력 매개변수를 전달하여 입력 매개변수의 값을 변경할 수 있습니다. C#에서는 다음과 같은 코드를 작성할 수 있지만, Java에서는 이렇게 할 수 없습니다.
java에서의 값 전달과 주소 전달(참조 전달), 이 두 개념을 이해해야 하며, 값 전달과 주소 전달을 이해해야 합니다.
아래는 간단한 예제를 통해 설명합니다:
예를 들어, 당신이 해외 여행을 다녀와서 특별히 좋은 사진을 찍었고, 친구에게 공유하고 싶다면, 두 가지 방법이 있습니다. 첫 번째는 그 사진을 직접 친구에게 보내는 것이며, 친구에게 사진의 복제본을 제공하는 것입니다. 두 번째는 그 특별히 좋은 사진을 QQ(微博) 등에 업로드하여 사진에 대한 접근 주소(URL)을 얻고, 그 URL을 친구에게 공유하는 것입니다.
위의 예제에서, 첫 번째는 값 전달이라고 생각할 수 있으며, 두 번째는 주소 전달(참조 전달)이라고 생각할 수 있습니다. 이 개념을 이해한 후, 아래의 간단한 분석을 시작하겠습니다.
값 전달:매개변수가 기본 유형 변수인 경우에만 java가 이러한 전달 전략을 사용합니다.
위의 사진 공유, 친구가 얻는 사진은 당신의 사진의 복제본이며, 친구가 사진을 수정하면 당신의 사진에 영향을 미치지 않으며, 당신이 사진을 수정하면 친구에게 공유한 사진에도 영향을 미치지 않습니다.
주소 전달:매개변수가 참조 유형 변수인 경우에만 java가 이러한 전달 전략을 사용합니다.
위의 URL 주소를 친구에게 제공하면, 친구도 수정 권한이 있을 경우 친구가 사진을 수정하면 친구가 접근하는 사진은 친구가 수정한 결과입니다.
아래 코드를 통해 이 예제를 설명하겠습니다:
package com.dufy.reforvalue; import java.util.Arrays; /** * java에서 값 전달과 주소 전달 * 값 전달: 기본 유형 변수-값 전달, 값 전달은 매개변수의 복제본을 통해 얻습니다 * 주소 전달: 참조 유형 변수-주소 전달, 주소 전달은 객체의 참조 주소를 전달하는 것을 의미합니다 * * @author dufy * @creation 2017년2월9일 */ public class ReferenceOrValue { /** * 기본 유형, 값 전달 * 예를 들어: 친구에게 사진을 공유하면, 친구는 당신의 사진의 실제 복제본을 받습니다, * 당신과 친구는 각자의 사진에 대해 작업을 수행할 수 있으며, 서로의 사진에 영향을 미치지 않습니다! */ public static void testVal(int photo){ photo++;//친구가 사진을 수정합니다 System.out.println("내 친구가 본 사진 = " + photo); } /** * reference type: 주소로 전달 * 예를 들어: 친구에게 사진을 공유하면, 공유하는 것은 당신이 인터넷에 업로드한 사진의 URL(주소)입니다, * 친구와 함께 이 주소를 통해 사진에 접근할 수 있으며, 사진에 대해 작업할 수 있습니다! */ public static void testRef(Photo photo){ photo.setPhoto("java Photo,Great!");//친구가 너의 사진을 수정한다 System.out.println("내 친구가 본 사진 = " + photo.getPhoto()); } /** * reference type: 주소로 전달 * because array is a reference type. So the references are passed in, so swapping their values in the method also necessarily affects their original values. */ public static void testArrayRef(int[] array){ for (int i = 0; i < array.length; i++) { array[i] = 0; } System.out.println("testArrayRef array is = "+Arrays.toString(array)); } public static void main(String[] args) { //1: 값으로 전달 int photo = 10;//보내야 할 사진을 정의합니다 testVal(photo);//사진을 친구에게 보내면, 친구는 사본을 받습니다 System.out.println("내가 본 사진 = " + photo); //2: 주소로 전달 Photo p = new Photo();//사진 객체를 정의합니다. 저가 촬영한 java photo p.setPhoto("java photo"); testRef(p);//사진 객체(즉, URL 주소)를 친구에게 보내면, 친구는 URL(주소)를 받아야 합니다. URL을 열어야 사진이 열립니다 System.out.println("내 친구가 본 사진 = " + p.getPhoto()); //3: 배열도 객체이며, 배열은 스택 메모리에 있습니다. 참조는 스택에 있습니다. int array[] = {1,2,3,4,5}; testArrayRef(array); System.out.println("array is = "+Arrays.toString(array)); } /** * 사진 클래스 */ static class Photo{ String photo; public String getPhoto() { return photo; } public void setPhoto(String photo) { this.photo = photo; } } }
출력 결과는 다음과 같습니다:
내 친구가 본 사진 = 11
내가 본 사진 = 10
내 친구가 사진을 본다 = java Photo,Great!
내 친구가 사진을 본다 = java Photo,Great!
testArrayRef array is = [0, 0, 0, 0, 0]
array is = [0, 0, 0, 0, 0]
단편: 다음과 같은 문제가 있습니다: 이 method는 어떻게 작성되어야 합니까?
public static void main(String[] args) { int a = 10; int b = 20; method(a,b);//method가 호출된 후에만 a=를 출력해야 합니다.100,b=200, method(a,b) 메서드를 작성해 주세요! System.out.println("a = ", + a); System.out.println("b = ", + b); }
많은 사람들이 저와 같이 생각 없이 다음과 같은 코드를 작성하는 경우가 많습니다:
private static void method(int a, int b) { a*=10; b*=10; }
하지만 실행 결과를 확인해 보면, 예상한 결과가 출력되지 않았습니다!
위의 설명을 잘 보면, 이러한 결과가 왜 발생하는지 쉽게 이해할 수 있습니다!
이 문제가 가능한 올바른 결과는 다음과 같습니다:
private static void method(int a, int b) { System.out.println("a=",100,b=200"); System.exit(0); }
위에 설명된 것은 편집자가 여러분에게 소개한 Java의 값 전달과 주소 전달(면접에서 자주 질문되는 내용)입니다. 여러분에게 도움이 되길 바랍니다. 어떤 질문이나 의문이 있으면, 댓글을 남겨 주시면 편집자가 즉시 답변을 드리겠습니다. 또한,呐喊 강의 사이트에 대한 여러분의 지지에 깊이 감사드립니다!
선언: 본문은 인터넷에서 가져왔으며, 원저자에게 소유권이 있습니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 본 사이트는 소유권을 가지지 않으며, 인공적인 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으면, notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com에 (이메일 발송 시, #을 @으로 변경하여) 신고를 하시고 관련 증거를 제공해 주시면, 사이트가 즉시 저작권 침해 내용을 삭제할 것입니다.