Go goto 문 사용법

GolangBeginner
지금 연습하기

소개

분기문과 루프문에 비해 goto 문은 더 유연합니다. 동일한 함수 내에서 무조건적인 점프를 수행할 수 있게 해줍니다. goto는 과도하게 사용될 경우 코드 가독성을 떨어뜨릴 수 있지만, 주요 장점은 유연성에 있습니다. 적절하게 사용하면 프로그램 효율성을 향상시킬 뿐만 아니라 특정 시나리오에서 코드를 더 간결하고 우아하게 만들 수 있습니다.

이 랩에서는 Go 에서 goto 문을 사용하는 기본 사항과 break 문 대체, 루프 구현, 중첩 루프 종료 등 다양한 시나리오에서의 적용 방법을 배우게 됩니다.

지식 포인트:

  • goto의 구문 및 사용법
  • Go 프로그램에서 goto의 실용적인 적용

goto 구문 이해

goto의 구문은 다음과 같습니다.

// Syntax 1: Jumping forward
goto label
...
label: code block

// Syntax 2: Jumping backward
label: code block
goto label

Go 에서 goto는 코드 내에서 앞뒤로 모두 점프할 수 있어 유연성을 제공합니다. 레이블은 프로그램 제어가 점프해야 하는 위치를 식별하는 마커입니다. 레이블은 대소문자를 구분하며, 가독성을 높이기 위해 레이블에 대문자를 사용하는 것이 좋습니다.

참고: 레이블의 선언과 사용은 모두 동일한 함수 내에서 발생해야 합니다.

예시: 간단한 goto 프로그램

goto 사용법을 보여주는 간단한 프로그램을 살펴보겠습니다. 이 예제에서는 프로그램이 특정 줄을 건너뛰고 레이블로 직접 점프합니다.

  1. 다음 명령을 실행하여 goto.go라는 새 Go 파일을 생성합니다.
cd ~/project
touch goto.go
  1. 파일을 열고 다음 코드를 작성합니다.
package main

import "fmt"

func main() {
    fmt.Println(1)  // Prints the number 1
    goto NEXT        // Jumps to the label "NEXT"
    fmt.Println(2)  // This line is skipped
NEXT:
    fmt.Println(3)  // Prints the number 3
}
  • 프로그램은 숫자 1을 출력하는 것으로 시작합니다.
  • 그런 다음 goto NEXT 문을 만나 즉시 NEXT 레이블로 점프합니다.
  • 결과적으로 fmt.Println(2) 줄은 건너뛰고 프로그램은 NEXT 레이블부터 실행을 재개하여 숫자 3을 출력합니다.
  1. 프로그램을 실행합니다.
go run goto.go
  1. 출력을 확인합니다.
1
3

이 간단한 예제는 goto를 사용하여 프로그램 흐름을 간단하게 제어하는 방법을 보여줍니다.

break 문을 goto 문으로 대체하기

특정 상황에서 goto는 루프에서 break 문을 대체하여 특정 조건에 따라 루프를 종료하는 유연성을 제공할 수 있습니다.

예시: goto를 사용하여 루프 종료하기

  1. break_with_goto.go라는 새 Go 파일을 생성합니다.
cd ~/project
touch break_with_goto.go
  1. 파일에 다음 코드를 작성합니다.
package main

import "fmt"

func main() {
    for i := 0; ; i++ {         // An infinite loop
        if i == 10 {            // Condition to exit the loop
            goto END            // Jump to the "END" label
        }
        fmt.Print(i)            // Print the current value of i
    }
END:
    fmt.Println("END")          // Print "END" after exiting the loop
}
  • 프로그램은 for i := 0; ; i++로 무한 루프를 시작합니다.
  • 루프 내부에서 i10과 같은지 확인합니다. 참이면 END 레이블로 점프하여 효과적으로 루프를 종료합니다.
  • 점프하기 전에 0부터 9까지의 i 값을 출력합니다.
  • 루프를 종료한 후 프로그램은 END를 출력합니다.
  1. 프로그램을 실행합니다.
go run break_with_goto.go
  1. 출력을 확인합니다.
0123456789END

이 예제는 goto가 루프에서 break 문을 대체하여 루프를 종료하는 다른 방법을 제공하는 방법을 보여줍니다.

goto 문을 사용하여 for 루프 구현하기

goto는 또한 루프를 수동으로 구현하는 데 사용할 수 있습니다. Go 는 기본 for 루프를 제공하지만, 이 연습은 goto가 루핑 동작을 어떻게 에뮬레이션할 수 있는지 보여줍니다.

예시: goto를 사용한 for 루프

  1. for_loop_with_goto.go라는 새 파일을 생성합니다.
cd ~/project
touch for_loop_with_goto.go
  1. 다음 코드를 작성합니다.
package main

import "fmt"

func main() {
    var i = 0            // Initialize a variable i
BEGIN:
    fmt.Printf("%d ", i) // Print the current value of i
    if i == 9 {          // Check if i has reached 9
        goto END         // Exit the loop if true
    }
    i++                  // Increment i
    goto BEGIN           // Jump back to the label "BEGIN"
END:
}
  • 프로그램은 i0으로 초기화하고 BEGIN 레이블을 사용하여 루프를 시작합니다.
  • i의 값을 출력하고 9에 도달했는지 확인합니다.
  • 그렇지 않은 경우 i를 증가시키고 BEGIN 레이블로 다시 점프하여 프로세스를 반복합니다.
  • i9와 같아지면 프로그램은 END 레이블로 점프하여 루프를 종료합니다.
  1. 프로그램을 실행합니다.
go run for_loop_with_goto.go
  1. 출력을 확인합니다.
0 1 2 3 4 5 6 7 8 9

이 예제는 goto가 루프 구조를 어떻게 모방할 수 있는지 보여줍니다.

goto 문을 사용하여 중첩 루프 탈출하기

break를 사용하여 중첩 루프를 종료하는 것은 일반적으로 추가적인 로직과 변수가 필요하므로 번거로울 수 있습니다. goto는 여러 루프에서 직접 점프할 수 있도록 하여 이 프로세스를 단순화합니다.

예시: goto를 사용하여 중첩 루프 종료하기

  1. nested_loop_with_goto.go라는 새 파일을 생성합니다.
cd ~/project
touch nested_loop_with_goto.go
  1. 다음 코드를 작성합니다.
package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {      // Outer loop
        for j := 0; j < 5; j++ {  // Inner loop
            if j == 3 {           // Exit condition
                goto END          // Jump to the "END" label
            }
            fmt.Println(i, j)     // Print the current values of i and j
        }
    }
END:
}
  • 프로그램은 중첩 루프로 시작합니다: i에 대한 외부 루프와 j에 대한 내부 루프입니다.
  • 내부 루프 내에서 j3과 같은지 확인합니다. 참이면 프로그램은 END 레이블로 점프하여 두 루프를 모두 종료합니다.
  • 결과적으로 프로그램은 j2와 같아질 때까지만 (i, j) 쌍을 출력합니다.
  1. 프로그램을 실행합니다.
go run nested_loop_with_goto.go
  1. 출력을 확인합니다.
0 0
0 1
0 2

이 접근 방식은 여러 break 문이나 플래그를 사용하는 것보다 훨씬 깔끔하며, 특히 깊이 중첩된 루프에서 유용합니다.

다음과 같이 break 문을 사용하여 이 프로그램을 구현하는 경우:

package main

import "fmt"

func main() {
    // Check variable
    var check = false
    // First loop
    for i := 0; i < 5; i++ {
        // Second loop
        for j := 0; j < 5; j++ {
            if j == 3 {
                // Exit the second loop
                check = true
                break
            }
            fmt.Println(i, j)
        }
        // Determine whether to exit the first loop
        if check == true {
            break
        }
    }
}

요약

이 랩에서는 Go 의 goto 문과 그 다양한 응용 분야를 살펴보았습니다. 다음은 우리가 배운 내용입니다.

  • goto 문은 동일한 함수 내의 지정된 레이블로 무조건적인 점프를 허용합니다.
  • break 문을 대체하고, 루프를 구현하며, 중첩 루프를 보다 효율적으로 종료하는 데 사용할 수 있습니다.
  • goto는 유연성과 간결성을 제공하지만, 코드 가독성을 저하시키지 않도록 신중하게 사용해야 합니다.

goto를 효과적으로 이해하고 사용함으로써 프로그램에서 특정 제어 흐름 시나리오를 단순화할 수 있습니다. 그러나 항상 코드의 명확성과 유지 관리성을 위해 노력하십시오!