J2SE1.4까지 Java 프로그램에서 가변적 인 실제 매개 변수가있는 메소드를 정의하는 것은 불가능했습니다. Java는 실제 매개 변수의 수와 유형과 공식 매개 변수를 하나씩 일치시켜야하며 방법을 정의 할 때 공식 매개 변수의 수가 수정되어야하기 때문입니다. 오버로드 메커니즘을 통해 동일한 수의 공식 매개 변수를 제공 할 수 있지만, 실제 매개 변수 수량이 임의로 변경할 수있는 목적을 달성 할 수는 없습니다.
그러나 일부 방법의 의미론은 실제 매개 변수의 가변 수를 수락 할 수 있어야합니다. 예를 들어, 유명한 기본 메소드는 모든 명령 줄 매개 변수를 실제 매개 변수로 받아 들일 수 있어야하며 명령 줄 매개 변수 수를 미리 결정할 수는 없습니다.
이 문제의 경우 전통적으로 "배열을 사용하여 실제 매개 변수를 랩핑하기"의 관행은 일반적으로이를 다루는 데 사용됩니다.
1. 매개 변수를 배열로 래핑하십시오
"배열이있는 실제 매개 변수 랩"실습은 세 단계로 나눌 수 있습니다. 첫째,이 방법의 배열 유형 매개 변수를 정의하십시오. 그런 다음 호출되면 통과 할 모든 실제 매개 변수를 포함하는 배열을 생성합니다. 마지막 으로이 배열을 실제 매개 변수로 전달하십시오.
이 접근법은 "메소드가 변수 매개 변수를 수락하는 방법"의 목적을 효과적으로 달성 할 수 있지만, 호출시 형식은 충분히 간단하지 않습니다.
VARARGS 메커니즘은 J2SE1.5로 제공되므로 여러 실제 매개 변수와 일치 할 수있는 공식 매개 변수의 직접적인 정의가 가능합니다. 따라서 변수의 실제 매개 변수를 더 간단하게 전달할 수 있습니다.
바라그의 의미
일반적으로 "varargs"는 "variablenumberofarguments"를 의미합니다. 때로는 단순히 "variablearguments"라고 불리지만이 용어는 변수를 나타내지 않기 때문에 의미는 약간 모호합니다.
2. 가변 실제 매개 변수로 메소드를 정의하십시오
연속 세 가지 만 추가하십시오. (즉, "...", 영어로 문장의 타원) 공식 매개 변수의 "type"과 "매개 변수 이름"사이에서 불확실한 실제 매개 변수와 일치 할 수 있습니다. 이러한 공식 매개 변수를 갖는 방법은 변수 실제 매개 변수가있는 메소드입니다.
목록 1 : 변수 실제 매개 변수가있는 메소드
개인 정적 int sumup (int ... value) {}마지막 공식 매개 변수 만 "불확실한 실제 매개 변수와 일치 할 수있는"것으로 정의 될 수 있습니다. 따라서 방법에는 그러한 공식적인 매개 변수가 하나만있을 수 있습니다. 또한이 방법에 다른 공식 매개 변수가있는 경우 전면 위치에 두십시오.
컴파일러는 마지막 공식 매개 변수를 비밀리에 배열 공식 매개 변수로 변환하고 컴파일 된 클래스 파일에서 마크를 만들어 변수 실제 매개 변수가있는 메소드임을 나타냅니다.
Listing 2 : 가변적 인 실제 매개 변수가있는 메소드의 비밀 형태
개인 정적 int sumup (int [] value) {}이러한 변환으로 인해 변환 된 메소드 서명과 일치하는이 클래스의 방법을 정의하는 것은 불가능합니다.
목록 3 : 컴파일 오류를 일으키는 조합
개인 정적 int sumup (int ... value) {} private static int sumup (int [] value) {}3. 실제 매개 변수의 가변 수있는 메소드를 호출하십시오.
통과 할 실제 매개 변수가 하나씩 해당 위치에 하나씩 작성되는 한, 변수 수의 실제 매개 변수를 가진 방법을 호출 할 수 있습니다. 다른 단계는 필요하지 않습니다.
목록 4 : 여러 매개 변수를 전달할 수 있습니다
sumUp(1,3,5,7);
간접적으로, 컴파일러는이 호출 프로세스를 "실제 매개 변수로 랩핑 한 배열"형식으로 변환합니다.
Listing 5 : 비밀리에 배열 생성이 나타납니다
sumUp(newint[]{1,2,3,4});
또한 여기에 언급 된 "불확실한 것"에는 0도 포함되므로 그러한 전화는 합리적입니다.
목록 6 : 실제 매개 변수를 제로 전달할 수도 있습니다
sumUp();
컴파일러에 의해 비밀리에 변환 된이 호출 방법의 효과는 다음과 같습니다.
목록 7 : 제로 실제 인수는 빈 배열에 해당합니다
sumUp(newint[]{});
과거는 현재 널가 아니라 전달됩니다. 이를 통해 어떤 상황에 속한 지 감지하지 않고도 통합 양식을 처리 할 수 있습니다.
4. 실제 매개 변수를 가변 숫자로 처리하십시오
가변적 인 수정 된 실제 매개 변수를 처리하는 방법은 기본적으로 배열을 처리하는 방법과 동일합니다. 모든 실제 매개 변수는 공식 매개 변수와 동일한 이름의 배열로 저장됩니다. 실제 요구에 따르면,이 배열의 요소를 읽고, 김정이 또는 요리를 한 후에는 원하는대로 할 수 있습니다.
목록 8 : 수신 된 인수 처리
개인 정적 int sumup (int ... value) {int sum = 0; for (int i = 0; i <value.length; i ++) {sum+= value [i]; } 반환 합계;}5. 변수 매개 변수 수를 전달하십시오
때로는 변수 번호 매개 변수 세트를 수락 한 후 다른 변수 번호 메소드로 전달되어야합니다. 인코딩 중에 수신 된 실제 매개 변수의 수는 알 수 없기 때문에 "나타나야하는 위치에 하나씩 작성하는"관행은 실현 가능하지 않습니다. 그러나 이것은 변수의 실제 매개 변수가있는 메소드를 호출하는 다른 방법이 있기 때문에 이것이 바로 어리석은 작업이라는 것을 의미하지는 않습니다.
J2SE1.5 컴파일러의 눈에 가변적 인 실제 매개 변수를 갖는 방법은 끝에 공식 매개 변수 배열이있는 방법의 특수한 경우입니다. 따라서 전체 실제 매개 변수 세트를 배열로 전달하도록 한 다음이 배열을 마지막 실제 매개 변수로 전달하여 실제 매개 변수의 변수가있는 메소드로 전달하여 오류가 발생하지 않습니다. 이 기능을 사용하면 전달을 원활하게 완료 할 수 있습니다.
목록 9 : 수신 된 실제 매개 변수를 전달합니다
public class printfsample {public static void main (String [] args) {printout ( "pi :%f e :%f/n", math.pi, math.e); } private static void printout (문자열 형식, 객체 ... args) {system.out.printf (형식, args); }}6. 배열입니까? 배열이 아니야?
비록 무대 뒤에서, 컴파일러는 불확실한 실제 매개 변수를 어레이 공식 매개 변수로 일치시킬 수있는 공식 매개 변수를 변환합니다. 또한 배열을 사용하여 실제 매개 변수를 래핑 한 다음 실제 매개 변수의 변수가있는 메소드로 전달할 수 있습니다. 그러나 이것이 "불확실한 실제 매개 변수와 일치 할 수있는 공식 매개 변수"와 "배열 공식 매개 변수"사이에 차이가 없다는 것을 의미하지는 않습니다.
명백한 차이점은 마지막 공식 매개 변수가 변수 수의 실제 매개 변수가있는 메소드 형태의 배열 공식 매개 변수 인 메소드를 호출하는 경우 "Contrybepiedto to"컴파일 오류로 이어질 것입니다.
Listing 10 : "ContryBeapiedTo"에 대한 컴파일 오류
개인 정적 무효 테스트 오버 로딩 (int [] i) {System.out.println ( "a");} public static void main (string [] args) {testoverloading (1, 2, 3); // 컴파일 오류}이러한 이유로,이 간결한 통화 방법은 배열로 실제 매개 변수를 랩핑하는 방법 만 호출 할 때 직접 채택 할 수 없습니다 (예 : J2SE1.5 용 타사 라이브러리 설계에서 남은 것).
원래 클래스를 수정하고 호출 할 메소드에 매개 변수 수의 변수 버전을 추가 하고이 간결한 호출 방법을 채택하려면 "accesseignMethod"및 "socumentErelocalExtension"의 재구성 메소드를 사용하여 목적을 근사화 할 수 있습니다.
7. 가변 수의 인수가 일반에 직면 할 때
새로운 "제네릭"메커니즘이 J2SE1.5에 추가되어 특정 조건에서 유형을 매개 변수화 할 수 있습니다. 예를 들어, 클래스를 작성할 때 메소드의 공식 매개 변수 유형은 식별자 (예 : t)로 표시 될 수 있습니다. 이 식별자가 나타내는 유형에 대해서는이 클래스의 인스턴스를 생성 할 때 지정됩니다. 이 메커니즘은보다 완전한 코드 재사용 및 엄격한 컴파일 타임 유형 확인을 제공하는 데 사용될 수 있습니다.
그러나 일반적인 메커니즘은 가변 수의 공식 매개 변수와 함께 사용할 수 없습니다. 불확실한 인수와 일치하는 공식 매개 변수 유형이 식별자로 표시되면 컴파일러는 "GenericArrayCreation"오류를 제공합니다.
목록 11 : Varargs가 제네릭을 충족 할 때
Private Static void testvarargs (t ... args) {// 컴파일 오류}이 현상의 이유는 J2SE1.5의 일반 메커니즘의 고유 한 제약입니다.이 유형의 인스턴스는 식별자로 표시된 유형으로 생성 할 수 없습니다. 이 제약 조건이없는 Java 버전이 나타나기 전에 기본적 으로이 문제에 대한 좋은 해결책은 없었습니다.
그러나 기존의 "배열 랩"연습은 이러한 제약 조건에 영향을받지 않습니다.
목록 12 : 컴파일 가능한 해결 방법
개인 정적 void testvarargs (t [] args) {for (int i = 0; i <args.length; i ++) {system.out.println (args [i]); }}8. 과부하의 선택 문제
Java는 "과부하"메커니즘을 지원하므로 동일한 클래스의 여러 다른 방법에 공식 매개 변수 목록 만 가질 수 있습니다. 그런 다음 컴파일러는 호출시 실제 매개 변수를 기반으로 실행할 메소드를 선택합니다.
전통적인 선택은 기본적으로 "특별한 사람들이 선호된다"는 원칙을 기반으로합니다. 방법의 전문 분야는 원활하게 실행되기 위해 충족해야 할 조건의 수에 따라 다릅니다. 필요한 조건이 많을수록 더 특별합니다.
Varargs 메커니즘이 도입 된 후에도,이 원칙은 여전히 적용되지만 고려해야 할 문제는 풍부합니다. 전통적으로, 다양한 버전의 과부하 방법 중에서, 형태 학적 매개 변수와 실제 매개 변수가 정확히 동일한 버전 만 추가 고려할 수 있습니다. 그러나 Varargs 메커니즘이 도입 된 후, 두 버전 모두 일치 할 수 있으며 다른 측면에는 차이가 없으며 하나의 실제 매개 변수에는 고정 숫자가 있고 다른 실제 매개 변수에는 변수 숫자가 있습니다.
이 경우, 사용 된 결정 규칙은 "실제 매개 변수가 고정 된 버전이 실제 매개 변수 수로 버전보다 우선합니다"라는 것입니다.
목록 13 : 고정 수의 실제 매개 변수가있는 버전이 선호됩니다.
컴파일러의 관점에서 여러 메소드가 동일한 우선 순위를 갖는 경우, 호출 할 방법에 대해 선택할 수없는 상태에 갇히게됩니다. 이 경우 "method name isambiguous라는 referenceTo"의 컴파일 오류가 생성되고 혼란스러운 새로운 소스 코드의 도착을 피하기 위해 일부 수정을 참을성있게 기다립니다.
Varargs 메커니즘이 도입 된 후,이 상황은 혼란을 초래할 수 있습니다. 예를 들어, 일치 할 수있는 두 가지 버전이있을 수 있으며, 이는 다른 측면에서 정확히 동일하며 변수의 실제 매개 변수와 충돌합니다.
public class overloadingsamplea {public static void main (string [] args) {testoverloading (1); // atestoverloading (1, 2); // btestoverloading (1, 2, 3); // 인쇄 c} private static void testoverloading (int i) {systation.out.println ( "); j) {system.out.println ( "b");} 개인 정적 무효 테스트 오버 로딩 (int i, int ... more) {system.out.println ( "c");}}컴파일러의 관점에서 여러 메소드가 동일한 우선 순위를 갖는 경우, 호출 할 방법에 대해 선택할 수없는 상태에 갇히게됩니다. 이 경우 "method name isambiguous라는 referenceTo"의 컴파일 오류가 생성되고 혼란스러운 새로운 소스 코드의 도착을 피하기 위해 일부 수정을 참을성있게 기다립니다.
Varargs 메커니즘이 도입 된 후,이 상황은 혼란을 초래할 수 있습니다. 예를 들어, 일치 할 수있는 두 가지 버전이있을 수 있으며, 이는 다른 측면에서 정확히 동일하며 변수의 실제 매개 변수와 충돌합니다.
Listing 14 : 어쨌든 컴파일러가
public class overloadingsampleb {public static void main (string [] args) {testoverloading (1, 2, 3); // 컴파일 오류} private static void testoverloading (object ... args) {}}또한 J2SE1.5에는 "자가 옥싱/자동 노트 박스"메커니즘이 있기 때문에 두 버전이 일치 할 수 있고 실제 매개 변수의 수는 가변적 일 수 있으며 다른 측면은 정확히 동일합니다. 허용 가능한 실제 매개 변수는 기본 유형이며, 다른 수용 가능한 실제 매개 변수는 패키지 클래스 간의 충돌입니다.
리스팅 15 : 자서전/자동 전달 박스의 새로운 문제
public class overloadingsamplec {public static void main (string [] args) {/* 컴파일 오류*/testoverloading (1, 2);/* 또는 컴파일 오류*/testoverloading (new Integer (1), 새로운 정수 (2);} private static void testoverloading (int ... args) {} {args) {integer)9. 요약
"배열로 랩핑 된"메소드와 비교할 때, 가변적 인 실제 매개 변수가있는 실제 메소드는 더 간단하고 호출 할 때 명확한 의미가 있습니다. 그러나이 메커니즘에는 자체 한계가 있으며 완벽한 솔루션이 아닙니다.
위의 내용은 Java의 가변 길이 매개 변수 코드에 대한 자세한 설명입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구들은이 사이트를 계속 참조 할 수 있습니다.
Java의 암시 적 매개 변수 및 디스플레이 매개 변수 인스턴스에 대한 자세한 설명
빠른 정렬 및 최적화 코드의 Java 프로그래밍 구현 세부 설명
Java 암호화 암호 해독 및 디지털 시그니처 완전한 코드 예제
단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!