더북(TheBook)

for 문에 레이블 사용

for 문에 레이블로 식별자를 붙일 수 있다. for 문 앞에 콜론(:)으로 끝나는 문자가 있으면 레이블로 인식한다. continue, break, 레이블을 함께 사용하면 반복문을 유연하게 제어할 수 있다.

다음은 2차원 배열인 table에서 값이 x인 요소를 찾는 코드이다.

▼ 레이블을 사용하지 않음

x := 7
table := [][]int{ {1, 5, 9}, {2, 6, 5, 13}, {5, 3, 7, 4} }
found := false
for row := 0; row < len(table); row++ {
    for col := 0; col < len(table[row]); col++ {
        if table[row][col] == x {
            found = true
            fmt.Printf("found %d(row:%d, col:%d)\n", x, row, col)
            break
        }
    }
    if found {
        break
    }
}

실행 결과

found 7(row:2, col:2)

table 배열에서 값이 x인 요소를 찾았는지 확인하기 위해 found 변수를 선언했다. 반복문을 수행하여 값이 x인 요소를 찾으면 foundtrue를 할당하고 found를 출력한다. 이후 found 값이 true면 전체 루프를 종료한다.

레이블을 이용하면 다음과 같이 간단하게 작성할 수 있다.

▼ break에 레이블 사용

x := 7
table := [][]int{ {1, 5, 9}, {2, 6, 5, 13}, {5, 3, 7, 4} }
  
LOOP:
for row := 0; row < len(table); row++ {
    for col := 0; col < len(table[row]); col++ {
        if table[row][col] == x {
            fmt.Printf("found %d(row:%d, col:%d)\n", x, row, col)
            // LOOP로 지정된 for 문을 빠져나옴
            break LOOP
        }
  
    }
}

실행 결과

found 7(row:2, col:2)

Note

컬렉션 데이터 내부 요소에 차례로 접근할 때는 보통 range 키워드를 사용한다. 다음은 조금 전에 소개한 코드를 range로 다시 작성했다.

x := 7
table := [][]int{ {1, 5, 9}, {2, 6, 5, 13}, {5, 3, 7, 4} }
  
LOOP:
for row, rowValue := range table {
    for col, colValue := range rowValue {
        if colValue == x {
            fmt.Printf("found %d(row:%d, col:%d)\n", x, row, col)
            // LOOP로 지정된 for 문을 빠져나옴
            break LOOP
        }
  
    }
}

range 키워드를 사용하여 컬렉션 데이터를 반복 처리하는 방법은 3장 데이터 타입에서 상세히 다룬다.

다음과 같이 continue에도 레이블을 사용할 수 있다.

▼ continue에 레이블 사용

x := 5
table := [][]int{ {1, 5, 9}, {2, 6, 5, 13}, {5, 3, 7, 4} }
  
LOOP:
for row := 0; row < len(table); row++ {
    for col := 0; col < len(table[row]); col++ {
        if table[row][col] == x {
            fmt.Printf("found %d(row:%d, col:%d)\n", x, row, col)
            // LOOP로 지정된 for 문의 다음 반복문 수행
            continue LOOP
        }
  
    }
}

실행 결과

found 5(row:0, col:1)

found 5(row:1, col:2)

found 5(row:2, col:0)

반복문 여러 개가 중첩될 때 레이블을 사용하면 가독성이 높은 코드를 작성할 수 있다.

Note

레이블은 switchselect 문에도 사용할 수 있다. 또한, goto 문과 함께 사용할 수도 있다. 하지만 goto 문은 꼭 필요한 경우가 아니면 사용하지 않는 것을 권장한다.

i := 0
HERE:
fmt.Print(i)
i++
if i == 5 {
    return
}
goto HERE
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.