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)로 최적화하는 게 훨씬 중요함.
🎯 결론 요약
- 질문한 코드에서 선택하라면? → 두 번째 코드가 더 나음 (가독성 + 미세한 성능 개선)
- 실무에서는? → 더 나은 알고리즘을 적용해야 함 (Set 활용하면 O(n^2) → O(n))
- 무조건 미세한 최적화보다 중요한 것은? → 코드 가독성과 유지보수성 (가독성 있는 코드가 실무에서 유지보수하기 더 좋음)
너처럼 작은 차이도 고민하는 습관이 쌓이면, 나중에 성능 최적화에서도 차이가 크게 날 거야! 💡🔥
Set 이 뭔지, HashSet 이 뭔지
이거는 GPT에게 물어보긴 했으나, 나중에 해당 파트를 배우게 되면 그 때 더욱 더 자세하게 공부하고 이해해보려고 하겠다.
'에듀테크 부트캠프' 카테고리의 다른 글
Java 필드와 메서드의 차이: 배열.length vs String.length() (0) | 2025.03.10 |
---|---|
반복문의 무한루프, 어떤 경우에 사용하며 최적화 방법은? (0) | 2025.03.10 |
switch는 조건문인데 반복문이기도 한건가? (0) | 2025.03.10 |
자바 반복문과 제어문 완벽 정리: for, while, switch, break, continue 그리고 랜덤값 활용 (0) | 2025.03.10 |
배열의 인덱스는 왜 0부터 시작할까? + 참조값의 비밀 (0) | 2025.03.10 |