Java 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);
}
컬렉션 대상을 훑어보는 데 이 순환은 보통 이런 형식을 사용한다.목록 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 */
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순환 변수의 유형은 훑어볼 대상의 요소의 상위 유형일 수 있습니다.예를 들어 int형의 순환 변수로byte[]형의 수조를 훑어보고, Object형의 순환 변수로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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.