소개
분기문과 루프문에 비해 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 사용법을 보여주는 간단한 프로그램을 살펴보겠습니다. 이 예제에서는 프로그램이 특정 줄을 건너뛰고 레이블로 직접 점프합니다.
- 다음 명령을 실행하여
goto.go라는 새 Go 파일을 생성합니다.
cd ~/project
touch goto.go
- 파일을 열고 다음 코드를 작성합니다.
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을 출력합니다.
- 프로그램을 실행합니다.
go run goto.go
- 출력을 확인합니다.
1
3
이 간단한 예제는 goto를 사용하여 프로그램 흐름을 간단하게 제어하는 방법을 보여줍니다.
break 문을 goto 문으로 대체하기
특정 상황에서 goto는 루프에서 break 문을 대체하여 특정 조건에 따라 루프를 종료하는 유연성을 제공할 수 있습니다.
예시: goto를 사용하여 루프 종료하기
break_with_goto.go라는 새 Go 파일을 생성합니다.
cd ~/project
touch break_with_goto.go
- 파일에 다음 코드를 작성합니다.
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++로 무한 루프를 시작합니다. - 루프 내부에서
i가10과 같은지 확인합니다. 참이면END레이블로 점프하여 효과적으로 루프를 종료합니다. - 점프하기 전에
0부터9까지의i값을 출력합니다. - 루프를 종료한 후 프로그램은
END를 출력합니다.
- 프로그램을 실행합니다.
go run break_with_goto.go
- 출력을 확인합니다.
0123456789END
이 예제는 goto가 루프에서 break 문을 대체하여 루프를 종료하는 다른 방법을 제공하는 방법을 보여줍니다.
goto 문을 사용하여 for 루프 구현하기
goto는 또한 루프를 수동으로 구현하는 데 사용할 수 있습니다. Go 는 기본 for 루프를 제공하지만, 이 연습은 goto가 루핑 동작을 어떻게 에뮬레이션할 수 있는지 보여줍니다.
예시: goto를 사용한 for 루프
for_loop_with_goto.go라는 새 파일을 생성합니다.
cd ~/project
touch for_loop_with_goto.go
- 다음 코드를 작성합니다.
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:
}
- 프로그램은
i를0으로 초기화하고BEGIN레이블을 사용하여 루프를 시작합니다. i의 값을 출력하고9에 도달했는지 확인합니다.- 그렇지 않은 경우
i를 증가시키고BEGIN레이블로 다시 점프하여 프로세스를 반복합니다. i가9와 같아지면 프로그램은END레이블로 점프하여 루프를 종료합니다.
- 프로그램을 실행합니다.
go run for_loop_with_goto.go
- 출력을 확인합니다.
0 1 2 3 4 5 6 7 8 9
이 예제는 goto가 루프 구조를 어떻게 모방할 수 있는지 보여줍니다.
goto 문을 사용하여 중첩 루프 탈출하기
break를 사용하여 중첩 루프를 종료하는 것은 일반적으로 추가적인 로직과 변수가 필요하므로 번거로울 수 있습니다. goto는 여러 루프에서 직접 점프할 수 있도록 하여 이 프로세스를 단순화합니다.
예시: goto를 사용하여 중첩 루프 종료하기
nested_loop_with_goto.go라는 새 파일을 생성합니다.
cd ~/project
touch nested_loop_with_goto.go
- 다음 코드를 작성합니다.
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에 대한 내부 루프입니다. - 내부 루프 내에서
j가3과 같은지 확인합니다. 참이면 프로그램은END레이블로 점프하여 두 루프를 모두 종료합니다. - 결과적으로 프로그램은
j가2와 같아질 때까지만(i, j)쌍을 출력합니다.
- 프로그램을 실행합니다.
go run nested_loop_with_goto.go
- 출력을 확인합니다.
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를 효과적으로 이해하고 사용함으로써 프로그램에서 특정 제어 흐름 시나리오를 단순화할 수 있습니다. 그러나 항상 코드의 명확성과 유지 관리성을 위해 노력하십시오!



