[IT-정보] Go 반복문 치트시트: 핵심을 한눈에 – 입문자를 위한 필수 문법과 실전 예제 정리

반복문 for 개념을 시각화한 Go 프로그래밍 일러스트

반복문 작성이 두려운 Go 입문자를 위하여

코드 작성을 시작했는데 화면에 무한 루프가 뜨면서 프로그램이 멈춰버린 경험이 있으신가요? 혹은 슬라이스의 마지막 요소에 접근하려다 index out of range 에러를 마주하고 당황했던 적은 없으신가요? Go 언어를 처음 배우는 분들이 가장 먼저 마주하는 높은 벽 중 하나가 바로 반복문이에요.

다른 언어에서는 while이나 do-while 같은 다양한 반복문을 제공하지만, Go는 아주 단순하게 for 하나로 모든 것을 해결해요. 이 단순함은 강력한 도구가 될 수도 있지만, 익숙하지 않은 상태에서는 오히려 혼란을 줄 수도 있어요. 반복문 하나를 제대로 다루지 못하면 데이터 구조를 다루는 모든 로직이 흔들리게 되거든요.

지금 이 글을 읽고 계신다면, 단순히 문법을 외우는 것을 넘어 실전에서 막힘없이 코드를 짜고 싶어 하는 분들일 거예요. 반복문의 기본 구조부터 시작해서 슬라이스와 맵을 다루는 고급 기술, 그리고 실제 업무에서 자주 마주치는 실수들까지 모두 담았습니다. 이 가이드를 끝까지 따라오시면 더 이상 반복문 때문에 밤을 지새우는 일은 없을 거예요.

이번 가이드에서 핵심적으로 다룰 내용은 다음과 같아요.

  • Go의 유일한 반복문, for 문법의 3가지 기본 형태
  • 슬라이스와 맵을 효율적으로 순회하는 range 활용법
  • 실전에서 바로 써먹는 반복문 제어 패턴과 스니펫
  • 입문자가 가장 많이 하는 실수와 해결책

Go 반복문 시작 전 꼭 알아야 할 기초 지식

Go 언어의 설계 철학은 최소주의예요. 복잡한 기능을 여러 개 만들기보다, 하나의 기능을 제대로 활용하게 만드는 것을 선호하죠. 반복문 역시 마찬가지예요. 다른 프로그래밍 언어에서 사용하는 다양한 반복문 키워드를 찾으려 애쓸 필요가 없어요. 오직 for 키워드 하나만 기억하면 충분해요.

하지만 단순히 for를 안다고 해서 모든 것을 할 수 있는 건 아니에요. Go의 반복문은 사용 방식에 따라 그 역할이 완전히 달라지기 때문이죠. 어떤 상황에서 어떤 스타일의 반복문을 써야 코드가 깔끔해질지 미리 기준을 세워두는 것이 중요해요.

반복문 스타일 선택 기준

상황에 맞는 최적의 반복문을 선택하기 위해 아래 표를 참고해 보세요. 어떤 패턴이 나에게 필요한지 직관적으로 이해할 수 있어요.

반복 방식 주요 특징 적합한 상황
C 스타일 (표준형) 초기값, 조건식, 증감식을 직접 제어 인덱스 기반의 정밀한 제어가 필요할 때
조건식 전용 (while 대용) 특정 조건이 참인 동안 계속 실행 상태 변화에 따라 종료 시점이 정해질 때
Range 활용 (순회형) 데이터 집합의 요소를 하나씩 꺼냄 슬라이스, 맵, 문자열을 훑을 때
💡 알아두기
Go에는 while 문이 따로 존재하지 않아요. 대신 for 문에 조건식만 넣으면 while 문과 똑같이 동작하게 돼요. 이 점을 기억하면 Go의 간결함을 바로 체감할 수 있어요.

반복문을 배우기 전에 반드시 갖춰야 할 기본 개념은 변수의 범위(Scope)제어 흐름이에요. 반복문 안에서 선언된 변수가 반복문이 끝난 뒤에도 살아있는지, 아니면 사라지는지를 명확히 구분해야 해요. 또한 breakcontinue가 코드의 흐름을 어떻게 바꾸는지 미리 머릿속으로 그려보는 연습이 필요해요. 이 준비가 되어 있다면 이제 본격적인 실전 코드로 들어갈 준비가 된 것이에요.

Go 반복문 마스터를 위한 단계별 실전 가이드

이제 본격적으로 Go의 반복문을 뜯어볼게요. 단순히 문법을 보는 게 아니라, 실제 프로젝트에서 어떤 흐름으로 코드가 작성되는지 단계별로 살펴보겠습니다.

STEP 1. 가장 기본적인 C 스타일 반복문

가장 먼저 익혀야 할 패턴은 for i := 0; i < n; i++ 형태예요. 이 방식은 반복의 시작점, 끝나는 조건, 그리고 한 번 반복할 때마다 변화할 값을 직접 통제할 수 있다는 장점이 있어요.

예를 들어, 1부터 10까지의 숫자 중 짝수만 출력하고 싶다면 이렇게 작성할 수 있어요.

💡 알아두기
for i := 0; i < 10; i += 2 { fmt.Println(i) }
여기서 i += 2는 한 번에 두 칸씩 건너뛰게 만들어 짝수만 골라내는 효과를 줘요.

이 방식은 매우 정교해요. 인덱스를 거꾸로 돌리거나(i--), 특정 단계마다 인덱스를 조작하는 작업이 매우 자유롭죠. 하지만 인덱스 숫자를 잘못 계산하면 바로 에러가 발생할 수 있으니 주의가 필요해요.

STEP 2. 조건식만 사용하는 단순 반복 (While 방식)

Go에서는 특정 조건이 만족되는 동안 무한히 실행되는 로직을 짤 때도 for를 사용해요. 다른 언어의 while 문을 그대로 가져온 형태라고 생각하면 편해요.

네트워크 서버에서 데이터를 계속 읽어오거나, 사용자가 특정 명령을 내릴 때까지 프로그램을 실행해야 하는 경우에 주로 사용해요. 예를 들어, 데이터가 들어올 때까지 계속 대기하는 로직은 아래와 같이 작성해요.

for data != nil {
    data = receiveData()
}

이때 무한 루프에 빠지지 않도록 주의해야 해요. 조건식이 절대로 false가 될 수 없는 구조라면 프로그램은 영원히 멈추지 않아요. 반드시 루프 내부에서 조건을 변화시키는 장치가 있어야 해요.

STEP 3. 데이터 집합을 훑는 Range 활용법

실무에서 가장 많이 사용하는 패턴은 바로 range 키워드예요. 슬라이스(Slice), 배열(Array), 맵(Map), 문자열(String) 같은 집합 데이터를 다룰 때 인덱스를 직접 계산할 필요 없이 아주 우아하게 코드를 짤 수 있게 해줘요.

슬라이스를 순회할 때는 보통 두 가지 방식을 써요. 인덱스와 값을 동시에 받는 방식과, 값만 받는 방식이죠.

// 1. 인덱스와 값을 모두 사용하는 경우
for index, value := range slice {
    fmt.Printf("%d번째 요소는 %v입니다.\n", index, value)
}

// 2. 값만 필요한 경우 (인덱스는 '_'로 무시)
for _, value := range slice {
    fmt.Println(value)
}

여기서 언더스코어(\_) 기호는 Go의 아주 중요한 특징이에요. 사용하지 않는 변수를 선언만 하고 쓰지 않으면 컴파일 에러가 나는데, 이때 인덱스를 버리고 싶을 때 이 기호를 사용해요. 맵(Map)을 순회할 때는 key, value 순서로 데이터를 가져온다는 점도 꼭 기억해 두세요.

STEP 4. 흐름을 제어하는 Break와 Continue

반복문을 돌다가 특정 상황에서 탈출하거나, 이번 차례만 건너뛰고 싶을 때가 있죠? 이때 사용하는 것이 breakcontinue예요.

// 예시: 5를 찾으면 즉시 중단
for _, v := range numbers {
    if v == 5 {
        break
    }
}

단순히 멈추는 것을 넘어, 중첩된 루프(반복문 안의 반복문)를 한 번에 빠져나가고 싶을 때는 라벨(Label) 기능을 사용해요. 이는 복잡한 로직을 짤 때 매우 강력한 무기가 됩니다. 라벨을 지정해두면 break LabelName 한 줄로 깊숙한 곳에 있는 루프까지 단숨에 탈출할 수 있어요.

STEP 5. 실전 응용: 복합 로직 시나리오

이제 배운 것들을 하나로 묶어볼까요? 만약 우리가 쇼핑몰의 주문 목록(슬라이스)을 확인하면서, 결제가 완료된 주문(상태값)만 골라내어 배송 준비를 해야 한다고 가정해 볼게요. 그리고 만약 품절된 상품이 발견되면 그 즉시 배송 프로세스를 중단해야 하는 규칙이 있다면?

이런 시나리오는 아래와 같은 흐름으로 구현할 수 있어요.

// 실전 시나리오 예제
for i, order := range orders {
    if order.IsOutOfStock {
        fmt.Println("품절 발생! 프로세스를 중단합니다.")
        break
    }
    if order.IsPaid {
        fmt.Printf("%d번 주문 배송 준비 완료\n", i)
    } else {
        continue
    }
}

이 코드처럼 range로 목록을 돌면서, break로 긴급 중단을 처리하고, continue로 불필요한 연산을 건너뛰는 패턴은 실제 프로덕션 코드에서 매우 흔하게 볼 수 있는 구조예요.

자주 하는 실수와 해결법 및 FAQ

반복문은 논리 구조의 핵심이기 때문에 작은 실수 하나가 프로그램 전체를 망가뜨릴 수 있어요. 고수들도 가끔 하는 실수들을 정리해 드릴게요.

자주 하는 실수와 해결법

실수: 슬라이스 범위를 넘어선 인덱스 접근
왜 발생하는가: 조건식에서 i <= len(slice)와 같이 등호를 잘못 써서 마지막 요소 다음의 빈 공간을 참조하려 할 때 발생해요.
해결법: 항상 i < len(slice)와 같이 미만 조건을 사용하거나, 가급적 range를 사용하여 인덱스 계산 실수를 원천 차단하세요.

실수: 루프 변수 캡처 문제 (Goroutine 관련)
왜 발생하는가: Go의 for range 문에서 사용하는 인덱스나 값 변수는 매 루프마다 새로 생성되는 것이 아니라 재사용되는 경우가 많아요. 이를 고루틴(Goroutine) 안에서 그대로 사용하면 모든 고루틴이 마지막 값만 참조하는 비극이 생겨요.
해결법: 루프 안에서 변수를 명시적으로 복사하거나, Go 1.22 버전 이상을 사용하고 있다면 개선된 루프 변수 동작 방식을 확인하세요.

실수: 무한 루프의 늪
왜 발생하는가: while 스타일의 반복문에서 조건식을 변화시키는 코드를 누락했을 때 발생해요.
해결법: 루프 본문 내부에 반드시 조건식을 false로 만들 수 있는 증감식이나 상태 변경 코드가 있는지 검토하세요.

실수: 맵(Map) 순회 순서의 오해
왜 발생하는가: 맵은 순서가 없는 데이터 구조예요. range를 돌릴 때마다 결과 순서가 매번 달라질 수 있어요.
해결법: 만약 일정한 순서로 데이터를 출력해야 한다면, 키(Key)들을 별도의 슬라이스에 담아 정렬한 뒤 그 슬라이스를 기반으로 맵을 조회하세요.

자주 묻는 질문

Q. Go에는 while 문이 정말 없나요?
네, 없습니다. 대신 for 문에 조건식만 적으면 똑같은 역할을 수행합니다. 문법을 단순화하기 위한 Go의 의도적인 설계예요.

Q. range를 쓸 때 왜 인덱스를 안 쓰면 에러가 나나요?
Go는 사용하지 않는 변수를 허용하지 않기 때문이에요. 인덱스가 필요 없다면 반드시 _ (언더스코어)를 사용하여 사용하지 않겠다는 의사를 명확히 표시해야 합니다.

Q. 중첩된 반복문을 한 번에 탈출하는 가장 깔끔한 방법은 무엇인가요?
가장 추천하는 방법은 라벨(Label)을 사용하는 것입니다. 반복문 시작 전에 이름을 붙여두면, 깊은 단계에서도 이름만 불러서 즉시 탈출할 수 있어 코드가 훨씬 명확해져요.

Q. for 문 안에서 return을 쓰면 어떻게 되나요?
return은 반복문만 끝내는 게 아니라, 해당 반복문이 포함된 함수 전체를 종료하고 값을 반환합니다. 단순히 반복만 멈추고 싶다면 break를 사용해야 해요.

반복문 정복을 위한 마지막 체크리스트

오늘 우리는 Go의 유일한 반복문인 for의 모든 것을 살펴보았습니다. 처음에는 복잡해 보일 수 있지만, 몇 가지 패턴만 익숙해지면 이보다 강력하고 간결한 도구는 없을 거예요. 마지막으로 오늘 배운 내용을 머릿속에 정리해 보세요.

✅ 핵심 요약

  • for 키워드 하나로 모든 반복을 처리할 수 있어요.
  • 정밀한 제어가 필요할 땐 C 스타일을 사용하세요.
  • 데이터 집합을 다룰 땐 range가 가장 효율적이고 안전해요.
  • 사용하지 않는 인덱스는 반드시 _로 처리해야 에러가 나지 않아요.
  • 중첩 루프 탈출은 라벨(Label)을 활용하면 깔끔합니다.
  • 무한 루프를 방지하기 위해 조건 변화를 항상 체크하세요.

자, 이제 이론은 충분합니다. 이제 직접 키보드를 잡고 코드를 쳐볼 시간이에요. 오늘 배운 내용을 바탕으로 아래의 작은 과제를 직접 수행해 보세요. 눈으로 보는 것과 직접 타이핑하는 것은 완전히 다른 차원의 학습이니까요.

오늘 바로 실행해 볼 과제

  • 1부터 100까지의 숫자 중 3의 배수만 출력하는 코드 작성하기
  • 슬라이스에 들어있는 이름 목록을 range를 사용해 하나씩 출력하기
  • 특정 단어가 포함된 경우 반복문을 즉시 멈추는 로직 구현하기

이 과정에서 막히는 부분이 있다면 주저하지 말고 댓글로 질문을 남겨 주세요. 여러분의 성장을 위해 언제든 답변해 드릴 준비가 되어 있습니다. Go 프로그래밍의 세계에 오신 것을 환영해요!

함께 읽으면 좋은 글: Go 반복문 완전 정복 가이드

댓글 남기기