Array size in Loops
뿌리튼튼 CS/Java2015. 7. 31. 16:31
for (int i = 0; i < mArrayList.size(); i++) { | cs |
w3schools 에서 JavaScript 를 공부하다가, 이 흔한 반복문에 의문을 제기하는 글을 보았다.
size() 메서드를 매 loop 마다 실행하는 것은 낭비라는 것이다.
그들은 아래와 같이 개선하는 것을 제안했다.
①
1 2 | int n = mArrayList.size(); for (int i = 0; i < n; i++) { | cs |
② 혹은 scope 최소화 측면에서 조금더 개선된
for (int i = 0, n = mArrayList.size(); i < n; i++) { | cs |
하지만.
그렇다면 내가 봐왔던 뛰어난 코드들은 왜 저런식으로 코딩하지 않았을까?
의문이 들어 ArrayList 소스코드를 직접 열어보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package java.util; public class ArrayList<E> extends ... { ... private int size; ... ... public int size() { return size; } ... } | cs |
그렇다. size() 는 단순히 size 변수값을 반환하는 O(1) 의 메서드인 것이다.
당연하게도, 미련하게 처음부터 count 하는 O(n) 이 아닌 것이다.
게다가 JVM 이 똑똑하여서 loop 내에서 size 값이 변하지 않는다는 것을 알고 있으며,
따라서 자동으로 최적화를 한다고 한다.
덧붙여서, ArrayList 객체가 아닌 일반 array (ex. int[]) 의 length 도 같은 방식으로 구현이 되어있다고 한다.
나의 결론 :
좋은 접근이지만 결론적으로는 가독성만 떨어질 뿐이다.
출처들
그들의 주장들:
http://www.w3schools.com/js/js_performance.asp
http://egloos.zum.com/benelog/v/1382604
우리의 주장들:
'뿌리튼튼 CS > Java' 카테고리의 다른 글
생성자를 쓰는 이유. 생성자의 필요성 (Why use constructors) (0) | 2016.08.02 |
---|---|
심심풀이 문제1 - Object.equals() (0) | 2016.07.16 |
[Collection] ArrayList vs Vector (0) | 2016.02.01 |
String vs StringBuilder vs StringBuffer (2) | 2016.01.28 |
Thread ID로 thread 찾기 (get thread by id) (0) | 2015.07.27 |