
반복문이 없다고요? Go의 유일한 반복문으로 정복하기
다른 언어를 배우다가 Go(Golang)를 처음 접하면 당황스러운 순간이 찾아와요. 파이썬의 while이나 자바의 do-while 같은 다양한 반복문을 찾으려 애쓰지만, 정작 코드 창에는 for 하나뿐이기 때문이에요. 처음에는 “어떻게 저것 하나로 모든 걸 다 하라는 거지?”라는 의문이 들 수도 있어요.
하지만 Go의 설계 철학을 이해하면 생각이 달라져요. 복잡한 문법을 늘리는 대신, 단 하나의 강력한 도구를 완벽하게 다루는 데 집중하게 만들거든요. 이 단순함은 오히려 코드를 읽기 쉽게 만들고, 개발자가 반복문의 논리 자체에 더 집중하게 도와줘요. Go 반복문 치트시트를 통해 이 단순함 속에 숨겨진 강력한 힘을 경험해 보세요.
이 글을 끝까지 읽고 나면 여러분은 다음과 같은 능력을 갖추게 돼요.
- 기본적인 3단계 구성의 for 루프를 자유자재로 작성할 수 있어요.
while문이 없는 Go에서 조건을 활용해 반복을 제어하는 법을 익혀요.- 슬라이스(Slice)나 맵(Map)을 효율적으로 순회하는
range사용법을 마스터해요. - 실무에서 자주 발생하는 반복문 실수와 그 해결책을 바로 적용할 수 있어요.
반복문을 쓰기 전 반드시 챙겨야 할 기초 지식
반복문을 작성하기 전에 우리가 먼저 정리해야 할 개념들이 있어요. 무턱대고 코드를 치기 시작하면 무한 루프에 빠지거나, 엉뚱한 메모리 공간을 건드리는 실수를 범하기 쉬워요. 특히 Go는 타입에 엄격하기 때문에 반복문의 제어 변수가 어떤 타입인지, 그리고 조건식이 명확하게 bool 값을 반환하는지 확인하는 과정이 꼭 필요해요.
반복문을 구성하는 핵심 요소는 크게 세 가지예요. 첫째는 반복을 시작하기 전 변수를 초기화하는 초기화 문(init), 둘째는 매 반복이 끝날 때마다 실행되는 후속 문(post), 셋째는 언제 멈출지를 결정하는 조건 문(condition)이에요. 이 세 가지가 어떻게 맞물려 돌아가는지를 이해하는 것이 공부의 시작이에요.
Go에서는 변수의 생명 주기가 매우 중요해요. for 문 안에서 선언된 변수는 해당 반복문 블록이 끝나는 순간 사라진다는 점을 꼭 기억해 두세요.
어떤 방식의 반복문이 지금 내 상황에 가장 적합할지 아래 표를 통해 먼저 판단해 보세요.
| 반복 방식 | 주요 특징 | 추천 상황 |
|---|---|---|
| 표준 for 루프 | 초기화, 조건, 증감을 한 줄에 작성 | 횟수가 정해진 반복 작업 |
| 조건식 for 루프 | 조건문만 남겨두어 while처럼 활용 | 특정 조건이 충족될 때까지 반복 |
| for-range 루프 | 컬렉션의 인덱스와 값을 자동으로 추출 | 배열, 슬라이스, 맵을 순회할 때 |
| 무한 루프 | 조건 없이 계속 실행 | 서버 대기 상태나 비동기 작업 |
이처럼 Go는 상황에 따라 for 문의 모양을 변형해서 사용해요. 형식이 다르다고 해서 별개의 문법이 아니라, 하나의 문법을 목적에 맞게 변형하는 것이라고 생각하면 훨씬 이해하기 편할 거예요.
실전에서 바로 쓰는 Go 반복문 패턴 5단계
이제 본격적으로 코드를 작성해 볼 시간이에요. 단순히 문법을 외우는 것보다, 각 패턴이 실제 프로그램에서 어떻게 활용되는지 흐름을 파악하는 것이 중요해요. Go 반복문 예제를 통해 하나씩 살펴볼게요.
STEP 1. 정석적인 3단계 for 루프 활용하기
가장 기본이 되는 형태예요. 숫자를 일정 횟수만큼 반복하거나, 특정 범위 내에서 숫자를 증가시키며 작업할 때 사용해요. 구조는 for 초기값; 조건식; 증감식 순서로 진행돼요.
증감식 부분에는
i++ 외에도 i += 2와 같이 원하는 만큼의 간격을 지정할 수 있어요.예를 들어 1부터 10까지의 숫자를 출력하는 코드는 다음과 같아요.
// 1부터 10까지 출력하는 기본 예제예요
for i := 1; i <= 10; i++ {
fmt.Println(i)
}
여기서 i := 1은 시작점이고, i <= 10은 끝나는 시점이며, i++는 한 단계씩 나아가는 방법이에요. 이 세 요소 중 하나라도 빠지면 문법 오류가 발생하거나 의도치 않은 결과가 나올 수 있으니 주의하세요.
STEP 2. 조건문만 사용하는 while 스타일 루프
Go에는 while 키워드가 없지만, 당황할 필요 없어요. for 문에서 초기화와 증감식을 생략하고 조건식만 남겨두면 그것이 바로 while 문이 돼요. 특정 상태가 변할 때까지 계속해서 무언가를 수행해야 할 때 유용해요.
// 특정 조건이 만족될 때까지 반복하는 예제예요
count := 0
for count < 5 {
fmt.Println("현재 카운트:", count)
count++ // 조건을 변화시키는 코드가 반드시 필요해요
}
이 패턴을 쓸 때 가장 조심해야 할 점은 조건을 변화시키는 코드를 빼먹는 것이에요. 만약 count++를 작성하지 않는다면, 조건은 영원히 참(true)이 되어 프로그램이 멈추지 않는 무한 루프에 빠지게 돼요.
STEP 3. 제어문을 이용한 루프 흐름 조절
반복문을 돌다 보면 중간에 멈춰야 하거나, 이번 차례만 건너뛰고 싶을 때가 있죠? 이때 사용하는 것이 break와 continue예요. break는 반복문을 즉시 탈출하고, continue는 현재 단계의 나머지 코드를 무시하고 다음 반복으로 바로 넘어가는 역할을 해요.
// break와 continue를 섞은 실전 예제예요
for i := 1; i <= 10; i++ {
if i % 2 == 0 {
continue // 짝수일 때는 아래 코드를 실행하지 않고 건너뛰어요
}
if i > 7 {
break // 7보다 커지면 반복문을 완전히 종료해요
}
fmt.Println("홀수 출력:", i)
}
이런 제어문은 복잡한 비즈니스 로직을 구현할 때 코드의 가독성을 높여주는 핵심 도구예요. 하지만 너무 남발하면 코드의 흐름을 추적하기 어려워지니 적절히 사용하는 지혜가 필요해요.
STEP 4. range를 이용한 컬렉션 순회하기
Go 개발자가 가장 많이 사용하는 패턴 중 하나가 바로 for-range예요. 슬라이스, 배열, 맵과 같은 데이터 집합을 하나씩 꺼내올 때 사용하는데, 인덱스(번호)와 값(데이터)을 동시에 얻을 수 있어 매우 편리해요.
// 슬라이스의 요소를 하나씩 꺼내는 예제예요
fruits := []string{"사과", "배", "포도"}
for index, value := range fruits {
fmt.Printf("%d번째 과일: %s\n", index, value)
}
만약 인덱스가 필요 없고 값만 필요하다면, _(언더스코어)를 사용하여 인덱스를 무시할 수 있어요. 이는 Go의 철저한 타입 체크와 변수 사용 규칙을 따르는 아주 깔끔한 방법이에요.
STEP 5. 실전 시나리오: 데이터 필터링하기
마지막으로 배운 모든 것을 조합한 실전 시나리오를 살펴볼게요. 숫자로 이루어진 슬라이스에서 특정 점수 이상의 합계를 구하는 로직을 짜볼까요?
// 70점 이상의 점수만 골라 합계를 구하는 시나리오예요
scores := []int{45, 88, 72, 90, 55, 63, 95}
total := 0
passedCount := 0
for _, score := range scores {
if score >= 70 {
total += score
passedCount++
}
}
fmt.Printf("합격자 수: %d명, 합격자 총점: %d점\n", passedCount, total)
이 짧은 코드 안에는 range로 데이터를 가져오고, if로 조건을 검사하며, 변수에 결과값을 누적하는 실무적인 흐름이 모두 담겨 있어요. 이러한 패턴만 익혀두어도 웬만한 데이터 처리 로직은 모두 구현할 수 있어요.
자주 하는 실수와 해결법 + FAQ
코드를 작성하다 보면 누구나 실수를 해요. 특히 Go의 반복문은 단순해 보이지만, 내부 동작 원리를 모르면 예상치 못한 버그를 만날 수 있어요. 자주 발생하는 사례를 정리했으니 꼭 체크해 보세요.
- ❌ 실수:
for문 안에서 조건 변수를 업데이트하지 않음
➡️ 왜 발생하는가:while스타일로 작성할 때 증감식을 깜빡하기 때문이에요.
✅ 해결법: 반복문 내부에서 반드시 조건식을false로 만들 수 있는 코드가 있는지 확인하세요. - ❌ 실수:
range루프에서 인덱스 범위를 직접 조작함
➡️ 왜 발생하는가: 기존의for i := 0...방식에 익숙해서 생기는 문제예요.
✅ 해결법:range를 쓸 때는 인덱스를 직접 수정하기보다range가 주는 값을 그대로 믿고 사용하세요. - ❌ 실수: 슬라이스를 순회하면서 동시에 슬라이스 요소를 삭제함
➡️ 왜 발생하는가: 반복 도중 데이터의 길이가 변하면서 인덱스가 어긋나기 때문이에요.
✅ 해결법: 뒤에서부터 거꾸로 순회하거나, 삭제할 요소를 따로 모아두었다가 나중에 처리하세요. - ❌ 실수:
range에서 가져온 변수의 주소값을 계속 저장함
➡️ 왜 발생하는가: Go의range는 반복할 때마다 동일한 변수의 값을 업데이트하기 때문이에요.
✅ 해결법: 루프 내부에서 새로운 변수를 선언하여 값을 복사해 두세요. - ❌ 실수: 무한 루프를 돌다가 탈출 조건을 잘못 설정함
➡️ 왜 발생하는가: 경계값(Boundary value) 처리가 미흡하기 때문이에요.
✅ 해결법:<를 쓸지<=를 쓸지 결정할 때, 0부터 시작하는지 1부터 시작하는지 명확히 하세요.
자주 묻는 질문
Q. Go에서 while 문을 쓰고 싶은데 가장 좋은 방법이 무엇인가요?
가장 권장되는 방법은 for 조건식 { ... } 형태를 사용하는 거예요. Go의 설계 의도 자체가 for 하나로 모든 반복을 처리하도록 되어 있기 때문에, 이 방식이 가장 Go답고(idiomatic) 깔끔한 코드가 됩니다.
Q. for-range를 쓸 때 인덱스가 필요 없으면 어떻게 하나요?
for _, value := range slice와 같이 인덱스 자리에 언더스코어(_)를 넣어주면 돼요. Go는 선언된 변수를 사용하지 않으면 컴파일 에러를 내기 때문에, 이 기호는 "이 값은 가져오되 쓰지는 않겠다"라는 명확한 의사표시가 됩니다.
Q. 무한 루프를 만드는 가장 간단한 방법은 무엇인가요?
단순히 for { ... }라고만 쓰면 돼요. 조건식 부분을 통째로 비워두면 Go는 이를 항상 참인 상태로 인식하여 무한히 반복합니다. 이 안에서 반드시 break나 return을 통해 빠져나갈 길을 만들어 두어야 해요.
Q. break와 continue의 차이가 정확히 무엇인가요?
break는 반복문이라는 상자 자체를 박차고 나가는 것이고, continue는 현재 진행 중인 한 번의 바퀴(iteration)만 건너뛰고 바로 다음 바퀴를 시작하는 거예요. 비유하자면 break는 게임 종료, continue는 이번 턴 스킵이라고 볼 수 있어요.
핵심 요약과 다음 단계
오늘 배운 내용을 잊지 않도록 마지막으로 정리해 드릴게요. 이 리스트만 머릿속에 넣어두어도 Go 반복문 활용 능력은 충분해요.
- Go에는 오직
for문 하나만 존재하며, 이를 변형해서 사용해요. - 기본 3단계(초기값; 조건; 증감)를 익히면 모든 횟수 제한 반복이 가능해요.
while기능은 조건식만 남긴for문으로 완벽히 대체돼요.- 컬렉션 순회에는
for-range를 사용하는 것이 가장 안전하고 편리해요. break는 탈출,continue는 건너뛰기라는 점을 명심하세요.- 반복문 내 변수 생명 주기와
range변수 재사용 주의점을 기억하세요.
이제 이론은 충분해요. 직접 코드를 쳐보는 것만이 진짜 내 실력이 되는 유일한 길이에요. 지금 바로 터미널을 열고 아래의 미션을 수행해 보세요.
- 오늘 할 일: 1부터 100까지 숫자 중 3의 배수만 출력하는 코드를 작성해 보세요.
- 이번 주 할 일: 슬라이스에 담긴 문자열들을
range로 순회하며 각 문자열의 길이를 출력하는 프로그램을 만들어 보세요. - 실행 직전 할 일: 무한 루프를 만들고
if문과break를 사용해 특정 조건에서 멈추게 하는 연습을 해보세요.
Go 프로그래밍의 세계는 무궁무진해요. 반복문을 정복했다면, 다음으로는 데이터를 효율적으로 담는 슬라이스와 맵(Slice & Map)을 깊게 파고들어 보는 것을 추천드려요. 공부하다가 막히는 부분이 있다면 언제든 댓글로 질문을 남겨 주세요. 여러분의 성장을 진심으로 응원할게요!
관련된 더 깊은 내용이 궁금하다면 Go 반복문 완전 정복 가이드 글과 함께 읽어 보시는 것을 추천해요.