왜 확장 for 문은 일반 for 문보다 빠릅니까?

6969 단어 확장 for 문자바

소개



옛날 쓴 기사를 바라보고 있으면, 「Java에서 자주 사용하는 Collection 구현 클래스의 구조와 특성」의 기사가, 「collection 형의 클래스인 linkedList 에 관한 랜덤 액세스의 지연의 과제에의 대처」라고 하는 기사로 참고로 되어 있었습니다. 감사합니다!
이 기사에서는 LinkedList로 작성한 처리에 대해 for문과 확장 for문으로 실행 시간을 비교하고 있으며, 확장 for문이 압도적으로 빠르다는 결과가 나와 있습니다.
이번에는, 이 확장 for문에 대해서 왜 보통의 for문보다 고속인가, 라고 하는 곳을 해설해 가고 싶습니다.

확장 for 문이란 무엇입니까?



원래 확장 for 문이란 무엇입니까?
컬렉션(List나 Set등)의 요소를 반복해 꺼내, 무언가의 처리를 실시할 때 등에 사용하는 구문입니다.
예를 들어, List에 저장된 수치의 합을 취하기 위해, for문과 확장 for문에서는 각각 아래와 같이 기술합니다.

for 문
List<Integer> list = Arrays.asList(1,3,5,7);
for(int i = 0;i < list.size(); i++){
   sum += list.get(i);
}

확장 for 문
List<Integer> list = Arrays.asList(1, 3, 5, 7);
for(Integer i: list){
    sum += i;
}

즉, 확장 for 문은
for(要素の型 要素を入れる変数: コレクションの変数){
    処理(要素が入った変数を処理に使用できる)
}

라는 구문이 되어 있는 것을 알 수 있습니다.
보통의 for문과 비교해 심플한 기술이 되고 있네요.

확장 for 문은 무엇을하고 있습니까?



확장 for 문이 내부적으로 어떻게 움직이는지 Java 문서를 읽어 보겠습니다.
덧붙여서 확장 for문이라고 불리는 경우가 많습니다만, 실은 Java의 문서에서는 For-Each 루프라고 하는 항목이 되고 있습니다.

이것에 의하면, 하기 2개의 코드는 등가라고 하는 것.
게다가 확장 for문이 iterator 변수를 다루지 않기 때문에 복잡성이나 에러의 위험성이 배제되기 때문에 보다 추천합니다.

확장 for 문
List<Integer> list = Arrays.asList(1, 3, 5, 7);
for(Integer i: list){
    sum += i;
}

iterator
List<Integer> list = Arrays.asList(1, 3, 5, 7);
for(Iterator<Integer> i = list.iterator(); i.hasNext();){
    sum += i;
}

즉, 확장 for문은 내부적으로는 iterator에 의한 반복 처리를 실시하고 있는 것을 알 수 있습니다.

왜 LinkedList라면 확장 for문이 현격히 고속인가?



LinkedList의 구현을 생각해 봅시다.
상세한 설명은 「 Java에서 자주 사용하는 Collection 구현 클래스의 구조와 특성 」에 기재가 있습니다만, LinkedList는 아래 그림과 같이, 노드가 연결한 형태의 구조로 되어 있습니다 하기 위해 하나의 링크가있는 구조로 설명합니다).
따라서 노드 3을 참조할 때 루트에서 시작하여 노드 1, 노드 2, 노드 3과 순서대로 노드를 따라갑니다.



여기서 for문을 사용한 반복으로 모든 요소를 ​​참조하는 경우를 생각하면 각 노드를 참조할 때의 처리는 아래와 같습니다.
  • 노드 1 : 루트 ⇒ 노드 1
  • 노드 2 : 루트 ⇒ 노드 1 ⇒ 노드 2
  • 노드 3 : 루트 ⇒ 노드 1 ⇒ 노드 2 ⇒ 노드 3

  • 이 경우, 노드 3을 참조할 때에 다시 루트로부터 차례로 추적하게 되어 버려, 효율이 나빠집니다.
    그래서 LinkedList의 Iterator는 현재 위치를 저장하여 이것을 해결하고 효율적으로 내부 요소를 반환합니다.
    위에서 언급했듯이 확장 for 문은 Iterator를 사용하기 때문에 확장 for 문을 사용하면 효율적인 반복 처리가 가능해졌습니다.

    확장 for 문과 for 문을 사용해야합니까?



    Iterator는 효율적인 반복 처리를 제공한다는 전제에 근거하면, 기본적으로 확장 for문을 사용하는 것으로 항상 효율적인 반복 처리를 실행할 수 있습니다.
    단순한 배열의 반복 처리에서는 for문 쪽이 고속일 수도 있지만, 몇 ms 정도이므로 변경에 강한 코드로 만들기 위해서도 확장 for문을 사용합시다.

    참고



    for문과 확장 for문의 속도를 비교해 본다.
    확장 for 문을 사용하는 이유

    좋은 웹페이지 즐겨찾기