글 최하단 쪽에는 한 번쯤은 마주치는 에러(비밀)에 대해 포스팅 예정 소식이 있습니다.
일반 for 문 (for loop)와 향상된 for문 (enhanced for loop = for-each loop)의 특징
Java에서의 일반 for 문과 향상된 for 문은 컬렉션 또는 배열을 순회하는 데 사용되는 반복문입니다.
두 방식은 각각 특정 상황에 대해서 유용하며, 사용 목적에 따라 사용해야 합니다.
일반 for 문 사용법
import java.util.ArrayList;
public class Lab {
public static void main(String[] args) {
//기본 문법
// for (데이터_타입 변수명 : 배열_또는_컬렉션) {
// 반복 실행될 코드
// }
// Array 일 때,
String[] arr = new String[20];
for(int i = 0; i<arr.length; ++i){
System.out.println(arr[i]);
}
// List 일 때,
List<Integer> list = new ArrayList<>();
for(int i = 0; i < list.size(); ++i){
System.out.println(list.get(i));
}
}
}
향상된 for 문 사용법
향상된 for 문은 java5에서 추가되었습니다.
기존 for 문 보다 가독성이 좋고, 간결하게 순회할 수 있도록 해줍니다.
import java.util.ArrayList;
import java.util.List;
public class Lab {
public static void main(String[] args) {
// 향상된 for문은 java5에서 추가됨
// 기존 for문보다 가독성이좋고, 간결하게 순회할 수 있또록 해준다.
// 배열일 때,
String[] arr = new String[20];
// Enhanced for loop
for (String text : arr) {
System.out.println(text);
}
//List 일때
List<Integer> list = new ArrayList<>();
for (Integer text : list) {
System.out.println(text);
}
}
}
향상된 for 문의 단점
- loop의 시작과 끝을 일반 for 문과 다르게 지정할 수 없습니다.
- 순회 중 원소의 변경 및 삭제가 불가능합니다.
- 원하는 인덱스(index)를 직접 지정하여 사용할 수 없습니다.
- 만약 get(i), arr [i]처럼 인덱스를 필요로 한다면, 기존의 일반적인 for 문을 사용해야 합니다.
- 일반적인 for 문은 인덱스를 직접 제어할 수 있기 때문에 특정 인덱스의 요소에 접근하고 조작할 수 있습니다.
- 만약 get(i), arr [i]처럼 인덱스를 필요로 한다면, 기존의 일반적인 for 문을 사용해야 합니다.
향상된 for 문의 특징
향상된 for 문은 컴파일러 최적화를 통해 iterator를 기반으로 동작합니다.
개발자가 작성한 코드
for(String text : list){
System.out.println(text);
}
컴파일러 최적화를 거친 후의 코드
Iterator iter = list.iterator();
while(iter.hasNext()){
String text = (String) iter.next();
System.out.println(text);
}
일반 for문에서 요소들을 변경하기
위의 코드에서 for 문에서 요소들을 변경하는 부분에서는 오류가 발생합니다.
Java에서는 list.get(i)와 같은 방식으로 요소를 가져오는 것은 가능하지만,
대입연산자를 이용하여 요소를 변경하는 것은 허용되지 않습니다.
일반 for 문을 사용하여 요소 변경 하는 법
for (int i = 0; i < list.size(); i++) {
list.set(i, 2);
}
향상된 for 문 (for-each)을 사용하여 요소 변경 하는 법
for (Integer number : list) {
number = 2;
}
위의 두 방법은 리스트의 모든 요소를 2로 변경할 수 있습니다.
하지만 주의해야 할 점은 향상된 for문으로 요소를 변경하는 두 번째 방법은 리스트의 요소를 복사하여 number 변수에 저장하기 때문에 실제 리스트의 요소는 변경되지 않습니다.
향상된 for문으로는 요소를 변경할 수 없는 이유
향상된 for 문에서는 컬렉션의 요소를 순회하며 임시 변수에 복사(얕은 복사)하여 처리합니다.
따라서 원본 컬렉션의 요소 자체에 직접 접근하는 것이 아닙니다.
향상된 for 문에서 요소를 변경하더라도 실제 컬렉션의 요소는 변경되지 않습니다.
따라서 일반 for 문을 사용하여 요소를 변경하는 첫 번째 방법을 사용하는 것이 리스트의 요소를 변경하는데 적합합니다.
난 for 문은 싫어! Iterator를 쓸래
Iterator를 사용하면 향상된 for 문보다 더 간단하게 컬렉션의 요소를 변경할 수 있습니다.
Iterator는 컬렉션을 순회하는 데 사용되는 인터페이스로써 요소를 읽고, 추가하고, 삭제하는 작업이 가능합니다.
Iterator를 사용하여 컬렉션의 요소를 변경
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
list.add(1);
list.add(1);
list.add(1);
list.add(1);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer currentElement = iterator.next(); // 현재 요소 읽기
iterator.remove(); // 현재 요소 삭제
list.add(2); // 숫자 2로 변경
}
System.out.println(list); // 출력: [2, 2, 2, 2, 2, 2]
}
}
이렇게 Iterator를 사용하면 컬렉션의 요소를 삭제하거나 변경할 수 있으므로, 원하는 대로 컬렉션의 요소를 처리할 수 있습니다.
향상된 for문법이나 일반 for 문을 사용할 때와 다르게, Iterator를 사용하는 방식은 요소를 직접 변경할 수 있으며,
해당 컬렉션의 요소를 안전하게 삭제할 수 있기 때문에 요소 변경이 필요한 경우에 특히 유용합니다.
따라서, 향상된 for 문 대신 그리고 일반 for문보다는 Iterator를 사용하여 컬렉션의 요소를 변경하는 것이 바람직한 방법입니다.
내일은 향상된 for 문을 사용했을 때의 요소 삭제 시 나타나는 문제의 원인(ConcurrentModifyException)에 대해서 포스팅할 예정입니다. 다음 포스팅도 꼭 봐주시기 바랍니다.
'JAVA' 카테고리의 다른 글
[JAVA] java 개발자라면 한번 쯤은 겪을 ConcurrentModificationException (1) | 2023.07.30 |
---|---|
[JAVA] 스레드(Thread), 스레드의 동시성, 멀티 스레드(Multi-Thread) (5) | 2023.07.30 |
ObjectCopyHelper 만들기 (DTO,VO를 Entity로 ) (0) | 2023.07.28 |
[JAVA] 컬렉션(Collection)[2]- Map에 대하여 (1) | 2023.07.27 |
[JAVA] 컬렉션(Collection)[1]- List에 대하여 (0) | 2023.07.26 |