인텔리제이에서 for문으로 작성하다보면 List와 같은 경우는 인덱스를 따로 쓰지 않는이상 for-each문으로 바꾸라고 경고를 한다.
private static void test(List<Integer> numbers) {
for (int i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i));
}
}
'for' loop replaceable with enhanced 'for'
왜 그럴까?
그것은 자료구조의 변경을 유연하게 하기위해 인터페이스로 객체를 사용하고 있기 때문이다.
인자로 들어오는 List가 ArrayList인지 LinkedList인지 Vector인지 Stack인지 알 수 없다.
여기서 발생하는 문제점은 바로 List에서 사용하는 get()은 자료구조의 내부 구현에 따라 속도가 현저하게 다르다는 것이다.
그 이유는 무엇일까?
LinkedList의 경우 인덱스로 접근하게 될 경우 내부에서 선택한 인덱스까지 다시 순회를 해야한다.
그렇다면 반복문에서 n, 내부에서 다시 탐색하는데 n의 시간이 들어 O(n^2) 시간이 소요된다.
그렇다면 for-each문은 이러한 문제를 어떻게 해결할까?
그것은 iterator를 이용하여 요소를 순회하기 때문이다.
(iterator가 무엇인지 궁금하신 분은 따로 공부해보세요)
ArrayList나 Array같은 경우는 for문이 조금 더 빠르긴 하나 큰차이는 없었다.
따라서 모든 상황에서 유연하게 대체할 수 있는 for-each문을 쓰라고 한 것이었다.
'프로그래밍언어 > Java' 카테고리의 다른 글
자바(Java) Map의 동작원리 (0) | 2021.10.26 |
---|---|
Java Collection FrameWork(JCF)란? (0) | 2021.10.25 |
자바(Java)에서 예외(Exception)란 무엇인가? (0) | 2021.02.25 |
자바(Java) - 오버로딩(Overloading)과 오버라이딩(Overriding) 이란? (0) | 2020.09.01 |
자바(Java) - 불변 객체? Final 키워드? (0) | 2020.08.27 |
댓글