자바/자바

[자바] 반복문을 더 쉽게, for each 사용하기

도트7 2021. 12. 27. 00:15

 자바에서 사용할 수 있는 반복문으로 for와 while이 있다. Java 5 부터는 for문을 좀 더 쉽게 사용할 수 있도록 for each문이라는 것을 제공한다. 새로운 예약어를 사용하지 않고 기존 for문을 조금 변형하여 사용한다. 

 

 기존 for문과 for each문을 비교해보자.

 

 for

public static void main(String args[]) {
	String[] fruit = {"apple", "banana", "melon", "kiwi", "orange"};
		
	for(int i = 0; i < fruit.length; i++)
		System.out.println(fruit[i]);
}

 

 

for each

public static void main(String args[]) {
	String[] fruit = {"apple", "banana", "melon", "kiwi", "orange"};
		
	for(String s : fruit)
		System.out.println(s);
}

 

 String 타입의 배열에 있는 값을 모두 출력시키는 코드다. 한 눈에 보기에도 간결해진 것을 알 수 있다. 기존의 for문을 보면 초기식, 반복조건, 증감식의 형태를 가지는데 for each 문을 보면 반복되는 동안 가져올 값을 저장할 변수와 값을 꺼내 올 대상을 지정하는 것만으로 반복을 수행할 수 있다. 위 예제는 배열을 대상으로 하였는데 자바에서 제공하는 컬렉션을 대상으로도 for each를 사용할 수 있다.

 

 


 

 

 for each와 Collection

 컬렉션이 for each를 수행할 수 있는 이유는 Iterable interface를 구현하고 있기 때문이다. 반복 수행 방법은 배열과 다르지 않지만 컬렉션의 경우 List, Set, Queue, Map 중 Map은 단일 객체가 아닌 Key, Value 쌍으로 데이터를 저장하고 있기 때문에 사용 방법이 조금 다르다.

 

 

 ArrayList, HashSet

public static void main(String args[]) {
	List<String> list = new ArrayList<>();
	Set<Integer> set = new HashSet<>();
    
	// add elements..(skip)
        
	for(String s : list) // ArrayList
		System.out.println(s);
        
	for(int n : set)
		System.out.println(n);
}

 

 HashMap

public static void main(String args[]) {
	Map<String, Integer> map = new HashMap<>();
    
	// add elements..(skip)
        
	// entrySet() 메서드를 사용하는 경우
	for(Map.Entry<String, Integer> e : map.entrySet())
		System.out.println("K : " + e.getKey() + ", V : " + e.getValue());
        
	// keySet() 메서드를 사용하는 경우
 	for(String key : map.keySet()) {
		int value = map.get(key);
		System.out.println("K : " + key + ", V : " + value);
	}
}

 

 Map의 경우 일반적인 for each와 달리 위와 같이 사용한다. Key와 Value가 모두 필요한 경우 entrySet() 메서드를, Key만 필요한 경우 keySet을 사용한다.

 

 


 

 

 for와 for each 적절하게 쓰기

 기존 for문은 익숙하지 않으면 반복 조건의 비교문이나 반복조건의 증감식을 작성할 때 잘못된 식을 적어 오류를 일으키는 경우가 종종 있는데 for each문은 그러한 오류를 미연에 방지할 수 있다는 장점이 있다. 하지만 더 쉽게 쓸 수 있는 for each가 등장했다고 해서 기존 for문을 사용하지 않는 것은 아니다. for each는 현재 접근 중인 위치를 모르기 때문에 순회 중 발견한 데이터를 수정/삭제하기가 까다롭기 때문에 데이터를 찾아서 수정/삭제하는 목적이라면 기존 for문을 사용하는 것이 더 나을 수 있다.