에듀테크 부트캠프

중첩 반복문 (for - for)에서 생긴 궁금증 - 최적화, 효율, 실무 활용도의 관점

wy-family 2025. 3. 10. 22:15

 

for(int i = 0; i<test.length();i++) {

for(int j=i+1; j<test.length(); j++) {

if(test.charAt(j)==test.charAt(i)) {

result = "있음";

break;

}

}

if(result.equals("있음")) break;

}

첫번째 중복for문에는 test.charAt(j) == test.charAt(i) 에서 비교할 때 test.charAt(i)를 계속 들여다보고 있다.

 

for(int i = 0; i<test.length();i++) {

char target = test.charAt(i);

for(int j=i+1; j<test.length(); j++) {

if(test.charAt(j)==target) {

result = "있음";

break;

}

}

if(result.equals("있음")) break;

}

두번째 중복for문에는 char target = test.charAt(i); 를 해서 target 이라는 메모리 할당을 해주고 있다.

 

둘 중에 뭐가 더 시스템에는 효율적인걸까? 둘 중에 뭐가 더 실무에서는 좋은걸까?

어떤 관점에서 이 둘을 비교할 수 있는걸까?

지금 이 경우에는 큰 차이가 없다고 할 수도 있지만 저런 코드가 계속 누적되면 프로그램의 성능에 영향을 줄거라고 생각해서 질문하게 됐다.

 

좋은 질문이야! 코드의 작은 차이가 반복되면 전체적인 성능에 영향을 미칠 수 있으니까, 이런 고민을 하는 건 아주 좋은 습관이야. 두 가지 코드의 차이점을 여러 관점에서 비교해볼게.


🔍 1. 성능(Performance) 관점

두 코드의 성능 차이를 분석하려면, test.charAt(i)를 계속 호출하는 것과 한 번 변수에 저장해두고 사용하는 것의 차이를 생각해야 해.

  • 첫 번째 코드:
  • 두 번째 코드:

결론:
두 번째 코드가 미세하게 더 효율적이야.
하지만 charAt(i)String 내부에서 배열 접근과 비슷한 연산이므로(일반적인 O(1) 연산), 성능 차이는 크지 않을 거야. 다만, 이런 최적화가 누적되면 영향이 있을 수 있음.


🔥 2. 가독성(Readability) & 유지보수성(Maintainability)

  • 첫 번째 코드:

  • 두 번째 코드:

결론:
실무에서는 가독성이 더 중요한 경우가 많기 때문에, 두 번째 코드가 더 나음.


💾 3. 메모리 사용(Memory Usage)

  • 첫 번째 코드:

  • 두 번째 코드:

그러나 char 타입은 2바이트(16비트) 만 차지하므로, 메모리 사용량 차이는 거의 없음.
오히려 CPU 캐시 효율이 좋아질 수도 있어(자주 사용하는 값을 변수에 저장하면 CPU 캐시에 올라갈 확률이 높아짐).

결론:
메모리 사용량 차이는 미미하므로, 성능 최적화를 위해 지역 변수를 쓰는 게 나쁠 이유는 없음.


📌 결론: 실무에서는 어떤 코드가 더 좋은가?

✅ 두 번째 코드가 더 나음

  • 불필요한 charAt(i) 호출을 줄여 성능 최적화 가능.
  • target 변수명을 활용해 가독성이 좋아짐.
  • 메모리 사용 차이는 거의 없으므로, 최적화할 필요가 없는 경우라도 두 번째 코드가 선호됨.

🔹 하지만 더 좋은 방법도 있다!

실무에서는 Set을 사용해서 중복 검사를 더 빠르게 할 수 있음.
현재 코드의 시간 복잡도는 O(n^2)인데, Set을 사용하면 O(n)으로 최적화 가능해.

java

코드 복사

import java.util.HashSet;

import java.util.Set;

 

public class Main {

    public static void main(String[] args) {

        String test = "abcdefg";

        String result = "없음";

 

        Set<Character> seen = new HashSet<>();

        for (char ch : test.toCharArray()) {

            if (seen.contains(ch)) {

                result = "있음";

                break;

            }

            seen.add(ch);

        }

 

        System.out.println(result);

    }

}

 

➡️ Set을 사용하면 문자열 길이가 길어질수록 성능 차이가 극명하게 나타남.
➡️ 실무에서는 O(n^2) 보다는 O(n)로 최적화하는 게 훨씬 중요함.


🎯 결론 요약

  1. 질문한 코드에서 선택하라면?두 번째 코드가 더 나음 (가독성 + 미세한 성능 개선)
  2. 실무에서는?더 나은 알고리즘을 적용해야 함 (Set 활용하면 O(n^2) → O(n))
  3. 무조건 미세한 최적화보다 중요한 것은?코드 가독성과 유지보수성 (가독성 있는 코드가 실무에서 유지보수하기 더 좋음)

너처럼 작은 차이도 고민하는 습관이 쌓이면, 나중에 성능 최적화에서도 차이가 크게 날 거야! 💡🔥

Set 이 뭔지, HashSet 이 뭔지

이거는 GPT에게 물어보긴 했으나, 나중에 해당 파트를 배우게 되면 그 때 더욱 더 자세하게 공부하고 이해해보려고 하겠다.