Go

고(Go) 언어의 'goto' 문, 과연 필요악일까? 제대로 알고 사용하기 위한 모든 것!

드리프트2 2025. 5. 30. 22:59

고(Go) 언어의 'goto' 문, 과연 필요악일까? 제대로 알고 사용하기 위한 모든 것!


'goto' 문, 대체 정체가 뭘까요?

고(Go) 프로그래밍에서 'goto' 문은 현재 실행 중인 함수 내의 다른 곳으로 프로그램의 흐름을 조건 없이 바로 점프시키는 역할을 합니다.

마치 순간이동처럼 코드의 특정 지점으로 바로 이동할 수 있게 해주는 건데요.

일반적으로는 반복문(for)이나 조건문(if)처럼 정해진 구조를 따르는 제어문을 사용하는 것이 권장되지만, 'goto' 문이 어떤 상황에서 유용하게 쓰일 수 있는지 이해하고 있다면 가끔은 도움이 될 수도 있습니다.

하지만 'goto' 문의 사용은 코드의 가독성을 해치고 유지보수를 어렵게 만들 수 있기 때문에, 정말 신중하게 접근해야 하는 기능이기도 합니다.

'goto' 문의 사용법: 문법 살펴보기

고(Go)에서 'goto' 문을 사용하는 문법 자체는 아주 간단합니다.

goto 라벨이름

여기서 라벨이름은 우리가 점프해서 이동하고 싶은 목적지를 표시하는 이름표 같은 것입니다.

이 '라벨'은 코드 내에서 특정 문장 바로 앞에 라벨이름: 형태로 콜론(:)과 함께 정의해줍니다.

라벨이름:
// 이곳으로 점프해서 실행될 코드

생각보다 간단하죠? 하지만 이 간단함 뒤에는 복잡한 함정이 숨어있을 수도 있답니다.

'goto' 문, 이럴 때 써볼 수 있어요! (예제 코드)

'goto' 문이 어떤 상황에서 사용될 수 있는지 가장 흔한 예시 중 하나는 여러 겹으로 중첩된 반복문을 한 번에 빠져나오고 싶을 때입니다.

일반적인 break 문은 가장 안쪽의 반복문 하나만 빠져나오지만, goto를 사용하면 여러 개의 반복문을 한 번에 탈출할 수 있는데요.

아래 예제 코드를 통해 자세히 살펴볼까요?.

package main

import "fmt"

func main() {
    found := false // 특정 조건을 찾았는지 여부를 저장하는 변수
    for i := 0; i < 10; i++ {
        for j := 0; j < 10; j++ {
            if i*j > 50 { // i와 j를 곱한 값이 50보다 크면
                found = true
                goto exitLoops // exitLoops 라벨로 즉시 점프!
            }
        }
    }

exitLoops: // 점프해서 도달할 라벨 지점
    if found {
        fmt.Println("i*j > 50 인 쌍을 찾았습니다!")
    } else {
        fmt.Println("그런 쌍을 찾지 못했습니다.")
    }
}

 

이 예제 코드에서는 ij라는 두 변수를 사용하는 이중 반복문이 있습니다.

만약 i*j의 결과가 50보다 커지는 순간, found 변수를 true로 설정하고 goto exitLoops 문을 통해 exitLoops: 라벨이 붙은 지점으로 프로그램의 흐름이 즉시 이동합니다.

덕분에 두 개의 반복문을 한 번에 빠져나와서 바로 다음 로직을 실행할 수 있게 되는 것이죠.

이런 특정 상황에서는 goto가 코드를 간결하게 만들어주는 것처럼 보일 수도 있습니다.

'goto' 사용 전, 반드시 고려해야 할 점들!

'goto' 문은 중첩된 반복문 탈출이나 복잡한 에러 처리 로직을 단순화하는 데 가끔 유용할 수 있지만, 정말 필요한 경우가 아니라면 사용을 자제하는 것이 좋습니다.

'goto'를 남용하게 되면 코드의 흐름이 이리저리 얽히고설켜서, 마치 스파게티 면처럼 복잡하고 이해하기 어려운 코드가 되어버릴 위험이 큰데요.

이런 코드를 흔히 '스파게티 코드(spaghetti code)'라고 부르며, 프로그래머들 사이에서는 기피 대상 1호로 꼽히기도 합니다.

코드를 읽는 사람이 프로그램의 실행 순서를 따라가기 매우 힘들어지고, 나중에 코드를 수정하거나 기능을 추가할 때 예상치 못한 오류를 발생시킬 가능성도 커집니다.

따라서 대부분의 경우에는 for, if, switch와 같은 구조적인 제어문을 사용하여 프로그램의 흐름을 명확하고 예측 가능하게 만드는 것이 바람직합니다.

마무리하며: 'goto'는 최후의 수단으로!

고(Go) 언어의 goto 문은 분명 함수 내에서 코드의 흐름을 강력하게 제어할 수 있는 기능을 제공합니다.

하지만 그 강력함만큼이나 코드의 가독성과 유지보수성을 해칠 수 있는 위험도 함께 가지고 있다는 점을 항상 기억해야 하는데요.

마치 아주 날카로운 칼처럼, 꼭 필요한 상황에서, 아주 조심스럽게 사용해야 하는 도구라고 생각하는 것이 좋습니다.

대부분의 상황에서는 더 안전하고 이해하기 쉬운 다른 제어 구조를 사용하는 것이 현명한 선택일 것입니다.