[Java] for문 vs forEach문 성능

    java for문 vs forEach문 성능 알아보기

    1. for문

    for문은 배열과 컬렉션의 모든 요소에 대해 인덱스를 이용하여 접근하는 방법입니다. for문은 요소를 읽기 전용으로 접근할 때 가장 효율적입니다.

    int[] arr = {1, 2, 3, 4, 5};
    
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }

    2. forEach문

    forEach문은 Java 5부터 지원하는 향상된 for문입니다. forEach문은 배열과 컬렉션의 모든 요소에 대해 순서대로 접근하는 방법입니다. forEach문은 요소를 수정하지 않고 읽기만 할 때 가장 효율적입니다.

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    
    for (int i : list) {
        System.out.println(i);
    }

    3. Java for vs forEach 차이

    for문과 forEach문은 각각의 특징과 장단점이 있습니다.

    for문은 인덱스를 이용하여 요소에 접근하기 때문에, 요소에 대한 인덱스 접근이 필요한 경우에는 for문이 더 유용합니다.

    반면 forEach문은 인덱스가 필요하지 않으며, 간결한 코드가 필요한 경우에는 forEach문이 더 유용합니다. 또한, 요소의 타입에 따라서도 for문과 forEach문의 성능 차이가 발생할 수 있습니다.

    배열과 ArrayList와 같은 내부 배열을 사용하는 컬렉션 요소의 경우에는 for문이 더 빠르고, LinkedList와 같이 요소 간의 연결(참조)을 사용하는 컬렉션 요소의 경우에는 forEach문이 더 빠를 수 있습니다.

    따라서, 요소에 대한 인덱스 접근이 필요한 경우에는 for문을 사용하는 것이 가장 빠르며, 요소에 대한 인덱스 접근이 필요하지 않은 경우에는 forEach문을 사용하는 것이 가독성과 간결성면에서 유리합니다.

    4. Java for vs forEach 성능

    1. LinkedList

    LinkedList<Integer> linkedList = new LinkedList<>();
    
    // 요소 추가
    for (int i = 0; i < 1000000; i++) {
        linkedList.add(i);
    }
    
    // for문
    long start = System.currentTimeMillis();
    
    for (int i = 0; i < linkedList.size(); i++) {
        int element = linkedList.get(i);
    }
    
    long end = System.currentTimeMillis();
    System.out.println("LinkedList with for: " + (end - start) + "ms");
    
    // forEach문
    start = System.currentTimeMillis();
    
    for (int element : linkedList) {
    }
    
    end = System.currentTimeMillis();
    System.out.println("LinkedList with forEach: " + (end - start) + "ms");

    LinkedList에 1000000개의 요소를 추가했을 경우 걸린시간은 for문 40초, forEach문 29초입니다.

    2. ArrayList

    ArrayList<Integer> arrayList = new ArrayList<>();
    
    // 요소 추가
    for (int i = 0; i < 1000000; i++) {
        arrayList.add(i);
    }
    
    // for문
    long start = System.currentTimeMillis();
    
    for (int i = 0; i < arrayList.size(); i++) {
        int element = arrayList.get(i);
    }
    
    long end = System.currentTimeMillis();
    System.out.println("ArrayList with for: " + (end - start) + "ms");
    
    // forEach문
    start = System.currentTimeMillis();
    
    for (int element : arrayList) {
    }
    
    end = System.currentTimeMillis();
    System.out.println("ArrayList with forEach: " + (end - start) + "ms");

    ArrayList에 1000000개의 요소를 추가했을 경우 걸린시간은 for문 9초, forEach문 15초입니다.

    3. Array

    int[] arr = new int[1000000];
    
    // 요소 추가
    for (int i = 0; i < arr.length; i++) {
        arr[i] = i;
    }
    
    // for문
    long start = System.currentTimeMillis();
    
    for (int i = 0; i < arr.length; i++) {
        int element = arr[i];
    }
    
    long end = System.currentTimeMillis();
    System.out.println("Array with for: " + (end - start) + "ms");
    
    // forEach문
    start = System.currentTimeMillis();
    
    for (int element : arr) {
    }
    
    end = System.currentTimeMillis();
    System.out.println("Array with forEach: " + (end - start) + "ms");

    Array에 1000000개의 요소를 추가했을 경우 걸린시간은 for문 3초, forEach문 10초입니다.

    따라서 Array와 ArrayList일 경우 for문이 더 빠르고 LinkedList일 경우 요소 간의 참조를 사용하기 때문에  forEach문이 더 빠르다.

    댓글

    Designed by JB FACTORY