더북(TheBook)

3.4.4 내포된 루프와 레이블

루프를 내포시켜 사용하는 경우 앞 절에서 본 간단한 break/continue 식은 가장 안쪽에 내포된 루프에만 적용된다. 경우에 따라 더 밖에 있는 루프의 제어 흐름을 변경하고 싶을 때가 있는데, 이를 위해 코틀린은 자바의 임의 레이블과 비슷하지만 약간 다른 문법의 레이블 기능을 제공한다.

어떤 정수 배열 안에 어떤 정해진 순서로 정수가 배열된 하위 배열이 있는지 찾는 함수를 작성하고 싶다고 하자. 이 함수는 문자열의 indexOf()와 비슷한 역할을 한다.

fun indexOf(subarray: IntArray, array: IntArray): Int {
  outerLoop@ for (i in array.indices) {
    for (j in subarray.indices) {
      if (subarray[j] != array[i + j]) continue@outerLoop
    }
    return i
  }
  
  return -1
}

여기서는 바깥쪽 루프에 레이블을 붙이고, 하위 배열의 오프셋을 찾는 과정에서 하위 배열과 배열의 원소가 일치하지 않는다는 사실을 발견하자마자 continue@outerLoop를 사용해 바깥쪽 루프의 현재 이터레이션을 끝내고 다음 이터레이션을 시작한다. 이 지점에서 하위 배열의 나머지 원소를 비교할 필요가 없다는 사실을 알기 때문에 바깥쪽 배열의 다음 오프셋부터 하위 배열 비교를 다시 시작해야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.