본문 바로가기
코딩 공부(hackerrank)

[Java] for문, foreach문, List.forEach()

by Luna_lua 2023. 1. 10.
반응형

for : 반복문

코드에서 반복적인 작업을 한다면 늘 봐왔던 for문과 while문

오늘은 그중에서 for문에 대해 적어보려 한다.

for(int i = 0; i < loop.size; i++{
	// 반복할 문장
}

 

 

foreach : 확장 포문

기본적으로 사용하는 반복문이다. 그러나 오늘은 자바 5.0부터 사용할 수 있는 foreach 즉 확장 for문을 알아보련 한다.

기본 작성방법은 아래와 같다

// for(타입 변수명 : 콜렉션명){
for(Integer data : arrlist){
	// 반복할 코드
}

여기서 타입은 콜렉션명에서 하나의 인자를 꺼내올때의 타입과 동일하게 하면 된다 즉, ArrayList<Integer> 라면 Integer 변수명 으로 사용하면 된다.

이는 위의 반복문과 같은 사용법이면서 증감식을 사용하는것이 아니라, 콜렉션이 가지고 있는 인자의 수만큼 사용할 수 있기 때문에 보다 간결하게 작성 할 수 있다.

단, 값을 가져다 사용만 할 수 있고 수정이 불가능 하고, 역순으로 탐색을 할수 없으니 수정이 필요한 작업이라면 이 확정 포문은 확인 후 사용하는것이 좋다!

 

 

List.forEach()

※ 여기서 확장포문인 foreach와 ArrayList에 들어있는 forEach의 차이도 알아보자!

리스트를 반복문과 확장포문으로 사용할 수 있지만 리스트안에 반복을 할 수 있는 메소드가 있다는것 아셨나요?

바로 아래와 같은 forEach입니다.

List<Integer> arrList = new ArrayList<>();
arrList.add(1);
arrList.add(2);
arrList.add(3);

// 1번 방식
Consumer<Integer> lambda = intData -> System.out.println("arrList Data : " + intData);
arrList.forEach(lambda);

System.out.println();
System.out.println("다른 방식의 forEach문");
System.out.println();

// 2번 방식
arrList.forEach(intData -> System.out.println("arrList Data : " + intData));

1번 방식은 forEach의 매개변수타입이 Consumer이기 때문에 한번더 타입을 만들어주는 방식이고,

2번 방식은 위의 작업을 더 간략히 적은 람다식이다.

이 방법을 사용하는 이유는 원래 인덱스를 사용해서 값을 가져오는데 그러면 원하는 인덱스까지 검색을 해야하는 시간이 걸린다. 그러나 이 forEach문은 iterator를 이용하여 요소를 순회하기 때문에 모든상황에서 유연하게 대체할 수 있다.


하지만 이에 대한 단점도 있다.

1. 디버깅 (오류 확인)에 대한 내용은 같은 오류라도 나오는 문구가 다르다.

<List.forEach의 에러문구 (0으로 나눴을때의 문구)>

 

<기본 for문의 에러문구 (0으로 나눴을때의 문구)>

이것이 오류가 하나가 아니라 복잡한 구조에서 여러 오류가 났다면 확인하기가 더욱 어렵다.

 

2. 너무 간단한 반복문이라면 함수형 인터페이스가 더욱 오래 걸린다. (cpu 사용에 대한 이슈)

Linked List의 경우 일반 for문이 더 오래걸리고,

ArrayList는 거의 비슷하며,

Array (배열)에서는 일반 for문이 더 빨랐다. 

 

※ 쓰니는 간단하게 적었지만 더 자세한 내용이 궁금하다면 함수형 인터페이스와 람다식, Iterator 등을 알아보자!

반응형