[IT-정보] Go 반복문 치트시트: 핵심 문법부터 실전 패턴까지 – 입문 개발자가 꼭 알아야 할 필수 예제 10가지

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

Go 반복문, 왜 제대로 배워야 할까요?

코드를 작성하다 보면 똑같은 작업을 수백, 수만 번 반복해야 하는 순간이 찾아와요. 이때 for 문을 적절히 사용하지 못하면 코드는 금방 지저분해지고 읽기 어려워지지요. 단순히 숫자를 세는 것을 넘어, 복잡한 데이터 구조를 탐색하고 조건에 따라 흐름을 제어하는 능력은 개발자의 실력을 결정짓는 아주 중요한 요소예요.

입문자분들이 가장 많이 겪는 실수 중 하나가 바로 무한 루프에 빠지거나, 슬라이스의 범위를 벗어나 프로그램이 갑자기 종료되는 상황이에요. Go 언어는 다른 언어와 달리 while 문이 따로 없고 오직 for 하나로 모든 반복을 처리해요. 이 점이 처음에는 단순해 보이지만, 상황에 맞는 적절한 패턴을 모르면 오히려 코드가 복잡해질 수 있어요.

이 글은 Go를 처음 접하는 분들이 반복문의 기본기부터 실전 응용까지 한 번에 마스터할 수 있도록 구성했어요. 복잡한 이론보다는 당장 코드에 적용할 수 있는 실용적인 예제 위주로 정리했으니, 필요할 때마다 꺼내 보는 Go 반복문 치트시트로 활용해 보세요.

이 글에서 얻어갈 수 있는 것들

  • 가장 기본적인 3가지 for 문법 구조
  • 데이터를 쉽고 빠르게 훑는 range 활용법
  • 반복 흐름을 제어하는 breakcontinue 사용법
  • 실무에서 자주 쓰이는 무한 루프와 조건부 루프 패턴

반복문을 쓰기 전 꼭 알아야 할 기본 개념

반복문을 배우기 전에 먼저 확인해야 할 것들이 있어요. Go의 for 문은 매우 강력하지만, 조건식을 어떻게 설정하느냐에 따라 프로그램의 성패가 갈려요. 무작정 코드를 치기 전에, 내가 다루려는 데이터가 어떤 형태인지 그리고 어떤 조건에서 반복을 멈출 것인지 명확히 설계하는 습관이 필요해요.

💡 알아두기
Go에는 별도의 while 문이 존재하지 않아요. 모든 반복 로직은 for 키워드 하나로 구현하며, 조건식의 유무에 따라 다양한 형태로 변형하여 사용해요.

반복 유형별 선택 기준

상황에 따라 어떤 방식의 for 문을 쓸지 결정해야 해요. 아래 표를 보고 현재 내 상황에 가장 적합한 유형을 골라보세요.

반복 유형 주요 용도 선택 기준
전통적 for 특정 횟수만큼 반복 인덱스 숫자가 중요할 때
range 활용 슬라이스, 맵 순회 데이터의 값 자체가 필요할 때
조건부 for 특정 조건 만족 시까지 반복 횟수를 예측할 수 없을 때
무한 루프 지속적인 작업 수행 서버 대기 등 종료 시점이 없을 때

반복문 작성 전 체크리스트

코드를 작성하기 전에 스스로에게 다음 세 가지 질문을 던져보세요. 이 질문에 답할 수 있다면 버그 없는 깔끔한 반복문을 만들 수 있어요.

  • 종료 조건이 명확한가?: 조건이 언제 거짓(false)이 되어 반복을 멈출지 결정했나요?
  • 변수가 업데이트되는가?: 반복문 안에서 조건을 변화시키는 변수(예: i++)가 제대로 작동하고 있나요?
  • 데이터 범위 내에 있는가?: 슬라이스나 배열을 다룰 때 인덱스가 범위를 넘어가지 않도록 설계했나요?

실전 Go 반복문 문법과 활용 패턴

이제 본격적으로 Golang의 핵심인 반복문 패턴을 살펴볼게요. 단순히 문법을 외우는 것이 아니라, 각 패턴이 어떤 상황에서 빛을 발하는지 이해하는 것이 중요해요. 실전에서 바로 쓸 수 있도록 단계별로 나누어 정리했습니다.

STEP 1. 클래식한 3단계 제어 방식

가장 기본이 되는 형태예요. 초기화, 조건식, 증감식을 한 줄에 작성하여 흐름을 한눈에 파악할 수 있어요. 주로 정확히 몇 번 반복해야 하는지 알고 있을 때 사용해요.

예를 들어, 1부터 10까지 숫자를 출력하고 싶다면 이렇게 작성해요. for i := 1; i <= 10; i++ 라고 쓰면 되지요. 여기서 i := 1은 시작점, i <= 10은 언제까지 할지, i++는 한 번 돌 때마다 어떻게 변할지를 결정해요. 이 세 요소 중 하나라도 잘못 설정하면 원치 않는 결과가 나오거나 무한 루프에 빠질 수 있으니 주의해야 해요.

STEP 2. 데이터 집합을 위한 range 활용법

슬라이스(Slice)나 맵(Map) 같은 컬렉션을 다룰 때는 range 키워드가 구세주예요. 인덱스를 일일이 계산할 필요 없이 데이터의 처음부터 끝까지 안전하게 훑어줍니다. Go 반복문 예제 중 가장 많이 쓰이는 패턴이기도 하지요.

슬라이스를 순회할 때는 보통 두 가지 값을 반환받아요. 바로 indexvalue예요. 만약 인덱스는 필요 없고 값만 쓰고 싶다면 for _, value := range slice 처럼 언더스코어(_)를 사용해 무시할 수 있어요. 이렇게 하면 코드가 훨씬 깔끔해지고 의도도 명확해져요. 하지만 맵을 사용할 때는 주의할 점이 있어요. 맵의 순회 순서는 매번 달라질 수 있으므로, 순서가 중요한 작업에는 적합하지 않다는 점을 꼭 기억하세요.

STEP 3. 흐름을 바꾸는 break와 continue

반복문 도중 갑자기 멈춰야 하거나, 특정 조건에서만 건너뛰고 싶을 때가 있죠. 이때 사용하는 것이 breakcontinue예요.

  • break: 반복문을 즉시 종료하고 루프 바깥으로 빠져나와요. 예를 들어, 수만 개의 데이터 중 원하는 값을 하나 찾았다면 더 이상 돌 필요가 없으니 break를 호출해 에너지를 아껴야 해요.
  • continue: 이번 차례만 건너뛰고 다음 반복으로 바로 넘어가요. 예를 들어, 리스트에서 짝수만 처리하고 싶다면 홀수일 때 continue를 사용해 아래 코드를 실행하지 않도록 만들 수 있어요.
⚠️ 주의
중첩된 반복문(루프 안에 루프가 있는 경우)에서 break를 쓰면 가장 안쪽의 루프만 탈출해요. 바깥쪽 루프까지 한꺼번에 멈추고 싶다면 별도의 플래그 변수를 사용하거나 구조를 다시 설계해야 해요.

STEP 4. 조건만 사용하는 while 스타일 루프

Go에는 while 문이 없지만, for 문에 조건식만 적어주면 똑같은 역할을 수행해요. for condition { … } 형태죠. 이는 데이터가 들어올 때까지 계속 기다리거나, 특정 상태가 될 때까지 작업을 반복해야 하는 상황에서 아주 유용해요. 상태 값의 변화가 루프 내부에서 반드시 일어나도록 설계해야 무한 루프의 늪에 빠지지 않아요.

STEP 5. 시스템을 돌리는 무한 루프 패턴

마지막으로 for { … } 형태의 무한 루프예요. 조건식 없이 for만 적으면 프로그램은 멈추지 않고 계속 실행돼요. 주로 백그라운드에서 계속 돌아가는 서버 프로세스나, 채널(Channel)로부터 데이터를 기다리는 고루틴(Goroutine) 작업에서 필수적으로 사용되는 패턴이에요. 이 패턴을 쓸 때는 반드시 내부에서 breakreturn을 통해 안전하게 종료할 수 있는 탈출구를 마련해 두는 것이 실무자의 센스랍니다.

💡 알아두기
실무에서는 반복문 안에서 무거운 작업을 할 때, 작업이 끝난 후 적절한 휴식 시간(time.Sleep)을 주어 CPU 점유율이 치솟는 것을 방지하는 것이 좋습니다.

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

자주 하는 실수와 해결법

반복문을 작성할 때 초보자들이 흔히 저지르는 실수들을 모아봤어요. 비슷한 실수를 반복하지 않도록 눈여겨보세요.

  • 인덱스 범위 초과 오류 → 슬라이스의 길이를 len(s)로 가져올 때, 조건식에 i <= len(s)라고 쓰는 경우 발생해요. → ✅ i < len(s)처럼 미만 조건을 사용해야 안전해요.
  • 변수 섀도잉(Shadowing) → 루프 내부에서 새롭게 변수를 선언하여 외부 변수 값이 바뀌지 않는 경우예요. → ✅ 루프 안에서 := 대신 =를 사용하여 기존 변수에 값을 할당하고 있는지 확인하세요.
  • 무한 루프의 늪 → 조건식을 만족하는 변수의 변화가 루프 내부에 없는 경우예요. → ✅ 루프가 한 번 돌 때마다 조건에 영향을 주는 변수가 반드시 업데이트되는지 체크하세요.
  • range 사용 시 값 복사 문제 → 슬라이스의 요소를 수정하려고 할 때 원본이 아닌 복사본을 수정하는 실수예요. → ✅ 값을 수정해야 한다면 range가 제공하는 인덱스를 사용해 slice[i] = newValue 방식으로 접근하세요.
  • 맵(Map) 순서 의존 → 맵의 순서가 항상 일정할 것이라 믿고 로직을 짜는 경우예요. → ✅ 맵은 순서가 보장되지 않으므로, 순서가 중요하다면 별도의 슬라이스에 키를 담아 순회하세요.

자주 묻는 질문

Q. Go에서 while 문은 정말 아예 없나요?

네, 맞아요. 다른 언어에서는 while condition { ... }라고 쓰지만, Go에서는 for condition { ... }라고 쓰면 완전히 똑같이 동작해요. 문법을 하나로 통일해서 단순함을 유지하려는 Go의 철학 때문이지요.

Q. range를 쓸 때 인덱스가 필요 없으면 어떻게 하나요?

언더스코어(_)를 사용하면 돼요. for _, value := range slice와 같이 작성하면 인덱스는 버리고 값만 가져올 수 있어 코드가 훨씬 깔끔해져요.

Q. 반복문 성능을 높이는 팁이 있을까요?

반복 횟수가 아주 많다면, 루프 내부에서 매번 새로운 슬라이스를 생성하거나 큰 메모리를 할당하는 것은 피해야 해요. 가급적 루프 외부에서 미리 공간을 확보(Pre-allocation)해 두는 것이 성능 면에서 훨씬 유리해요.

Q. 무한 루프를 안전하게 멈추려면 어떻게 하나요?

가장 좋은 방법은 특정 채널(Channel)에 신호가 들어오거나, 특정 조건(Flag)이 참이 되었을 때 break를 호출하는 거예요. 시스템 종료 신호를 받는 고루틴이라면 context 패키지를 사용하는 것이 표준적인 방법이에요.

반복문 마스터를 위한 마지막 정리

지금까지 Go 반복문 치트시트를 통해 다양한 패턴과 주의사항을 살펴보았어요. 반복문은 단순해 보이지만, 어떻게 쓰느냐에 따라 코드의 효율성과 안정성이 극명하게 갈리는 부분이에요. 오늘 배운 내용을 잊지 않도록 아래 요약 박스를 꼭 확인해 보세요.

✅ 핵심 요약

  • 모든 반복은 for 키워드 하나로 처리한다.
  • 횟수가 정해진 경우 클래식한 3단계 for 문을 사용한다.
  • 컬렉션 순회는 range를 사용하여 안전하고 깔끔하게 한다.
  • 탈출이 필요할 땐 break, 건너뛸 땐 continue를 적절히 쓴다.
  • 인덱스 범위를 벗어나지 않도록 len() 함수 사용에 주의한다.
  • 무한 루프 사용 시에는 반드시 안전한 종료 조건을 설계한다.

앞으로의 학습 단계

이 글을 다 읽었다면 이제 직접 코드를 쳐볼 차례예요. 다음 단계를 따라 실력을 쌓아보세요.

  • 오늘 할 일: 간단한 슬라이스를 만들고 range를 사용하여 모든 요소를 출력해 보기
  • 이번 주 할 일: 2중 중첩 반복문을 사용하여 구구단 출력 프로그램 만들기
  • 실행 직전 할 일: 실제 프로젝트 코드에서 불필요하게 복잡한 반복문이 있는지 찾아보고 range로 리팩토링해 보기

반복문은 개발의 가장 기초적이면서도 가장 강력한 도구예요. 이 도구를 능숙하게 다룰 수 있게 되면, 더 복잡한 알고리즘과 대규모 시스템 설계로 나아갈 준비가 된 것이랍니다. 공부하시다가 막히는 부분이 있다면 언제든 댓글로 질문을 남겨 주세요. 여러분의 성장을 진심으로 응원합니다!

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

댓글 남기기