Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

myinfo0968 님의 블로그

Java [for문과 stream.forEach()] (2025.03.13) 본문

Java

Java [for문과 stream.forEach()] (2025.03.13)

myinfo0968 2025. 3. 13. 22:11
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문을 사용 해도 충분히 가독성 좋은 코드가 될 수 있고, 성능 면에서도 뛰어나다.