무작정 개발.Vlog

[Java] for문의 종류 - for, 향상된 for, forEach()

by 무작정 개발
반응형

이번 글에서는 Java의 3가지 for문에 대해 정리할 것이다.

 

Java의 반복문에서는 기본적으로 for, while 총 2가지가 있습니다. for문에서는 기본 for문, 향상된/개선된 for문, Java8에서 추가된 Iterable 인터페이스의 기본 메서드인 forEach()이 있습니다.

 

Java를 보다 깊게 이해하기 위해 다시 한번 복습하면서 글을 작성 중입니다.
기초적인 내용은 다루지 않을 예정입니다.

보통 for문을 사용할 때는 List 형태에서 데이터를 추출할 때 사용해서 List를 생성 후 데이터를 넣어줄 것이다.

 

 

1. 기본 for문

(1) 기본 for문의 구조

for (초기화; 조건식; 증감식) {
	// 조건식이 True일 때 수행될 문장 작성
}

위는 기본 for문의 구조이다. 

  • 초기화 : 반복문(for)에서 사용될 변수를 초기화
  • 조건식 : 조건식의 값이 True이면 계속 반복, False이면 반복을 중단하고 for문 탈출
  • 증감식 : 반복문(for)을 제어하는 변수의 값을 증가(+) 또는 감소(-)시키는 식이다.

 

(2) 기본 for문 예제

public class forTest {
    public static void main(String[] args) {

            // 예제에 사용될 list 생성 후 값을 넣어주었음
            List<String> list = new ArrayList<>();
            list.add("나는1번");
            list.add("나는2번");
            list.add("나는3번");

            // 기본 for문
            for (int i=0; i<list.size(); i++) {
                System.out.println(list.get(i));
            }
    }
}
/*
[실행결과]
나는1번
나는2번
나는3번
*/

list 객체를 생성 후 3가지의 값을 list에 넣어주었다. 그리고 기본 for문을 사용해서 list(0) 번째부터 list의 크기만큼

값을 가져와서 출력하였다.


2. 향상된/개선된 for문 (for each)

시작하기 앞서 향상된/개선된 for문을 for each라고도 부릅니다. 

for each라는 키워드가 따로 있는 것은 아니고 동일한 for문을 이용합니다. 추가로 for each와 forEach는 같은 것이 아닙니다.

 

(1) 향상/개선된 for문 구조

향상/개선된 for문은 기본 for문과 구조가 조금 다릅니다.

// 기본 for문
for (int i=0; i<list.size(); i++) {
	System.out.println(list.get(i));
}

// 향상된 for문
for(String str : list) {
	System.out.println(str);
}

위의 기본 for문, 향상된 for문은 동일한 형태의 값을 출력합니다.

 

[ 향상된 for문 구조 ]

for (type var : iterate) {
	body-of-loop
}

향상된 for문은 보기에 매우 직관적이고, 구조를 살펴보자면 iterate는 Loop를 돌릴 객체입니다.

iterate 객체에서 1개씩 순차적으로 var에 대입되어 for문이 수행되고, iterate로 사용할 수 있는 자료형(Type)은 Loop를

돌릴 수 있는 자료형(배열, ArrayList 등)만 가능합니다.

단, 향상된 for문은 따로 반복 횟수를 명시적으로 주는 것이 불가능하고, 1개씩 순차적으로 반복될 때만 사용 가능

 

[ 향상된 for문 동작 과정 ]

for (String str : list) {
	System.out.println(str);
}

// 실제 동작 과정
Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {
	System.out.println(iterator.next());
}

 

반응형

(2) 향상/개선된 for문 예제

public class forTest {
    public static void main(String[] args) {

            // 예제에 사용될 list 생성 후 값을 넣어주었음
            List<String> list = new ArrayList<>();
            list.add("나는1번");
            list.add("나는2번");
            list.add("나는3번");

            // 향상된 for문
            for (String str : list) {
            	System.out.println(str);
            }
    }
}
/*
[실행결과]
나는1번
나는2번
나는3번
*/

위의 향상된 for문은 기본 for문과 같은 출력 결과가 나옵니다.

 


3. forEach()

(1) forEach() 개요

forEach() 메서드는 Java8에서 추가된 Iterable 인터페이스의 기본 메서드입니다. 기존 for문과 비슷하게 조금 더 쉽게

Loop를 가능하게 해주는 메서드입니다.

최상위에 Iterable 인터페이스가 있다.
최상위에 Iterable 인터페이스가 있다.

더 자세한 내용은 하단 링크를 참조!

[Java8] 인터페이스의 변화 - default method, static method

 

[Java8] 인터페이스의 변화 - default method, static method

이번에는 인터페이스의 변화, default method, static method에 대해 정리할 것이다. [목차] 인터페이스 기본 메서드와 스태틱 메서드 Java 8 API의 기본 메서드와 스태틱 메서드 1. 인터페이스 기본 메서드

backendcode.tistory.com

(2) forEach() 구조

 

Java는 JavaScript와 forEach()가 조금 다릅니다.

Java는 Consumer이라는 인터페이스를 전달받아 내부적으로 accept라는 메서드를 실행하도록 구조가 되어 있습니다.

 Consumer 인터페이스는 함수형 인터페이스(Functional Interface)의 한 종류로 아래와 같이 선언되어 있습니다.

 

@FunctionalInterface
public interface Consumer<T> {
	void accept(T t);

 

이제 더 자세한 forEach()는 하단에서 다룰 예정이다.

 

(3) forEach() 예제

이제 forEach()를 통해 기본 for문, 향상된 for문과 동일한 예제를 진행할 것입니다. 출력 결과는 동일하고

같은 forEach()를 써도 조금씩 다른 방법이 있는데 이를 모두 예제로 작성할 것입니다.

 

[ 익명 클래스를 이용한 인터페이스(Consumer) 구현 ]

// Consumer 인터페이스를 상속 받는다.
public class forTest {
    public static void main(String[] args) {

            // 예제에 사용될 list 생성 후 값을 넣어주었음
            List<String> list = new ArrayList<>();
            list.add("나는1번");
            list.add("나는2번");
            list.add("나는3번");

            // 익명 클래스로 Consumer 인터페이스 구현
            list.forEach(new Consumer<String>() {
            @Override
            public void accept(String str) {
                System.out.println(str);
            }
        });
    }
}

위의 코드보다 더 간결하게 작성할 수 있는 방법이 존재합니다.

 

[ Lambda(람다) ]

public class forTest {
    public static void main(String[] args) {

            // 예제에 사용될 list 생성 후 값을 넣어주었음
            List<String> list = new ArrayList<>();
            list.add("나는1번");
            list.add("나는2번");
            list.add("나는3번");

            // Lambda Expression(람다 표현식)
           list.forEach(str -> System.out.println(str));
    }
}

사실 Java8,에서는 위의 방법보다 한 단계가 더 존재합니다.

 

 

[ 메서드 레퍼런스 ]

  • 람다 표현식에서 메서드 레퍼런스로 변경
public class forTest {
    public static void main(String[] args) {

            // 예제에 사용될 list 생성 후 값을 넣어주었음
            List<String> list = new ArrayList<>();
            list.add("나는1번");
            list.add("나는2번");
            list.add("나는3번");

            // 메서드 레퍼런스
            list.forEach(System.out::println);
    }
}

 

람다(Lambda), 메서드 레퍼런스에 대해 더 자세한 자료는 하단에 있는 이전 글 참고!

 

[Java8] 함수형 인터페이스, 람다 표현식

 

[Java8] 함수형 인터페이스, 람다 표현식

이번에는 Java의 함수형 인터페이스(Functional Interface)와 람다 표현식(Lambda Expression)에 대해 정리할 것이다. 1. 함수형 인터페이스 함수형 인터페이스(Functional Interface)는 추상 메서드(Abstract Method)를

backendcode.tistory.com

 

반응형

'Language > Java' 카테고리의 다른 글

원도우 Open JDK 8 설치 및 환경 변수 설정 방법  (0) 2023.01.09
[Java8] 자바 CompletableFuture 프로그래밍  (0) 2022.11.12
[Java8] Date와 Time  (1) 2022.11.11
[Java8] Optional 이란?  (0) 2022.11.11
[Java8] Stream API에 대해  (0) 2022.11.10

블로그의 정보

무작정 개발

무작정 개발

활동하기