코드를 작성하다 보면 for문을 자주 사용하게 된다. 프로그래밍 언어를 처음 학습할 때는 보통 for문에서 i++를 사용하는 경우가 많다 보니, 이에 따른 성능 차이에 대해서는 깊게 생각해본 적이 없었다. 그런데 이에 관한 질문을 받았다.
for (int i = 0; i < n; i++) {
.....
}
🧑🏻🏫 for문에서 i++와 ++i 중에 어떤 것이 빠를까요?
생각하지 못한 질문을 받아서 처음엔 당황했지만 곧 생각을 정리했을 때 단순하게 i++는 값을 사용한 뒤에 증가시키고 ++i는 값을 먼저 증가시키기 때문에 ++i가 더 빠를 것 같다는 생각을 했다.
결론부터 말하면 for문에서 i++, ++i는 성능 차이가 없다. 이는 최신 자바 컴파일러가 두 연산을 동일하게 최적화하기 때문이다. 이를 확인하기 위해 간단한 코드를 작성했다.
public class Main {
static int sum1(int n) {
int s = 0;
for (int i = 0; i < n; i++) {
s += i;
}
return s;
}
static int sum2(int n) {
int s = 0;
for (int i = 0; i < n; ++i) {
s += i;
}
return s;
}
public static void main(String[] args) {
int n = 3;
System.out.println("sum1 = " + sum1(n));
System.out.println("sum2 = " + sum2(n));
}
}
javac Main.java 명령어로 Main.class 파일을 생성했다.

javap -c Main 명령어를 통해 바이트 코드를 확인하면
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
static int sum1(int);
Code:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_2
4: iload_2
5: iload_0
6: if_icmpge 19
9: iload_1
10: iload_2
11: iadd
12: istore_1
13: iinc 2, 1
16: goto 4
19: iload_1
20: ireturn
static int sum2(int);
Code:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_2
4: iload_2
5: iload_0
6: if_icmpge 19
9: iload_1
10: iload_2
11: iadd
12: istore_1
13: iinc 2, 1
16: goto 4
19: iload_1
20: ireturn
public static void main(java.lang.String[]);
Code:
0: iconst_3
1: istore_1
2: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
5: iload_1
6: invokestatic #13 // Method sum1:(I)I
9: invokedynamic #19, 0 // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
14: invokevirtual #23 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
20: iload_1
21: invokestatic #29 // Method sum2:(I)I
24: invokedynamic #32, 0 // InvokeDynamic #1:makeConcatWithConstants:(I)Ljava/lang/String;
29: invokevirtual #23 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
32: return
}
sum1, sum2의 i 증감 부분이 13: iinc 2, 1의 바이트 코드로 변환되는 것을 확인할 수 있다.
Java for문에서는 i++를 사용하든 ++i를 사용하든 컴파일 최적화를 통해 동일한 바이트 코드로 변환되기 때문에 성능 차이는 없다.
따라서, 본인이 생각하기에 가독성이 좋은 코드를 선택하면 될 것 같다. 😊
와 유익한 포스팅이에요~! ჱ̒⸝⸝•̀֊•́⸝⸝)