Java for 루프 쓰기 정리

6812 단어 Javafor순환
Java for 루프 쓰기 정리
개요:
J2SE 1.5는 또 다른 형식의 for 순환을 제공합니다.이런 형식의 for순환을 빌려 수조와 컬렉션 등 유형의 대상을 더욱 간단하게 훑어볼 수 있다.본고는 이러한 순환을 사용하는 구체적인 방식을 소개하고 이렇게 범람할 수 있는 유형을 어떻게 스스로 정의하는지를 설명하며 이 메커니즘의 흔한 문제점을 설명한다.
자바 프로그램에서 DD를 하나하나 처리하거나 DD의 어떤 수조나 컬렉션의 요소를 반복할 때 일반적으로 for순환을 사용하여 실현한다(물론 다른 종류의 순환을 사용해도 안 되는 것은 아니다. 다만 for라는 단어의 길이가 비교적 짧기 때문인지, 아니면 for라는 단어의 의미가 이런 조작과 비교적 잘 어울리기 때문인지, 이럴 때 for순환이 다른 순환보다 많이 사용되기 때문인지 모르겠다).
반복 수조에 대해 이 순환은 일반적으로 이런 쓰기를 채택한다.
명세서 1: 수조를 훑어보는 전통적인 방식

/*   */ 
int[] integers = {1, 2, 3, 4}; 
/*   */ 
for (int j = 0; j<integers.length; j++){ 
int i = integers[j]; 
System.out.println(i); 
} 
Collection 객체를 훑어보는 데 이 순환은 일반적으로 다음과 같은 형식을 사용합니다.
리스트 2: Collection 객체의 기존 방식 반복

/*  Collection */ 
String[] strings = {"A", "B", "C", "D"}; 
Collection stringList = java.util.Arrays.asList(strings); 
/*   */ 
for (Iterator itr = stringList.iterator(); itr.hasNext();) { 
Object str = itr.next(); 
System.out.println(str); 
} 
자바 언어의 최신 버전인 DDJ2SE 1.5에는 또 다른 형식의 for 순환이 도입되었다.이런 형식의 for순환을 빌려 지금은 더욱 간단한 방식으로 두루 돌아다니는 작업을 할 수 있다.
1. 두 번째 for 순환
엄밀히 말하면 Java의 두 번째 for 순환은 기본적으로 다음과 같은 형식입니다.
for (순환 변수 유형 순환 변수 이름: 훑어볼 대상) 순환체
이런 문법을 빌려 한 개의 수조를 훑어보는 조작은 다음과 같은 작법을 채택할 수 있다.
명세서 3: 그룹을 훑어보는 간단한 방법

/*   */ 
int[] integers = {1, 2, 3, 4}; 
/*   */ 
for (int i : integers) { 
System.out.println(i);/*  “1”、“2”、“3”、“4” */ 
} 
여기에 사용되는 for 순환은 컴파일하는 동안 다음과 같은 형식으로 간주됩니다.
명세서 4: 수조를 훑어보는 간단한 방식의 등가 코드

/*   */ 
int[] integers = {1, 2, 3, 4}; 
/*   */ 
for (int   = 0;  <integers.length;  ++) { 
System.out.println(integers[ ]);/*  “1”、“2”、“3”、“4” */ 
} 
이곳의'변수 이름 갑'은 컴파일러가 자동으로 생성하여 혼란을 일으키지 않는 이름이다.
Collection 작업을 반복하면 다음과 같이 쓸 수 있습니다.
목록 5: 컬렉션을 훑어보는 간단한 방법

/*  Collection */ 
String[] strings = {"A", "B", "C", "D"}; 
Collection list = java.util.Arrays.asList(strings); 
/*   */ 
for (Object str : list) { 
System.out.println(str);/*  “A”、“B”、“C”、“D” */ 
} 
여기서 사용하는 for 순환은 컴파일하는 동안 다음과 같은 형식으로 간주됩니다.
명세서 6: Collection을 훑어보는 간단한 방식의 등가 코드

/*  Collection */ 
String[] strings = {"A", "B", "C", "D"}; 
Collection stringList = java.util.Arrays.asList(strings); 
/*   */ 
for (Iterator   = list.iterator();  .hasNext();) { 
Object str =  .next(); 
System.out.println(str);/*  “A”、“B”、“C”、“D” */ 
} 
여기의'변수명 을'도 컴파일러가 자동으로 생성하여 혼란을 일으키지 않는 이름이다.
컴파일하는 동안 J2SE1.5의 컴파일러는 이런 형식의 for순환을 대응하는 전통적인 형식으로 간주하기 때문에 성능 문제를 걱정할 필요가 없다.
'foreach'와'in'을 안 쓰는 이유.
Java는 일반적으로 "for-each 순환"이라고 불리는 순환을 유도하기 위해 "for"(의미가 더 명확한 "in"이 아니라) 를 사용하여 순환 변수의 이름과 반복될 대상을 분할합니다.이렇게 하는 주요 원인은 새로운 키워드를 도입하여 호환성에 문제가 생기는 것을 피하기 위해서이다. DD는 자바 언어에서 키워드를 변수명으로 사용하는 것을 허락하지 않는다. 비록'foreach'라는 이름을 사용하는 경우가 많지 않지만,그러나'in'은 입력 흐름을 나타내는 데 자주 사용되는 이름(예를 들어java.lang.System 클래스에'in'이라는 이름의static 속성이 있어'표준 입력 흐름'을 나타낸다).
확실히 교묘한 디자인 문법을 통해 키워드가 특정한 상하문에서만 특수한 의미를 가지도록 함으로써 그것들도 일반적인 표지부호로 사용할 수 있게 할 수 있다.그러나 이런 문법을 복잡하게 만드는 전략은 광범위하게 채택되지 않았다.
"for-each 순환"의 유구한 역사
'for-each 순환'은 최근에 나타난 제어 구조가 아니다.1979년에 정식으로 발표된 Bourne shell(첫 번째 성숙한 유닉스 명령 해석기)에는 이미 이런 제어 구조(순환은'for'와'in'으로 인도하고 순환체는'do'와'done'으로 표시)가 포함되어 있다.
2. 순환체에서 순환 변수를 수정하는 것을 방지한다
기본적으로 컴파일러는 두 번째 for 순환 순환체에서 순환 변수에 값을 다시 부여할 수 있습니다.그러나 이런 방법은 순환체 밖의 상황에 전혀 영향을 주지 않고 코드를 이해하는 데 어려움을 초래하기 쉽기 때문에 일반적으로 사용을 추천하지 않는다.
Java는 컴파일하는 동안 이러한 조작을 봉쇄할 수 있는 메커니즘을 제공했다.구체적인 방법은 순환 변수 유형 앞에'final'수식자를 붙이는 것이다.이렇게 되면 순환체에서 순환 변수에 값을 부여하면 컴파일 오류가 발생할 수 있다.이 메커니즘을 빌려 의도적이거나 무의식적으로'순환체에서 순환 변수를 수정'하는 조작을 효과적으로 막을 수 있다.
명세서 7: 재할당 금지

int[] integers = {1, 2, 3, 4}; 
for (final int i : integers) { 
i = i / 2; /*   */ 
} 
이것은 순환 변수에 대한 재부여를 금지할 뿐입니다.순환 변수의 속성에 값을 부여하거나 순환 변수의 내용을 변화시킬 수 있는 방법을 호출하는 것은 금지되지 않는다.
목록 8: 상태 수정 허용

Random[] randoms = new Random[]{new Random(1), new Random(2), new Random(3)}; 
for (final Random r : randoms) { 
r.setSeed(4);/*  Random  */ 
System.out.println(r.nextLong());/*  ,  */ 
} 
3. 유형 상용 문제
순환 변수가 매번 순환이 시작될 때마다 안전하게 부여될 수 있도록 J2SE 1.5는 순환 변수의 유형에 대해 일정한 제한을 가진다.이러한 제한 하에서 순환 변수의 유형은 다음과 같은 선택을 할 수 있습니다.
순환 변수의 유형은 훑어볼 대상의 요소의 유형과 같을 수 있습니다.예를 들어 int형의 순환 변수로 int[]형의 수조를 훑어보고 Object형의 순환 변수로 컬렉션을 훑어보는 등이다.
명세서 9: 훑어볼 수조의 요소와 같은 유형의 순환 변수를 사용합니다

int[] integers = {1, 2, 3, 4}; 
for (int i : integers) { 
System.out.println(i);/*  “1”、“2”、“3”、“4” */ 
} 
목록 10: 반복할 컬렉션의 요소와 같은 유형의 순환 변수 사용하기

Collection< String> strings = new ArrayList< String>(); 
strings.add("A"); 
strings.add("B"); 
strings.add("C"); 
strings.add("D"); 
for (String str : integers) { 
System.out.println(str);/*  “A”、“B”、“C”、“D” */ 
} 
순환 변수의 유형은 훑어볼 대상의 요소의 상위 유형일 수 있습니다.예를 들어 int형의 순환 변수로byte[]형의 수조를 훑어보고, Object형의 순환 변수로Collection(전체 요소는 String의 Collection) 등을 훑어본다.
명세서 11: 훑어볼 대상의 원소의 상위 유형의 순환 변수를 사용합니다

String[] strings = {"A", "B", "C", "D"}; 
Collection< String> list = java.util.Arrays.asList(strings); 
for (Object str : list) { 
System.out.println(str);/*  “A”、“B”、“C”、“D” */ 
} 
순환 변수의 유형은 훑어볼 대상의 요소의 유형과 자동으로 변환될 수 있는 관계가 있습니다.J2SE 1.5에는 "Autoboxing/Auto-Unboxing"메커니즘이 포함되어 있으며, 컴파일러가 필요할 때 기본 형식과 패키지 클래스(Wrapper Classes) 사이에서 자동으로 변환할 수 있도록 합니다.따라서 Integer형의 순환 변수로 int[]형의 수조를 훑어보거나,byte형의 순환 변수로 Collection를 훑어보는 것도 가능하다.
명세서 12: 훑어볼 대상의 요소와 자동으로 변환될 형식의 순환 변수를 사용합니다

int[] integers = {1, 2, 3, 4}; 
for (Integer i : integers) { 
System.out.println(i);/*  “1”、“2”、“3”、“4” */ 
} 
여기서 말하는'원소의 유형'은 범람할 대상의 결정에 의해 결정되는 DD입니다. 만약에 그것이 Object[]형의 수조라면 원소의 유형은 Object입니다. 안에 들어 있는 것이 모두 String 대상이라고 해도 마찬가지입니다.
요소 유형을 제한할 수 있는 Collection
J2SE 1.4까지는 Java 프로그램에서 Collection에 저장할 수 있는 대상의 유형을 한정할 수 없습니다. DD는 모두 가장 일반적인 Object 대상으로 간주됩니다.J2SE 1.5에서'범용 (Generics)'메커니즘을 도입한 후에야 이 문제는 해결되었다.이제 Collection를 사용하여 모든 요소 유형이 T의 Collection임을 나타낼 수 있습니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기