[JAVA] for문에서 i++, ++i의 성능 차이

한동우·2025년 8월 17일

Java

목록 보기
4/4
post-thumbnail

📘 개요

코드를 작성하다 보면 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를 사용하든 컴파일 최적화를 통해 동일한 바이트 코드로 변환되기 때문에 성능 차이는 없다.
따라서, 본인이 생각하기에 가독성이 좋은 코드를 선택하면 될 것 같다. 😊

3개의 댓글

comment-user-thumbnail
2025년 8월 18일

와 유익한 포스팅이에요~! ჱ̒⸝⸝•̀֊•́⸝⸝)‪

답글 달기
comment-user-thumbnail
2025년 8월 28일

좋은 글 감사합니다 :)

답글 달기
comment-user-thumbnail
2025년 8월 29일

우와 흥미로운 글이네요!

답글 달기