본문 바로가기

Java/Chapter 13. 배열(Array)

[Java] 13.02 - enhanced for문

들어가며

 이번에 소개하는 enhanced for문은
자바 5에서 추가되었다.

 그리고 지금은 많이 사용되는
반복문 중 하나가 되었다.

 

enhanced for문의 이해와 활용

 프로그램을 작성하다 보면 다음과
같이 배열에 저장된 모든 요소를
대상으로

 연산, 참조, 또는 탐색을 진행하는
경우를 흔히 접할 수 있다.

배열에 저장된 값 중에서 특정 조건에 해당하는 값을 찾아라.
배열에 저장된 모든 값에 대해 12%씩 그 값을 증가시켜라.

 그리고 이러한 상황에서의 문장
구성을 돕기 위해 등장한 것이
enhanced for문이다.

이는 for-each문으로도 불린다.

 예를 들어서 '배열에 저장된 모든
값을 출력하라'는 요구 사항을 만족하는
for문은 다음과 같이 작성할 수 있다.

int[] ar = {1, 2, 3, 4, 5};

for (int i=0; i < ar.length; i++)
    System.out.println(ar[i]);

  그리고 위의 for문을 enhanced for문
으로 구성하면 다음과 같다.

for (int e : ar)
    System.out.println(e);

 객관적으로 비교해 보았을 때,
enhanced for문에는 다음 2가지
장점이 있다.

  • 코드의 양이 절대적으로 줄어든다.
  • 반복문 구성 과정에서 배열의 길이 정보를 직접 확인하고 입력할 필요가 없다.

 이러한 장점이 있는 enhanced for문의
기본 구성을 배열을 기준으로 보면
다음과 같다.

배열 이외의 대상으로도 enhanced for문의 구성이 가능하다.
이에 대해서는 이후에 소개한다.
for (요소 : 배열) {
    반복할 문장들
}

 위의 구성에서 '배열'에는 반복의
대상인 배열의 참조변수가 온다.

 그리고 '요소'에는 배열의 요소
하나가 담긴다.

 예를 들어서 앞서 소개한 다음
문장을 보자.

int[] ar = {1, 2, 3, 4, 5};

for (int e : ar)
    System.out.println(e);

 위의 반복문은 배열 ar을 대상으로
반복을 진행한다.

 따라서 첫 번째 실행의 상황에서
변수 e에는

 배열 ar의 첫 번째 요소의 값이 담겨
'반복할 문장들'이 실행된다.

 즉 다음과 같이 이해할 수 있다.

// 첫 번째 반복의 상황
for (int e : ar) {
    e = ar[0];    // 첫 번째 요소가 변수 e에 담겨 아래 문장을 실행
    System.out.println(e);
}

 마찬가지로 두 번째 실행의 상황은
다음과 같다.

 배열의 두 번째 요소가 변수 e에
담겨 '반복할 문장들'을 실행한다.

// 두 번째 반복의 상황
for (int e : ar) {
    e = ar[1];    // 두 번째 요소가 변수 e에 담겨 아래 문장을 실행
    System.out.println(e);
}

 그리고 마지막엔 배열의 마지막
요소가 변수 e에 담기고,

 반복할 문장들이 실행된 후
반복문은 종료된다.

 그럼 이와 관련해서 예제를 하나
보이겠으니,

 지금 설명한 내용을 기준으로
예제의 흐름을 분석해보자.

class EnhancedFor {
    public static void main(String[] args){
        int[] ar = {1, 2, 3, 4, 5};

        // 배열 요소 전체 출력
        for (int e : ar)
            System.out.print(e + " ");
        System.out.println();   // 단순 개행

        int sum = 0;

        // 배열 요소의 전체 합 출력
        for (int e : ar)
            sum += e;
        System.out.println("sum: " + sum);
    }
}

/*
출력 결과
1 2 3 4 5 
sum: 15
*/

 

인스턴스 배열을 대상으로 하는 enhance for문

 배열에 저장된 내용이 '기본
자료형의 값'이 아닌,

 '인스턴스 참조 값'인 경우에도
enhanced for문의 활용에 있어서
달라지는 것은 없다.

 다음은 Box형 배열을 생성하고
이를 대상으로 새로운 for문을
구성한 예이다.

Box 클래스를 정의했다고 가정한다.
Box[] ar = new Box[10];
for (Box e : ar){
    . . . .
}

 위의 반복문에서 변수 e가 Box형
참조변수로 선언되었음에 주목하자.

 첫 번째 반복의 과정이 다음과
같으므로, 이러한 선언은 당연한
것이다.

// 첫 번째 반복의 상황
for (Box e : ar) {
    e = ar[0];    // 첫 번째 요소에 저장된 참조 값을 e에 대입
    . . . .
}

 그럼 다음 예제를 통해서 구체적인
활용의 예를 보이겠다.

 이 예제에서는 상자에 부여된 번호를
확인하고 특정 번호의 내용물 정보를
출력하고 있다.

class Box {
    private String contents;
    private int boxNum;

    Box (int num, String cont) {
        boxNum = num;
        contents = cont;
    }

    public int getBoxNum() {
        return boxNum;
    }

    public String toString() {
        return contents;
    }
}

class EnhancedForInst {
    public static void main(String[] args) {
        Box[] ar = new Box[5];
        ar[0] = new Box(101, "RTX 3090");
        ar[1] = new Box(202, "RTX 3080");
        ar[2] = new Box(303, "RTX 3070");
        ar[3] = new Box(404, "RTX 3070 Ti");
        ar[4] = new Box(505, "GeForce RTX 2080");

        // 배열에 번호가 505인 Box를 찾아 그 내용물을 출력하는 반복문
        for (Box e : ar) {
            if (e.getBoxNum() == 505)
                System.out.println(e.toString);
        }
    }
}


/*
출력 결과
GeForce RTX 2080
*/

 결론적으로, 다음 문자에서 변수
e에 저장되는 대상에 대한 정확한
이해만 있으면,

 enhanced for문도 자유롭게
활용할 수 있다.

for (Box e : ar){
    . . . .
}

참고 및 출처

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기