ava for-each에 대해서 쉽게 이해하기 



 



 for-each


: jdk 1.5 이후에 추가 된 문법이다. 따로 키워드가 있는 것은 아니다. 기존의 for문을 그대로 사용한다. 



코드의 가독성이 좋아지고, 반복자나 변수를 사용하지 않아 오류 가능성을 없앤다. 



/**
*
* @author hoTire
*
*/

for (int i = 0; i < 10; i++) {
System.out.println(list.get(i));
}
    
for (Integer integer : list) {
System.out.println(integer);
}


아래가 for-each 방법이다. 


for-each를 구현하기 위해선 


public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();
}


Iterable 인터페이스를 implements 구현하면 된다. 







성능 차이




@Benchmark
    public void testFor() {
        int[] classicFor = new int[200000000];
        int size = classicFor.length;
        int a;
        for (int i = 0; i< size; i++) {
            a = classicFor[i];
        }
    }
    
    @Benchmark
    public void testFor2() {
        int[] classicFor = new int[200000000];
        int a;
        for (int i = 0; i< classicFor.length; i++) {
            a = classicFor[i];
        }
    }
    
    @Benchmark
    public void testForEach() {
        int[] forEach = new int[200000000];
        int a;
        for (int n : forEach) {
            a = n;
        }
    }

Benchmark Mode Cnt Score Error Units
MyBenchmark.testFor avgt 5 390.766 ± 42.219 ms/op
MyBenchmark.testFor2 avgt 5 418.466 ± 219.746 ms/op
MyBenchmark.testForEach avgt 5 386.739 ± 47.636 ms/op

 


for문 안에 size나 length를 알아내는 코드가 있다면 느리다. 

계속해서 lenght, size를 알아내는 비용이 발생한다. 


크기가 크면 클수록 for-each가 빠르다. 

JIT컴파일러가 최적화를 하기 때문이다. 







이렇게 좋은 for-each를 사용하지 못할 때가 있다.


1. 필터링(filtering) : 순회하는 도중 특정한 원소를 삭제해야할 경우 


2. 변환(transforming) : 순회하는 도중 원소의 값을 수정해야할 경우


3. 병렬순회(parallel iteration) : 병렬적으로 순회할 경우 



'프로그래밍 > JAVA' 카테고리의 다른 글

JAVA 관련 사이트 기술 커리큘럼  (0) 2018.07.25
스트레티지 패턴  (0) 2018.07.23
JAVA 싱글턴 패턴  (0) 2018.07.19
자바 interface(인터페이스)  (0) 2018.07.18
JAVA 상속(Override) 재정의, super  (0) 2018.07.17

+ Recent posts