myinfo0968 님의 블로그
Java [for문과 stream.forEach()] (2025.03.13) 본문
for - loop
원시형 for문
for (int i = 0; i < menus.size(); i++) {
// 입력 받은 숫자가 올바르다면 인덱스로 활용하여 List에 접근하기
Menu menu = menus.get(i);
System.out.println((i + 1) + ". " + list.getName());
}
- for () 안에 초기값을 설정, 조건값 설정, 증감식을 설정해준다. 그리고 중괄호 {} 내부에 수행할 동작을 써주면 된다.
- 이 방법은 int형 i 가 menus 의 size 만큼 반복 되는 방식으로 진행된다.
- 기존에는 이렇게 세세히 써줘야 했다.
- for-loop로 짠 경우 break; 로 인해 다른 요소의 조건검사를 하지 않고 바로 수행이 끝난다
향상된 for문
int i = 1;
for (Menu menu : menus) {
System.out.println(i + ". " + menu.getName());
i++;
}
- 향상된 for문을 보면 소괄호() 내부에 콜론: 왼편에는 타입과 변수명을 적어주고 오른편에는 List 명을 적어준다.
- menus라는 리스트를 한 바퀴 돌아서 내부 인덱스들을 Menu 타입의 menu에 저장한다.
- 이 for문은 만약 menus 라는 리스트가 empty 즉, 비어있는 리스트라면 실행되지 않는다.
- 오류가 발생하지 않는 다는 장점도 있다.
stream.forEach
//stream().foreach
menus.stream().forEach(menu -> System.out.println( ". " + menu.getName()));
- java 8부터 도입된 메서드로, for문이나 향상된 for문처럼 반복할 수 있는 방법이다.
- 요즘에는 stream이 반복적인 일의 처리가 가능해서 for문을 대신해서 사용하는 경우가 많다.
- 함수형 프로그래밍이 대세이니 for문 대신 stream을 사용하는 것은 다시 한번 생각해 봐야 한다.
장점
- for문 내부의 if문이나 중첩 반복문을 stream 한줄로 표현하니 코드가 짧아 지면서 가독성이 좋아 보인다.
- 하지만, 그보다 더 치명적인 단점이 존재한다.
단점
- stream().forEach()는 리스트에서 스트림 객체를 생성하고 그 스트림에 있는 forEach 메서드를 사용하기 때문에 병렬 스트림에서 순서가 보장되지 않는다.
- stream은 성능면에서 무척 떨어진다. stream이 시작되면 중간에 원하는 값을 도출해도 리스트를 한바퀴 돌때까지 계속해서 진행되기 때문이다. -> 지연 연산
- 그리고 리스트가 비어있는 리스트라면 오류가 발생한다.
- stream의 forEach 를 사용할 때는 객체를 수정하면 안된다.(NullPointerException오류 발생)
- stream은 병렬 작업에 특화되어 단일 스레드에서 사용하는 경우 비효율적
Collection.forEach
//컬렉션 foreach
menus.forEach(menu -> System.out.println(menu.getName()));
- stream() 을 사용하지 않고 컬렉션에 바로 forEach() 를 사용한다.
장점
- 이 forEach 문도 코드가 짧고 깔끔해지기 때문에 가독성이 좋아진다.
단점
- 컬렉션의 forEach는 내부에서 Iterator 객체를 사용하기 때문에 순서가 보장된다.
- 컬렉션 forEach은 내부에서 향상된 for문을 사용하기 때문에 반복 도중에 수정을 하게 되면 ConcurrentModificationException 이 발생한다.
- 지연연산으로 비효율적이다.
forEach는 객체의 데이터를 다루지 말고 출력용으로만 사용 하는 것이 좋다.
즉, 성능을 저하시키면서 까지 stream을 사용하지는 말자!!!
향상된 for문을 사용 해도 충분히 가독성 좋은 코드가 될 수 있고, 성능 면에서도 뛰어나다.
'Java' 카테고리의 다른 글
Spring [정규 표현식] (2025. 04. 08) (1) | 2025.04.08 |
---|---|
java [Kiosk 과제] (2025. 03. 12) (0) | 2025.03.12 |
Java 깊은 복사? vs 얕은 복사? (2025. 03. 12) (0) | 2025.03.12 |
Java [Kiosk 과제 트러블 슈팅] (2025. 03. 10) (0) | 2025.03.10 |
Java [키오스크 과제 설계] (2025. 03. 07) (1) | 2025.03.07 |