작성
·
317
0
안녕하세요. 강의 잘 듣고 있습니다.
쉽게 잘 풀어 설명해주셔서 재미있게 듣고 있습니다!
Array Loop 파트 중 궁금증이 생겨 질문 드립니다.
for loop를 이용해 배열 순회:
순회 범위를 조절하는 경우 유리
for-each를 이용해 배열 순회:
배열의 처음부터 끝까지 순회하는 경우 유리
정도로 우선 이해했는데,
만약 for-each를 사용하고 내부에서 조건문을 이용해 break 처리해 반복을 멈출 수도 있다는 생각이 듭니다.
두 가지 방법에 유의미한 차이가 있나요?
(e.g. 배열이 큰 경우 속도 차이가 있어 성능 문제로 이어질 수 있나요?)
두 방법 중 무엇을 사용하든 차이가 없다면 기기 성능이 점점 좋아지기 때문에 무의미해진 건가요? 아니면 단순히 가독성의 문제인가요?
위 두 질문 이외에 개발 공부를 하면서 든 궁금한 점이 있어 추가로 질문을 드리고 싶습니다.
어떤 문제를 해결하는데 가능한 방법이 여러가지가 있다면 성능 측면에서 더 좋은 해결 방법을 선택하고 싶습니다.
어떤 방법이 더 성능이 좋은지(빠르고 부하가 덜한지)를 알려면 어떻게 해야 하나요?
답변 1
1
안녕하세요?
for loop 와 for-each loop는 모두 배열 순회를 위해 사용할 수 있는데 두 방법의 성능 차이는 거의 없다고 보셔도 됩니다. 특히 요즘에는 컴퓨터 성능이 매우 좋기도 하구요.
for loop 는 반복 횟수나 범위를 명시적으로 지정할 수 있으므로, 배열의 일부 요소만 순회하려는 경우 유리합니다. 또는 증감 부분에서 i++ 이 아닌 i+=2 와 같이 하여 배열의 요소를 하나씩 건너뛰도록 할 수도 있지요. 반면에 for-each 는 범위를 명시적으로 지정할 수 없으며, 배열의 처음부터 끝까지 순회하므로 배열의 모든 요소에 대해 순회해야 할 경우 유리합니다.
어떤 방법이 성능적으로 더 우수한지 알아보려면 일반적으로 코드의 실행 시간을 측정하는 것이 좋습니다. 자바에서는 System.currentTimeMillis() 를 이용해 코드 실행 시간을 측정할 수 있어요.
long start = System.currentTimeMillis();
// 시간 측정을 위한 코드를 이 곳에 적으세요
long end = System.currentTimeMillis();
long elapsedTime = end - start;
System.out.println("수행시간 : " + elapsedTime + " ms");
프로그래밍을 할 때 어떤 방법이 더 성능이 좋은지를 알기 위해서는 알고리즘을 공부하면 좋습니다. 알고리즘을 공부 하다 보면 시간 복잡도라는 것을 배우게 될 텐데, 시간 복잡도는 알고리즘의 실행 시간을 분석하는 방법으로 Big-O 표기법으로 나타냅니다. Big-O는 알고리즘의 최악의 실행 시간을 나타내는데, 이를 통해 입력값이 커질 때 알고리즘의 성능이 어떻게 변화하는지 예측할 수 있습니다. 예를 들어, O(n) 시간 복잡도를 가지는 알고리즘은 입력의 크기가 n 배 증가할 때 실행 시간도 n 배 증가하며, O(n^2) 시간 복잡도를 가지는 알고리즘은 입력의 크기가 n 배 증가할 때 실행 시간은 n^2 배 증가합니다.
만약 1개의 단어(한글)가 적힌 종이를 1초 동안 보고 어떤 단어가 있었는지 외운다고 가정해봅시다. 1초에 단어 1개는 너무 쉽죠?
이번에는 3개의 단어가 적힌 종이를 3초 동안 보고 세 단어를 모두 외운다고 가정해봅시다. 3초에 단어 3개 정도는 사실 크게 어렵지는 않을 것 같네요. 여기까지만 보면 우리는 평균 1초에 1개 단어를 외운다고 해볼 수 있을 것 같습니다. 앞서 말씀드린 시간 복잡도로 표현하면 O(n) 으로 볼 수 있겠죠.
그런데 1,000개의 단어가 적힌 종이를 1,000초 동안 본다면 어떻게 될까요? 평균 1초에 단어 1개를 외운다면 1,000초면 1,000개를 외울 수 있어야겠지만 현실은 훨씬 더 많은 시간이 주어져도 아마 다 외우지 못할 겁니다. O(n^2) 보다 더 나쁜 시간 복잡도를 가지는 것이죠.
이처럼 입력값(단어)의 크기가 작을 때는 체감을 못하다가 입력값이 커지면 코드를 수행하는데 굉장히 오랜 시간이 걸리거나 모든 작업을 완료하지 못하고 아예 프로그램이 비정상 종료가 될 수도 있습니다. 이런 부분은 알고리즘을 공부 하다 보면 자연스럽게 최적화를 고민하게 되고 더 나은 성능을 가지는 접근 방법을 택하게 되실 겁니다 😊
감사합니다.
빠른 답변 감사합니다!
질문 답글마저도 이해하기 쉽게 설명해주시네요! 덕분에 정말 많은 도움 되었습니다.