1. for-each 루프
for-each 루프는 '향상된 for 문'이라고도 부르며, 배열이나 컬렉션의 모든 요소를 순회하는데 사용된다.
for (타입 변수명 : 배열 또는 컬렉션) {
// 반복할 코드
}
이 코드에서 '변수명'은 배열 또는 컬렉션의 각 요소를 참조하는 데 사용되며, '타입'은 해당 요소의 데이터 타입을 의미한다.
장점
코드의 간결성 : 인덱스를 직접 관리할 필요가 없기 때문에 코드가 더욱 간결하고 가독성이 좋아진다.
에러 방지 : 인덱스를 잘못 관리하여 발생할 수 있는 에러를 방지할 수 있다. (인덱스 범위 초과, 인덱스 누락을 방지)
단점
순방향 순회만 가능 : for-each 루프는 항상 첫 번째 요소에서 시작하여 마지막 요소까지 순차적으로 순회한다. 따라서 역순이나 특정 조건에 따른 순회를 하려면 기본 for문을 사용해주는게 좋다.
요소의 수정 불가능 : for-each 루프는 요소의 참조만 제공하므로, 요소 자체를 수정할 수 없다.
사용처
배열이나 컬렉션의 모든 요소를 순회해야 할 때
요소의 인덱스가 필요하지 않을 때
예제 1
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println(num);
}
이 코드는 배열 numbers의 모든 요소를 순회하며, 각 요소를 num에 할당하고 그 값을 출력한다. 따라서 이 코드는 1부터 5까지의 숫자를 순서대로 출력하게 된다.
예제 2
for문을 사용할 때 인덱스를 직접 관리하게 되는데, 이 과정에서 생길 수 있는 에러에 대해서 정리 해보았다.
인덱스 범위 초과 : 배열의 크기를 벗어나는 인덱스에 접근하려는 경우, ArraryIndexOutOfBoundsException이 발생할 수 있다고 한다.
예시로, 크기가 5인 배열에 대해 인덱스 5의 요소에 접근하려고 하면 이런 에러가 발생한다.
인덱스 누락 : 일부 인덱스를 누락하거나, 실수로 중복 접근하는 경우, 원하지 않는 결과를 얻을 수 있게 된다.
for-each문을 사용할 경우 이런 실수를 미연에 방지할 수 있다. for-each문은 자동으로 모든 요소를 순회하는 특징을 가지고 있기 때문에 인덱스를 직접 관리할 필요가 없다. 따라서 인덱스 범위 초과나 누락 문제를 사전에 방지할 수 있다.
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]);
}
이와 같이 작성하게 되면 ArraryIndexOutOfBoundsException라는 오류가 뜨게 된다. 이름이 너무 길어서 그냥 범위초과로 정리해야할 것 같다. 배열의 인덱스는 0부터 시작하기 때문에 5개의 배열이기 때문에 각 요소의 인덱스는 0, 1, 2, 3, 4가 된다. 이때, arr.length는 배열의 길이, 즉 요소의 개수를 나타내므로 arr.length는 5가 된다. 그렇기 때문에 i <= arr.length로 설정하게 되면 i는 0부터 5까지 숫자를 넣게 되는데, i가 5일 때 arr[5]에 접근하려고 한다. 하지만 arr[5]는 존재하지 않기 때문에 범위초과?라는 에러가 뜨게 된다. 이 경우 모든 배열을 for문으로 돌리고 싶다면 i < arr.length 또는 i<= arr.length -1을 사용하거나 for-each문을 사용해주면 해결이 가능하다.
for-each문을 사용할 경우 이렇게 간결하게 해결이 가능하다.
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println(num);
}
이 코드를 사용할 경우 numbers의 모든 요소를 순회하며, 각 요소를 num에 할당하고 그 값을 출력한다. 따라서 이 코드를 사용하게 되면 1부터 5까지의 숫자를 순서대로 출력해줄 수 있게된다.
2. 마치며
요즘 자바 언어 공부를 다시 하면서 활용을 하기 위해서 프로그래머스에 간간히 문제를 풀고 있는데 프레임워크만 사용하고 필요한 코드는 그때 그때 복붙해서 사용하다보니 코드를 보면 왜 이걸 사용했구나는 알고 있지만 너가 짜볼 수 있어? 한다면 머리가 하얗게 변하는 바람에 배열값 구하는 문제 푸는데 30분 이상 걸렸다. 그러던중 다른 사람 풀이를 보니 for(int num : arr) 이렇게 푸신 분들이 많아서 왜 다들 이렇게 풀었을까 싶었다. 이유는 위에서 정리한 것과 같은데 무식하게 for문으로 풀다보니 코드도 길어지고 고려해야할 부분이 많아져서 저렇게들 많이 사용했던 것 같다. 프레임워크를 공부하면서 언어 활용도까지 올리기란 하늘의 별따기인것 같다. 이래서 회사에 갈 수 있을까?
쓰임 있는 사람이 되기 위해 노력 중입니다.