Devin.KR

조건과 반복 - If·Select Case·For·Do

개발자KR 조회 0

이 장에서 배우는 것

앞 장에서 변수에 값을 담고 데이터 형식을 구분했다. 이제 값에 따라 실행할 문장을 고르고, 같은 작업을 필요한 만큼 반복한다. 작은 사무실의 비품 대여 프로그램에서는 남은 수량에 따라 대여 가능 여부를 판단하고, 여러 신청을 차례로 처리하며, 반납할 물건이 남아 있는 동안 재고를 갱신해야 한다.

프로그램에서 문장이 실행되는 순서를 제어 흐름(control flow)이라고 한다. 조건문은 이 흐름을 여러 갈래로 나누며, 반복문은 일부 문장을 다시 실행하게 한다. 이번 장에서는 사용자의 입력을 기다리는 대신 미리 정한 작업 순서와 수량을 사용한다. 같은 코드로 실행하면 같은 결과가 나와서 조건과 반복의 움직임을 확인하기 쉽다.

  • If…ElseIf…Else로 조건을 순서대로 검사하고 하나의 처리 경로를 고른다.
  • Select Case로 하나의 값을 여러 값이나 범위와 비교한다.
  • For…Next와 For Each로 횟수 또는 대상에 맞추어 반복한다.
  • Do While과 Do Until로 조건에 따라 반복을 시작하고 끝낸다.
  • Exit와 Continue로 반복을 끝내거나 현재 회차의 남은 작업을 건너뛴다.

문제 상황

사무실에는 노트북이 세 대 있다. 그중 한 대는 이미 대여 중이다. 오늘은 네 건의 신청을 신청 번호 순서대로 처리해야 한다. 두 번째 신청은 취소되었으며, 나머지 신청은 재고가 있는 동안 한 대씩 대여한다. 재고가 떨어지면 이후 신청 처리를 끝낸다.

담당자는 노트북, 프로젝터, 회의용 마이크도 순서대로 점검해야 한다. 점검 대상은 각각 L, P, M이라는 한 글자 코드로 표시한다. 업무 마지막에는 대여 중인 노트북을 한 대씩 반납 처리한다. 반납 처리가 끝나면 대여 중 수량은 0이 되고, 대여 가능 수량은 처음 보유한 세 대가 되어야 한다.

이 사무실의 연체 안내 규칙도 정해져 있다. 연체가 없으면 안내 금액은 0원이다. 연체 일수가 1일부터 3일까지이면 하루 1,000원, 4일부터 7일까지이면 하루 2,000원, 8일 이상이면 하루 3,000원을 적용한다. 이는 예제 사무실의 계산 규칙이며, 실제 서비스의 요금 정책을 뜻하지 않는다.

이 일을 문장만 차례대로 나열해서 처리하려면 신청마다 같은 코드를 복사해야 한다. 재고가 바뀌면 어느 신청을 처리할 수 있는지도 달라진다. 조건문으로 판단을 표현하고 반복문으로 작업 묶음을 실행하면, 처리 규칙을 한곳에서 읽고 바꿀 수 있다.

조건에 따라 실행 경로 고르기

If…ElseIf…Else는 위에서부터 검사한다

조건은 참 또는 거짓으로 판단할 수 있는 식이다. 예를 들어 availableCount > 0은 대여 가능 수량이 0보다 큰지 검사한다. 비교 결과는 앞 장에서 다룬 Boolean 형식의 값이다. If 뒤에는 이처럼 참과 거짓이 분명한 식을 쓴다.

If availableCount = 0 Then
    Console.WriteLine("대여 가능한 노트북이 없다.")
ElseIf availableCount = 1 Then
    Console.WriteLine("마지막 한 대를 대여할 수 있다.")
Else
    Console.WriteLine("두 대 이상을 대여할 수 있다.")
End If

If는 첫 조건부터 검사한다. 첫 조건이 참이면 그 안의 문장을 실행하고 End If 다음으로 이동한다. 첫 조건이 거짓이면 ElseIf의 조건을 검사한다. 어느 조건도 참이 아니면 Else 안의 문장을 실행한다. ElseIf는 여러 개 둘 수 있고, 마지막 기본 처리가 필요하지 않으면 Else를 생략할 수 있다.

중요한 점은 참이 된 갈래 하나만 실행한다는 것이다. 대여 가능 수량이 1이면 첫 조건은 거짓이고 두 번째 조건은 참이다. 따라서 마지막 한 대라는 안내만 출력한다. 여러 If를 따로 쓰면 각각 독립적으로 검사하므로 같은 값에서 출력이 여러 번 나올 수 있다.

조건이 서로 겹치면 순서가 결과를 바꾼다. 수량이 1일 때 availableCount > 0도 참이다. 이 넓은 조건을 먼저 놓으면 뒤에 있는 availableCount = 1까지 도달하지 않는다. 특별한 경우를 먼저 처리하고 일반적인 경우를 뒤에 배치하면 의도를 읽기 쉽다.

If는 조건을 위에서부터 검사하고 처음 참인 갈래 하나만 실행한다

여러 조건을 묶을 때는 AndAlso와 OrElse를 사용할 수 있다. AndAlso는 두 조건이 모두 참이어야 참이며, OrElse는 하나라도 참이면 참이다. 왼쪽 결과만으로 전체 결과가 정해지면 오른쪽 식을 검사하지 않는다. 이번 프로그램은 수량 비교만으로 판단할 수 있어서 조건을 짧게 유지한다.

Select Case는 하나의 값을 분류한다

Select Case는 검사할 값을 한 번 정하고, 각 Case에 적은 값이나 범위와 비교한다. 연체 일수처럼 하나의 수치를 여러 구간으로 분류할 때 적합하다. Case에 적는 To는 양쪽 끝을 모두 포함한다. 따라서 Case 1 To 3에는 1, 2, 3이 들어간다.

Select Case overdueDays
    Case 0
        dailyCharge = 0
    Case 1 To 3
        dailyCharge = 1000
    Case 4 To 7
        dailyCharge = 2000
    Case Is >= 8
        dailyCharge = 3000
    Case Else
        dailyCharge = 0
End Select

Case Is >= 8은 검사할 값이 8 이상일 때 선택된다. 여기서 Is는 Case에서 비교 조건을 적는 문법의 일부다. 여러 특정 값을 같은 처리로 묶으려면 Case 1, 3, 5처럼 쉼표로 구분할 수도 있다.

Select Case도 처음 일치한 갈래 하나만 실행한다. 선택한 Case의 문장을 실행한 뒤에는 End Select 다음으로 이동하며, 바로 아래 Case의 문장을 이어서 실행하지 않는다. Case Else는 앞의 어떤 Case에도 해당하지 않을 때 실행한다.

범위를 설계할 때는 경계값을 직접 확인해야 한다. 이 예제에서는 3 다음이 4이고, 7 다음이 8이므로 양수 구간 사이에 빈틈이 없다. 음수는 Case Else에 해당한다. 완성 코드의 연체 일수는 3으로 고정되어 있지만, 나중에 입력을 받는 프로그램으로 바꾸면 음수를 잘못된 입력으로 처리할 필요가 있다.

예제 사무실의 연체 일수 구간과 안내 금액 계산
연체 일수Case 조건하루 적용 금액계산 예
0일Case 00원0 × 0 = 0원
1~3일Case 1 To 31,000원3 × 1,000 = 3,000원
4~7일Case 4 To 72,000원4 × 2,000 = 8,000원
8일 이상Case Is >= 83,000원8 × 3,000 = 24,000원

횟수와 대상을 기준으로 반복하기

For…Next는 정한 범위를 순서대로 돈다

신청 번호 1부터 4까지 처리하려면 For…Next를 사용한다. 반복 한 번을 회차라고 부르며, 회차마다 바뀌는 번호를 담는 변수를 반복 변수라고 한다. 다음 코드에서 requestNo는 1, 2, 3, 4가 된다. 끝값 4도 포함하므로 본문은 네 번 실행된다.

For requestNo As Integer = 1 To 4
    Console.WriteLine($"신청 {requestNo} 확인")
Next

Step을 생략하면 반복 변수는 1씩 증가한다. For count As Integer = 3 To 1 Step -1처럼 음수 Step을 쓰면 3, 2, 1 순서로 감소한다. 시작값이 끝값보다 큰데 Step이 양수이면 본문은 한 번도 실행되지 않는다. 방향과 범위를 함께 확인해야 한다.

For의 시작값, 끝값, Step은 그 반복문에 들어갈 때 평가된다. 본문에서 다른 변수를 바꾸었다고 이미 시작한 For의 끝값이 계속 다시 계산되는 것은 아니다. 남은 재고처럼 회차마다 바뀌는 값으로 멈추려면 본문에서 조건을 검사하거나 Do 반복문을 사용한다. 반복 변수 자체를 본문에서 바꾸면 Next의 증가와 겹쳐 흐름을 읽기 어려워지므로 이번 예제에서는 변경하지 않는다.

For Each는 대상을 하나씩 꺼낸다

For Each는 번호 범위 대신 반복할 대상에서 값을 하나씩 꺼낸다. 이번 장에서는 문자열 "LPM"을 사용한다. 문자열을 For Each로 읽으면 문자를 차례대로 얻을 수 있다. 문자 하나를 담는 변수의 형식은 Char다.

For Each equipmentCode As Char In "LPM"
    Console.WriteLine(equipmentCode)
Next

이 코드는 L, P, M을 각각 한 줄에 출력한다. 완성 코드에서는 각 문자를 Select Case로 분류해서 비품 이름과 점검 안내를 출력한다. "L"c처럼 문자열 리터럴 뒤에 c를 붙이면 문자 하나를 나타내는 Char 리터럴이 된다. Option Strict On 환경에서 비교 대상의 형식을 분명하게 맞출 수 있다.

For와 For Each는 목적이 다르다. 신청 번호처럼 숫자 범위 자체가 의미 있으면 For가 어울린다. 이미 정해진 대상들을 하나씩 살펴보려면 For Each가 어울린다. For Each가 모든 종류의 대상에서 같은 순서를 보장하는 것은 아니지만, 여기서 사용하는 문자열은 문자 위치 순서대로 읽는다.

조건으로 반복을 유지하고 흐름 바꾸기

Do While과 Do Until은 조건의 뜻이 반대다

Do While은 조건이 참인 동안 반복한다. 반대로 Do Until은 조건이 참이 될 때까지 반복한다. 대여 중 수량이 양수인 동안 반납하려면 Do While borrowedCount > 0을 쓴다. 대여 중 수량이 0이 될 때까지 반납하려면 Do Until borrowedCount = 0을 쓴다. 수량을 한 대씩 줄이고 처음 수량이 음수가 아니라면 두 표현은 같은 작업을 나타낸다.

Do Until borrowedCount = 0
    borrowedCount -= 1
    availableCount += 1
Loop

조건을 Do 옆에 적으면 본문 실행 전에 검사한다. 이미 대여 중 수량이 0이면 본문을 한 번도 실행하지 않는다. Do로 시작하고 끝을 Loop While 조건 또는 Loop Until 조건으로 쓰면 본문을 실행한 뒤 검사하므로 최소 한 번은 실행한다. 반납할 물건이 없는 상태에서 수량을 줄이지 않도록 이번 예제는 앞에서 검사하는 형태를 쓴다.

Do 반복문에서는 조건을 바꾸는 문장이 있는지 확인해야 한다. borrowedCount가 줄어들지 않으면 0에 도달하지 못한다. 이처럼 종료 조건에 도달하지 못하고 계속 실행되는 반복을 무한 반복(infinite loop)이라고 한다. 반복문을 읽을 때는 시작 상태, 계속할 조건, 상태를 바꾸는 문장을 함께 확인한다.

Do Until은 종료 조건이 거짓일 때 본문을 실행하고 바뀐 수량으로 다시 검사한다

Exit는 반복을 끝내고 Continue는 다음 회차로 간다

신청이 취소되었으면 그 신청의 대여 작업을 건너뛰되 다음 신청은 확인해야 한다. 이때 Continue For를 쓴다. Continue For는 현재 회차에서 아래에 남아 있는 문장을 실행하지 않고 Next의 증가 단계로 이동한다.

재고가 0이면 더 이상 신청을 처리할 수 없으므로 Exit For를 쓴다. Exit For는 해당 For 반복문 전체를 끝내고 Next 다음 문장으로 이동한다. Do 반복문에서는 각각 Continue Do와 Exit Do를 사용한다. Continue Do는 다음 반복 여부를 판단하는 지점으로 이동하며, 앞에서 검사하는 Do라면 앞의 조건을 다시 확인한다.

이번 프로그램은 바깥쪽 Do 안에서 작업 번호를 선택하고, 대여 작업 안에서는 For로 신청을 처리한다. 이때 Exit For는 신청 반복만 끝낸다. 바깥 Do까지 끝내지 않는다. 여러 반복문이 들어 있는 구조를 중첩 반복문이라고 하며, Exit For와 Exit Do는 각각 자신을 감싼 가장 안쪽의 해당 종류 반복문을 끝낸다.

Continue를 쓸 때는 건너뛰는 문장에 조건 갱신이 포함되어 있는지도 살펴야 한다. 특히 Do의 번호 증가를 건너뛰면 같은 번호에서 계속 반복할 수 있다. 완성 코드에서는 취소 신청을 건너뛰는 데 Continue For를 사용하므로 번호 증가는 Next가 처리한다.

완성 코드

다음 내용을 Program.vb에 넣는다. Option Strict On을 파일 첫 줄에 두고, 모든 처리를 Module Program의 Sub Main 안에 작성한다. 작업 번호는 1부터 시작해서 대여, 점검, 반납, 종료를 순서대로 선택한다. 화면에 입력 안내를 띄우거나 입력을 기다리는 기능은 넣지 않는다.

Option Strict On

Module Program
    Sub Main()
        Dim totalCount As Integer = 3
        Dim borrowedCount As Integer = 1
        Dim availableCount As Integer = totalCount - borrowedCount
        Dim overdueDays As Integer = 3
        Dim dailyCharge As Integer = 0
        Dim workNumber As Integer = 1

        Console.WriteLine("비품 대여 업무 시작")
        Console.WriteLine($"시작 재고: {availableCount}대")

        If availableCount = 0 Then
            Console.WriteLine("대여 가능한 노트북이 없다.")
        ElseIf availableCount = 1 Then
            Console.WriteLine("마지막 한 대를 대여할 수 있다.")
        Else
            Console.WriteLine("두 대 이상을 대여할 수 있다.")
        End If

        Select Case overdueDays
            Case 0
                dailyCharge = 0
            Case 1 To 3
                dailyCharge = 1000
            Case 4 To 7
                dailyCharge = 2000
            Case Is >= 8
                dailyCharge = 3000
            Case Else
                dailyCharge = 0
        End Select

        Console.WriteLine($"연체 안내 금액: {overdueDays * dailyCharge}원")

        Do While workNumber <= 4
            Select Case workNumber
                Case 1
                    Console.WriteLine("[대여]")
                    For requestNo As Integer = 1 To 4
                        If requestNo = 2 Then
                            Console.WriteLine($"신청 {requestNo}: 취소로 건너뜀")
                            Continue For
                        End If

                        If availableCount = 0 Then
                            Console.WriteLine($"신청 {requestNo}: 재고 부족으로 처리 종료")
                            Exit For
                        End If

                        availableCount -= 1
                        borrowedCount += 1
                        Console.WriteLine($"신청 {requestNo}: 대여 완료, 재고 {availableCount}대")
                    Next

                Case 2
                    Console.WriteLine("[점검]")
                    For Each equipmentCode As Char In "LPM"
                        Select Case equipmentCode
                            Case "L"c
                                Console.WriteLine("L: 노트북 전원 점검")
                            Case "P"c
                                Console.WriteLine("P: 프로젝터 렌즈 점검")
                            Case "M"c
                                Console.WriteLine("M: 회의용 마이크 연결 점검")
                            Case Else
                                Console.WriteLine("등록되지 않은 비품 코드")
                        End Select
                    Next

                Case 3
                    Console.WriteLine("[반납]")
                    Do Until borrowedCount = 0
                        borrowedCount -= 1
                        availableCount += 1
                        Console.WriteLine($"반납 완료: 대여 중 {borrowedCount}대, 재고 {availableCount}대")
                    Loop

                Case 4
                    Console.WriteLine("[종료]")
                    Exit Do
            End Select

            workNumber += 1
        Loop

        Console.WriteLine($"최종 수량: 전체 {totalCount}대, 대여 중 {borrowedCount}대, 재고 {availableCount}대")
    End Sub
End Module

줄별 해설

Option Strict On은 형식이 맞지 않는 값을 암묵적으로 바꾸는 일을 제한한다. Module Program과 Sub Main()은 앞 장에서 사용한 실행 틀이다. 이번 장에서는 별도의 Sub나 Function을 만들지 않고 Main 안에서 흐름을 확인한다.

totalCount는 전체 노트북 수량 3을 담고, borrowedCount는 시작 시 대여 중 수량 1을 담는다. availableCount는 두 값의 차이인 2다. 세 변수는 모두 정수를 담는 Integer 형식이다. 프로그램 안에서는 전체 수량을 바꾸지 않으며, 대여 중 수량과 재고의 합이 전체 수량과 같도록 갱신한다.

overdueDays는 3이고, dailyCharge는 계산 전 값인 0으로 시작한다. workNumber는 다음에 수행할 작업 번호다. 시작 안내 두 줄 뒤의 If는 재고 2를 검사한다. 0과 1에 해당하지 않으므로 Else의 두 대 이상이라는 안내를 출력한다.

첫 Select Case에서는 연체 일수 3이 Case 1 To 3에 해당한다. dailyCharge에 1000을 대입하고 End Select 다음으로 이동한다. 이어지는 출력문의 중괄호 안에서 3과 1000을 곱하므로 3000원이 출력된다. 금액에 자리 구분 형식을 지정하지 않았으므로 출력에는 쉼표가 없다.

Do While workNumber <= 4는 작업 번호가 4 이하일 때 반복한다. 안쪽 Select Case는 번호 1이면 대여, 2이면 점검, 3이면 반납, 4이면 종료를 실행한다. 각 작업이 끝나면 아래의 workNumber += 1이 번호를 하나 늘린다. 다만 종료 작업에서는 Exit Do로 먼저 빠져나오므로 이 증가 문장에 도달하지 않는다.

대여의 For는 신청 번호 1부터 4까지 진행한다. 번호 2를 먼저 검사하는 이유는 취소된 신청이 재고를 사용하지 않도록 하기 위해서다. 이 조건이 참이면 안내를 출력한 뒤 Continue For가 나머지 대여 문장을 건너뛴다. Next는 번호를 3으로 늘리고 다음 회차를 시작한다.

취소가 아닌 신청에서는 재고가 0인지 검사한다. 0이면 안내 후 Exit For로 신청 처리를 끝낸다. 재고가 남아 있으면 availableCount -= 1로 한 대를 빼고 borrowedCount += 1로 대여 중 수량을 한 대 늘린다. -= 1은 현재 값에서 1을 뺀 값을 다시 저장한다는 뜻이다.

점검의 For Each는 L, P, M을 차례대로 equipmentCode에 담는다. 안쪽 Select Case에서 해당 코드의 안내를 출력한다. 점검 작업은 수량을 바꾸지 않는다. Case Else는 목록에 다른 문자가 들어갔을 때 안내할 경로이며, 현재 문자열에서는 실행되지 않는다.

반납의 Do Until은 대여 중 수량이 0인지 먼저 검사한다. 대여 작업 직후에는 3이므로 본문에 들어간다. 본문에서 대여 중 수량을 하나 줄이고 재고를 하나 늘린 뒤 상태를 출력한다. 이 작업을 세 번 실행하면 대여 중 수량이 0이 되고, 다음 검사에서 반복이 끝난다.

종료의 Exit Do는 Select Case를 감싼 바깥 Do를 끝낸다. 반납용 Do는 이미 종료되었으므로 이 지점에서 가장 안쪽의 Do는 작업 선택용 Do다. 마지막 Console.WriteLine은 모든 반복이 끝난 뒤 전체 3대, 대여 중 0대, 재고 3대를 출력한다.

신청을 처리할 때 노트북 수량이 바뀌는 과정
처리 지점실행한 판단재고대여 중
시작전체 3대 중 1대 대여 중2대1대
신청 1재고가 있어 대여1대2대
신청 2취소되어 Continue For1대2대
신청 3재고가 있어 대여0대3대
신청 4재고가 없어 Exit For0대3대
반납 완료세 대를 차례로 반납3대0대

실행 결과

.NET 10 SDK가 설치된 macOS 또는 Linux 터미널에서 다음 명령으로 프로젝트를 만든다. SDK는 프로젝트를 만들고 컴파일하는 데 필요한 개발 도구 모음이다. 생성된 Program.vb를 완성 코드로 교체한 뒤 실행한다.

dotnet new console -lang VB -n OfficeControl
cd OfficeControl
dotnet run

실행 결과는 다음과 같다. 입력을 기다리지 않으며, 종료 안내와 최종 수량을 출력한 뒤 프로그램이 끝난다.

비품 대여 업무 시작
시작 재고: 2대
두 대 이상을 대여할 수 있다.
연체 안내 금액: 3000원
[대여]
신청 1: 대여 완료, 재고 1대
신청 2: 취소로 건너뜀
신청 3: 대여 완료, 재고 0대
신청 4: 재고 부족으로 처리 종료
[점검]
L: 노트북 전원 점검
P: 프로젝터 렌즈 점검
M: 회의용 마이크 연결 점검
[반납]
반납 완료: 대여 중 2대, 재고 1대
반납 완료: 대여 중 1대, 재고 2대
반납 완료: 대여 중 0대, 재고 3대
[종료]
최종 수량: 전체 3대, 대여 중 0대, 재고 3대

출력을 따라갈 때는 대여와 반납에서 수량의 합도 확인한다. 재고와 대여 중 수량을 더하면 어느 처리 지점에서도 3이다. 반복이 끝났다는 사실만 확인하는 것보다, 처리 과정에서 수량 관계가 유지되는지 함께 보는 편이 오류를 찾는 데 도움이 된다.

실무에서 자주 틀리는 것

넓은 조건을 먼저 써서 특별한 경우를 놓친다

다음 코드는 컴파일되지만 재고가 1일 때 일반 안내만 출력한다. 첫 조건에서 이미 참이 되어 ElseIf까지 가지 않기 때문이다.

Dim availableCount As Integer = 1

If availableCount > 0 Then
    Console.WriteLine("대여 가능")
ElseIf availableCount = 1 Then
    Console.WriteLine("마지막 한 대")
End If

특별한 값인 1을 먼저 검사하면 두 안내의 역할을 구분할 수 있다. 서로 겹치는 조건을 읽을 때는 위 조건이 아래 조건을 포함하는지 확인한다.

Dim availableCount As Integer = 1

If availableCount = 1 Then
    Console.WriteLine("마지막 한 대")
ElseIf availableCount > 0 Then
    Console.WriteLine("대여 가능")
End If

Case 범위의 끝값을 겹치게 쓴다

다음 코드에서는 3일이 두 범위에 들어간다. Select Case는 첫 일치만 선택하므로 3일의 금액은 1000이다. 두 번째 범위를 3부터 시작한 의도가 있었다면 기대한 결과와 달라진다.

Select Case overdueDays
    Case 1 To 3
        dailyCharge = 1000
    Case 3 To 7
        dailyCharge = 2000
End Select

범위의 경계를 겹치지 않게 적는다. 코드를 고친 뒤에는 1, 3, 4, 7, 8처럼 각 구간의 시작과 끝을 대입해 어느 Case가 선택되는지 확인한다.

Select Case overdueDays
    Case 1 To 3
        dailyCharge = 1000
    Case 4 To 7
        dailyCharge = 2000
    Case Is >= 8
        dailyCharge = 3000
End Select

Do Until의 조건을 Do While처럼 쓴다

다음 코드에서 대여 중 수량은 2다. 그런데 borrowedCount > 0은 처음부터 참이므로 Do Until은 본문을 실행하지 않고 끝난다. Until 뒤에는 반복을 끝낼 조건을 적어야 한다.

Dim borrowedCount As Integer = 2

Do Until borrowedCount > 0
    borrowedCount -= 1
Loop

반납 완료 상태인 0을 종료 조건으로 쓰면 2에서 1, 1에서 0으로 줄어든다. 같은 처리를 Do While로 쓰고 싶다면 조건을 borrowedCount > 0으로 둔다.

Dim borrowedCount As Integer = 2

Do Until borrowedCount = 0
    borrowedCount -= 1
Loop

취소 신청에서 Exit For를 사용한다

취소된 신청 하나만 건너뛰려는 상황에서 Exit For를 쓰면 이후 신청도 처리하지 않는다. 다음 코드는 신청 1만 출력하고, 신청 2에서 반복을 끝낸다.

For requestNo As Integer = 1 To 4
    If requestNo = 2 Then
        Exit For
    End If
    Console.WriteLine($"신청 {requestNo} 처리")
Next

Continue For로 바꾸면 신청 2의 남은 문장만 건너뛴다. 출력되는 신청 번호는 1, 3, 4다. 종료해야 하는 상황과 한 회차만 제외하는 상황을 구분해서 선택한다.

For requestNo As Integer = 1 To 4
    If requestNo = 2 Then
        Continue For
    End If
    Console.WriteLine($"신청 {requestNo} 처리")
Next

한눈에 보기

조건문과 반복문을 고르는 기준
구문고르는 상황핵심 동작예제의 용도
If…ElseIf…Else서로 다른 조건을 순서대로 판단처음 참인 갈래 실행재고 상태 안내
Select Case하나의 값을 여러 값이나 범위로 분류처음 일치한 Case 실행연체 구간과 작업 번호 선택
For…Next숫자 범위로 반복Step만큼 값을 바꾸며 진행신청 1~4 처리
For Each대상에서 값을 하나씩 확인각 값을 반복 변수에 담아 실행L, P, M 점검
Do While조건이 참인 동안 반복조건이 거짓이면 종료작업 번호 순회
Do Until종료 상태에 도달할 때까지 반복조건이 참이면 종료대여 중 수량을 0으로 변경
Exit For / Exit Do반복 전체를 끝냄해당 반복문 다음으로 이동재고 부족과 업무 종료
Continue For / Continue Do현재 회차의 남은 작업을 생략다음 반복 진행 지점으로 이동취소 신청 제외

조건을 쓰기 전에는 어떤 상태를 나눌지 정하고, 반복을 쓰기 전에는 무엇이 다음 회차로 바뀌는지 정한다. 수량, 번호, 대상 중 어떤 것이 작업을 이끄는지 찾으면 구문 선택이 쉬워진다. 다음 장에서는 이렇게 작성한 처리 묶음을 Sub와 Function으로 나누어 이름을 붙인다.

연습 문제

각 문제는 완성 코드를 기준으로 독립적으로 풀어 본다. 변경하기 전에 결과를 예상하고, 실행 결과와 비교한다. 아래 정답의 코드 조각은 Main 안의 해당 부분에 넣는 내용이다.

  1. 연체 일수를 0, 3, 4, 7, 8로 바꾸면 안내 금액은 각각 얼마인가. 각 값이 선택하는 Case도 적는다.
  2. 완성 코드의 신청 반복에서 취소 번호를 2에서 1로 바꾼다. 신청별 안내와 대여 작업 직후의 재고 및 대여 중 수량을 예상한다.
  3. 3부터 1까지 감소하는 For를 작성한다. 각 회차에서 “점검까지 3초”, “점검까지 2초”, “점검까지 1초”가 차례로 출력되어야 한다.
  4. 작업 번호 1부터 4까지 확인하되 번호 2는 건너뛰고, 번호 4에서는 종료 안내 후 반복을 끝내는 Do While을 작성한다. Continue Do를 사용하며 출력은 “작업 1”, “작업 3”, “작업 종료”여야 한다.

정답과 해설

연체 구간의 경계 확인

0일은 Case 0에 해당하여 0원이다. 3일은 Case 1 To 3에 해당하여 3000원이다. 4일과 7일은 Case 4 To 7에 해당하여 각각 8000원과 14000원이다. 8일은 Case Is >= 8에 해당하여 24000원이다. 하루 적용 금액을 고른 뒤 전체 연체 일수를 곱한다는 점을 확인한다.

취소 신청 번호 변경

신청 1은 취소 안내를 출력하고 건너뛴다. 신청 2는 대여를 완료하여 재고가 1대가 되고, 신청 3은 대여를 완료하여 재고가 0대가 된다. 신청 4는 재고 부족 안내를 출력하고 신청 반복을 끝낸다. 대여 작업 직후에는 재고 0대, 대여 중 3대다. 취소된 번호는 달라도 실제로 대여한 건수는 두 건이므로 최종 반납 결과도 같다.

If requestNo = 1 Then
    Console.WriteLine($"신청 {requestNo}: 취소로 건너뜀")
    Continue For
End If

감소하는 For 작성

시작값을 3, 끝값을 1, Step을 -1로 지정한다. 끝값을 포함하므로 세 줄이 출력된다. 이 코드는 숫자를 출력할 뿐 실제로 1초씩 기다리지는 않는다.

For seconds As Integer = 3 To 1 Step -1
    Console.WriteLine($"점검까지 {seconds}초")
Next

Continue Do 전에 번호 갱신

번호 2에서 Continue Do를 실행하기 전에 번호를 늘려야 한다. 그렇지 않으면 아래쪽 증가 문장을 건너뛰어 번호 2가 계속 유지된다. 번호 4에서는 Exit Do로 반복 전체를 끝낸다.

Dim workNumber As Integer = 1

Do While workNumber <= 4
    If workNumber = 2 Then
        workNumber += 1
        Continue Do
    End If

    If workNumber = 4 Then
        Console.WriteLine("작업 종료")
        Exit Do
    End If

    Console.WriteLine($"작업 {workNumber}")
    workNumber += 1
Loop

번호 1은 출력 후 2가 된다. 번호 2는 3으로 바뀐 뒤 다음 조건 검사로 이동한다. 번호 3은 출력 후 4가 되고, 번호 4에서는 종료 안내만 출력한다. Continue와 Exit가 각각 어디로 이동하는지 문장을 따라가며 확인하면 수량 처리에도 같은 원리를 적용할 수 있다.

댓글 0

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

댓글을 남기려면 로그인이 필요합니다.