Strong Root

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


우리의 주장들:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java

http://stackoverflow.com/questions/863469/what-is-the-time-complexity-of-a-size-call-on-a-linkedlist-in-java

http://stackoverflow.com/questions/17998386/time-complexity-or-hidden-cost-of-array-name-length-in-java