2012-05-03 4 views
0

정적 메서드와 호출 참조별로 배열을 전달하는 방법에 대해이 섹션을 읽었습니다. 그래서 내 질문은 : 언제 배열에 배열을 void로 반대로 리턴하는 것이 좋은 때인가?정적 메서드 - 배열 인수를 void로 반환하고 배열로 반환 할 경우?

미리 감사드립니다.

+3

수정 된 배열이 필요하지만 매개 변수 배열을 유지하려는 경우 –

+0

정적 메서드는 특별하지 않습니다. 모든 객체는 "참조"에 의해 전달됩니다. – Ryan

+1

Java에서 인수 나 결과를'void'로 전달할 수 없습니다. '무효'데이터 유형은 없습니다. –

답변

4

이 섹션에서는 참조로 호출하여 정적 메서드를 전달하는 방법에 대해 살펴 보았습니다.

이 기사가 Java 기사, 사이트, 블로그, 책인 경우, 더 좋은 기사를 찾아야합니다. Java는 모든 매개 변수에서 "call-by-reference"를 사용하지 않습니다. 그 중 하나가 자바를 이해하지 못하거나 "참조로"무엇을 의미하는지 이해하지 못한다고 말하는 사람.

Java는 모든 인수를 값으로 전달합니다. 기간.

혼란스러운 점은 어떤 사람들은 자바의 객체와 배열이 항상 참조된다는 것을 이해하지 못한다는 것입니다. 따라서 배열 (예를 들어)을 인수로 전달하면 이라는 값을 사용하여 배열에 대한 참조를 전달합니다. 그러나 이것은 단정하지 않습니다. 값으로 참조를 전달하는 것은 실제 "값으로 호출"과 의미 적으로 매우 다릅니다. 실제 견적을 다시

:

"모든 예는 자바 배열을 전달하는 메커니즘이 배열의 내용에 대한 참조 메커니즘을 통해 호출이 있다는 기본적인 사실을 강조"(Sedgewick).

나는 그가 "배열의 내용에 대해"자격 주어, 무슨 말을 이해합니다. 그러나이 "부르심에 의한 부르심"을 부르는 것은 오해의 소지가 있습니다. (그리고 분명히 당신은에 의해 어느 정도 오도했습니다.)

나는 또한 기술적으로 틀렸다고 주장합니다. 매개 변수 전달/반환에 대한 "call-by-value", "call-by-reference", "call-by-name"등의 용어가 사용됩니다. 이 경우 매개 변수는 배열의 내용이 아니라 전체 배열입니다. 그리고 그 수준에서, 의미론은 분명히 참조에 의한 호출이 아닙니다. 메서드의 매개 변수 이름에 대한 새 배열 참조를 지정해도 호출자의 배열 변수는 업데이트되지 않습니다. 배열 내용에 대한 동작이 참조에 의한 호출 과 구별되지 않는다는 사실은이를 확인하지 못합니다 참조별로 전화.

질문의 고기에 이제

...

는 때 그것은 무효가 반대로 배열로 배열 인수를 반환 할 수있는 좋은 시간이 적입니까?

당신이 무엇을 의미하는지 완전히 명확하지 않다,하지만 난 당신이이 두 가지 대안에 대해 이야기한다고 가정 :

public void method(String arg, String[] result) ... 

public String[] method(String arg) ... 

대 내가 말하고 싶지만 그 두 번째 양식 이해하기 쉽고 사용하기 쉽기 때문에 일반적으로 바람직합니다. 또한 두 번째 형식을 사용하면 메서드가 결과 배열의 크기를 선택할 수 있습니다. (배열이 너무 작거나 큰 경우에는 상기 제 양식으로하는 재 할당 된 어레이에 대한 참조를 반환 할 방법이 없다.)

제 폼을 사용해야 만 케이스

은 :

  • 메서드에 대한 기능 요구 사항이 기존 배열을 업데이트하는 데 달려있는 경우
  • 할당 된 개체의 수를 최소화해야하는 경우가 있습니다. 예 : GC 일시 중지를 최소화합니다.

배열이 다른 데이터 구조에서 이미 참조되어 있고 해당 참조를 찾고/업데이트하는 것이 어려울 수있는 첫 번째 경우가 발생할 수 있습니다. 배열이 크고 복사본을 만드는 데 드는 비용이이 메서드로 수행되는 실제 작업의 비용을 압도 할 경우에도 발생할 수 있습니다.

+0

프로그래밍 전문 용어를 사용하여 의사 소통을하는 데 매우 익숙하지 않은 것은 아마도 내 잘못입니다. 여기 내가 실제로 읽은 것이 있습니다. "이 모든 예제는 Java에서 배열을 전달하는 메커니즘이 배열의 내용과 관련하여 참조 메커니즘에 의한 호출이라는 기본 사실을 강조합니다"(Sedgewick). – user1164937

+0

오, 지금 무슨 뜻인지 알 겠어. 나는 "정적 메서드에 대한이 절을 읽고 배열별로 전달을 참조로 말했습니다." – user1164937

-2

궁극적으로 ... 값으로 배열을 전달하는 속도가 느립니다. 그것은 한 블록의 메모리를 가져 와서 어레이를 복사해야합니다. 배열의 크기가 단지 몇 바이트 일 경우 큰 문제는 아닙니다. 하지만 메모리가 크다면 느린 입출력 작업이 될 것입니다. 특히 이것이 단단한 루프에서 발생하면 성능에 해를 끼칠 수 있습니다.

참조로 전달하면 미리 버퍼를 만들고 다시 사용할 수 있습니다.

+0

Jaba 가치로 전달하지 마십시오. – SLaks

+2

@SLaks는 Java가 아닙니다. Jaba –

+0

@SLaks : FALSE입니다. 함수의 출력이 배열 인 경우 어떻게 참조로 배열을 전달합니까? 원래 배열 포인터를 전달하지 않습니다. 함수에 배열을 만들어야하고 그런 다음 그것을 전달합니다. 또한, '값 유형'을 전달하면 값을 전달합니다. I.E. 'int'와'float'입니다. – Andrew

0

자바의 메소드에 전달 된 모든 매개 변수는 원시 타입을 참조하므로 메소드 내부 또는 외부의 어느 곳에서나 객체 저장 공간을 메모리에 유지할 때 Static 메소드는 여기의 특별한 경우로 취급되지 않습니다. 이 배열이나 void 형을 돌려주는 경우에는 아무런 차이가 없습니다.

이 배열을 반환하면 반환 된 값은 방금 방금이 메서드에 전달 된 값입니다.

관련 문제