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

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

반복문 for, 왜 Go에서는 이것 하나면 충분할까요?

새로운 프로그래밍 언어를 배울 때 가장 먼저 마주하는 난관 중 하나가 바로 반복문이에요. Python에서는 forwhile이 나뉘어 있고, Java나 C 계열에서는 복잡한 조건식을 넣는 방식이 익숙하실 거예요. 하지만 Go 언어를 처음 펼쳤을 때 가장 당혹스러운 점은 오직 for 하나만 존재한다는 사실이에요. “어떻게 while 문 없이 모든 반복을 처리하라는 거지?”라는 의문이 드는 것은 지극히 자연스러운 현상이에요.

실제로 많은 입문 개발자가 Go의 단순함에 매료되다가도, 막상 실전 코드를 짜려고 하면 반복문의 조건식을 어떻게 구성해야 할지 몰라 헤매곤 해요. 단순히 숫자를 세는 것부터 시작해서, 슬라이스의 요소를 하나씩 꺼내고, 복잡한 맵(Map) 데이터를 순회하는 과정까지 모두 for라는 하나의 틀 안에서 해결해야 하기 때문이에요. 이러한 단순함은 언어의 설계 철학인 간결함을 반영하지만, 숙련되기 전까지는 오히려 사고의 확장을 방해하는 요소가 될 수도 있어요.

이 글은 Go의 반복문 구조가 낯선 입문자들을 위해 준비한 Go 반복문 치트시트예요. 복잡한 이론보다는 실제 프로젝트에서 바로 써먹을 수 있는 문법과 패턴 위주로 구성했어요. 이 글을 끝까지 읽고 나면, 어떤 반복 상황에서도 당황하지 않고 가장 효율적인 for 문을 선택할 수 있는 능력을 갖추게 될 거예요.

💡 알아두기
Go는 다른 언어와 달리 별도의 while 키워드가 없어요. 모든 반복 로직은 for 키워드 하나로 통합되어 구현됩니다.

오늘 우리가 함께 살펴볼 핵심 내용은 다음과 같아요.

  • 기본적인 3단계 구성의 표준 for 문법
  • while 문을 대체하는 Go만의 간결한 방식
  • 슬라이스와 맵을 위한 range 문법 활용법
  • 실전에서 자주 발생하는 실수와 해결 전략

효율적인 반복문 작성을 위한 사전 지식

Go의 반복문을 제대로 다루기 위해서는 단순히 문법을 외우는 것보다 언어가 반복을 바라보는 관점을 이해하는 것이 훨씬 중요해요. Go 설계자들은 프로그래머가 너무 많은 키워드를 배우지 않도록 의도적으로 반복문을 통합했어요. 이는 코드의 가독성을 높여주지만, 반대로 말하면 한 가지 도구로 모든 문제를 해결해야 한다는 뜻이기도 해요.

반복문을 작성하기 전에 반드시 체크해야 할 기준은 세 가지예요. 첫째, 반복의 횟수가 명확히 정해져 있는가? 둘째, 특정 조건이 만족될 때까지 계속해야 하는가? 셋째, 데이터 집합(슬라이스, 맵 등)을 순회해야 하는가? 이 질문에 대한 답에 따라 여러분이 선택해야 할 for 문의 형태가 완전히 달라져요.

아래 표를 통해 상황별로 어떤 방식의 반복문을 선택해야 할지 비교해 보세요.

상황 및 목적 권장되는 방식 주요 특징
정해진 횟수만큼 반복 (예: 1부터 10까지) 표준 for 문 초기화, 조건, 증감식을 한 번에 관리
조건이 참인 동안 계속 실행 (while 대용) 조건식만 있는 for 문 조건식 하나로 흐름을 제어
슬라이스나 배열의 모든 요소 순회 range for 문 인덱스와 값을 동시에 안전하게 추출
무한 반복 또는 복잡한 탈출 조건 무한 for 문 break나 return으로 명시적 종료 필요

반복문을 설계할 때 가장 흔히 하는 실수는 불필요하게 복잡한 조건식을 만드는 것이에요. 예를 들어 슬라이스의 요소를 하나씩 확인할 때는 직접 인덱스를 계산하는 표준 for 문보다는 range를 사용하는 것이 훨씬 안전하고 가독성이 좋아요. 인덱스 계산 과정에서 발생하는 ‘하나 차이 오류(Off-by-one error)’를 원천적으로 차단할 수 있기 때문이에요.

💡 알아두기
Go의 반복문은 성능 면에서 매우 최적화되어 있어요. 복잡한 추상화 계층이 없기 때문에 저수준 제어가 필요한 시스템 프로그래밍에서도 강력한 힘을 발휘합니다.

이제 기본 준비가 끝났다면, 실제 코드가 어떻게 작성되는지 단계별로 깊이 있게 파헤쳐 볼까요?

Go 반복문의 모든 것: 단계별 실전 활용법

이제 본격적으로 Go 반복문 치트시트의 핵심인 실전 문법을 다뤄볼게요. 단순히 코드를 따라 치는 것이 아니라, 각 방식이 어떤 상황에서 가장 빛을 발하는지 그 맥락을 이해하는 것이 목표예요.

STEP 1. 기본 중의 기본, 표준 3단계 for 문

C나 Java를 경험해 보셨다면 가장 익숙할 형태예요. 초기화 식, 조건 식, 증감 식이라는 세 가지 요소를 세미콜론(;)으로 구분하여 한 줄에 작성해요. 이 방식은 반복 횟수를 아주 세밀하게 조정해야 할 때 유용해요.

예를 들어, 숫자를 2씩 건너뛰며 더하거나, 특정 숫자를 기준으로 역순으로 숫자를 줄여나갈 때 아주 강력해요. 표준 for 문은 제어권이 개발자에게 완전히 위임되어 있기 때문에, 로직이 복잡해질수록 가독성이 떨어질 수 있다는 점을 항상 염두에 두어야 해요.

실제로 1부터 100 사이의 짝수만 모두 더하는 시나리오를 생각해 보세요. 초기값은 2로 설정하고, 100 이하일 때까지, 그리고 매 단계마다 2씩 더해주는 식이죠. 이렇게 명확한 규칙이 있는 경우에는 표준 for 문이 가장 깔끔한 정답이 됩니다.

STEP 2. While 문을 대신하는 조건식 전용 for 문

Go에는 while이라는 키워드가 없다고 말씀드렸죠? 대신 for 뒤에 조건식만 딱 놓으면 그것이 바로 while 문이 돼요. 조건식이 true인 동안 코드는 멈추지 않고 계속 실행됩니다.

이 방식은 주로 데이터의 끝을 알 수 없는 경우에 사용해요. 예를 들어 네트워크 서버로부터 데이터를 계속해서 읽어 들일 때, 데이터가 더 이상 들어오지 않을 때까지 반복해야 하는 상황이죠. 혹은 큐(Queue)나 스택(Stack) 같은 자료구조에서 요소가 빌 때까지 꺼내오는 작업도 이 패턴을 사용합니다.

이때 가장 주의할 점은 조건식이 언젠가는 false가 되어 반복이 종료될 수 있도록 설계해야 한다는 것이에요. 조건을 잘못 설정하면 프로그램이 영원히 멈추지 않는 무한 루프에 빠져 CPU 점유율을 100%까지 치솟게 만들 수 있어요.

STEP 3. 무한 루프와 흐름 제어 (break & continue)

가끔은 시작 조건조차 필요 없이 무조건 실행을 시작해야 할 때가 있어요. 이때는 for 뒤에 아무것도 적지 않은 채로 중괄호를 열면 됩니다. 이것이 Go의 무한 루프예요. 무한 루프는 그 자체로 위험해 보이지만, 루프 내부에서 특정 이벤트가 발생했을 때 탈출하는 구조를 만들면 매우 유연한 로직을 짤 수 있어요.

여기서 핵심은 breakcontinue예요. break는 반복문을 즉시 완전히 빠져나갈 때 사용하고, continue는 현재 진행 중인 회차를 건너뛰고 바로 다음 회차로 넘어갈 때 사용해요. 예를 들어 리스트를 훑다가 특정 조건에 맞는 데이터를 발견하면 처리를 중단하고 싶을 땐 break를, 특정 조건에 맞는 데이터만 제외하고 나머지는 계속 처리하고 싶을 땐 continue를 사용하면 됩니다.

⚠️ 주의
무한 루프 내에서 탈출 조건(break)이 명확하지 않으면 프로그램이 응답하지 않는 상태에 빠질 수 있어요. 반드시 탈출 경로를 코드로 검증하세요.

STEP 4. 가장 강력한 도구, range를 이용한 순회

실무에서 Go 개발자가 가장 많이, 그리고 가장 즐겁게 사용하는 문법은 단연 range예요. 슬라이스(Slice), 배열(Array), 맵(Map), 채널(Channel)과 같은 컬렉션 구조를 순회할 때 range를 사용하면 코드가 압도적으로 간결해져요.

range를 사용하면 두 가지 값을 반환받을 수 있어요. 하나는 현재 요소의 인덱스(Index)이고, 다른 하나는 그 인덱스에 해당하는 값(Value)이에요. 만약 인덱스는 필요 없고 값만 필요하다면, 언더바(_)를 사용하여 인덱스를 무시하는 기법을 사용합니다. 이것은 Go의 관용적인 표현 중 하나예요.

맵(Map)을 순회할 때는 인덱스 대신 키(Key)가 반환된다는 점도 기억해 두세요. range를 사용하면 데이터의 범위를 벗어날 걱정이 없으므로, 슬라이스 처리 시 가장 먼저 고려해야 할 최우선 선택지입니다.

STEP 5. 실전 응용: 슬라이스 필터링 패턴

단순히 모든 요소를 출력하는 것을 넘어, 특정 조건에 맞는 데이터만 골라내는 필터링 작업은 개발의 핵심이에요. 이를 위해 rangeappend 함수를 조합하는 패턴을 익혀두세요.

예를 들어, 학생 점수 리스트가 담긴 슬라이스에서 80점 이상인 학생들만 따로 모아 새로운 리스트를 만든다고 가정해 봅시다. 먼저 빈 슬라이스를 하나 선언하고, range를 통해 점수를 하나씩 확인합니다. 조건문으로 80점 이상인지 체크한 뒤, 조건에 맞는다면 append를 사용해 결과 리스트에 추가하면 됩니다. 이 흐름은 Go 프로그래밍에서 데이터 전처리 단계의 정석과도 같습니다.

실수를 줄이는 반복문 디버깅과 궁금증 해결

반복문은 로직의 중심이기 때문에 작은 실수 하나가 프로그램 전체를 망가뜨릴 수 있어요. 개발 과정에서 흔히 겪는 실수들을 정리했으니, 코드를 작성한 후 스스로 체크해 보세요.

  • 실수: 인덱스 범위를 넘어서는 접근 (Index Out of Range)
    왜 발생하는가: 표준 for 문에서 조건식을 i <= len(slice)와 같이 잘못 설정하여 마지막 인덱스 너머를 참조할 때 발생해요.
    ✅ 해결법: 항상 i < len(slice)처럼 미만 조건을 사용하거나, 가급적 range를 사용하세요.
  • 실수: 무한 루프에 의한 CPU 과부하
    왜 발생하는가: while 스타일의 for 문에서 조건식을 변화시키는 증감식이나 탈출 조건이 누락되었을 때 발생해요.
    ✅ 해결법: 루프 내부에서 조건 변수가 반드시 변경되는지, 혹은 break가 도달 가능한 경로에 있는지 확인하세요.
  • 실수: 반복문 변수 캡처 문제 (Go 1.22 미만 버전)
    왜 발생하는가: 루프 내부에서 고루틴(Goroutine)을 실행할 때, 반복 변수의 주소값을 그대로 사용하면 모든 고루틴이 마지막 값만 참조하게 돼요.
    ✅ 해결법: 루프 내에서 변수를 지역 변수로 다시 선언하거나, 최신 Go 버전을 사용하세요.
  • 실수: 순회 중인 슬라이스 수정
    왜 발생하는가: range로 슬라이스를 돌면서 동시에 요소를 삭제하거나 추가하면 인덱스가 꼬여서 의도치 않은 동작이 발생해요.
    ✅ 해결법: 삭제할 요소를 별도의 리스트에 모아두었다가 루프가 끝난 뒤 처리하거나, 역순으로 순회하세요.
  • 실수: 맵(Map) 순회 순서에 대한 오해
    왜 발생하는가: 맵은 순서가 없는 자료구조라 range를 돌릴 때마다 결과 순서가 매번 달라져요.
    ✅ 해결법: 결과가 항상 일정해야 한다면, 키(Key)를 별도의 슬라이스에 담아 정렬한 뒤 그 슬라이스로 다시 순회하세요.

자주 묻는 질문

Q. Go에서 역순으로 반복문을 돌리려면 어떻게 하나요?

표준 for 문을 사용해야 해요. 초기값을 len(slice) - 1로 설정하고, 조건식을 i >= 0으로, 증감식을 i--로 설정하면 아주 간단하게 역순 순회가 가능합니다.

Q. range 문에서 값(Value)을 생략하고 인덱스만 가져올 수 있나요?

네, 가능해요. for i := range slice와 같이 작성하면 값은 받지 않고 인덱스만 가져옵니다. 불필요한 메모리 할당을 줄일 수 있어 성능 최적화에 도움이 돼요.

Q. 중첩된 반복문(Nested Loop)에서 바깥쪽 루프를 한 번에 탈출할 수 있나요?
break는 현재 속한 가장 가까운 루프만 탈출해요. 바깥쪽 루프까지 한 번에 나가고 싶다면 'Label(라벨)' 기능을 사용하거나, 함수로 로직을 분리하여 return을 사용해야 해요.

Q. 맵을 순회할 때 성능이 걱정되는데, 인덱스 방식이 더 빠른가요?
맵은 인덱스라는 개념이 없으므로 반드시 range를 사용해야 해요. 맵의 성능은 반복문 방식보다는 데이터의 크기와 해시 충돌 관리에 더 큰 영향을 받습니다.

성공적인 Go 프로그래밍을 위한 마무리

지금까지 Go 반복문의 기초부터 실전 패턴, 그리고 주의해야 할 실수까지 모두 살펴보았어요. Go의 반복문은 단순해 보이지만, 그 안에는 프로그래머의 의도를 얼마나 명확하고 효율적으로 담아내느냐에 따라 코드의 품질이 극명하게 갈리는 지점이 숨어 있어요.

처음에는 for 하나만으로 모든 것을 표현하는 것이 답답하게 느껴질 수 있어요. 하지만 익숙해지면 오히려 불필요한 문법적 잡음이 사라진 깨끗한 코드를 작성할 수 있게 될 거예요. 오늘 배운 내용들을 하나씩 직접 타이핑하며 여러분의 것으로 만들어 보세요.

✅ 핵심 요약

  • 정해진 횟수는 표준 3단계 for 문을 사용하세요.
  • 조건 중심의 반복은 조건식만 있는 for 문(while 대용)을 활용하세요.
  • 데이터 집합 순회에는 안전한 range 문법이 최우선입니다.
  • 무한 루프 시에는 반드시 명시적인 break 탈출 경로를 확보하세요.
  • 맵(Map) 순회 시에는 결과 순서가 매번 바뀔 수 있음을 명심하세요.
  • 슬라이스 수정 시에는 인덱스 꼬임에 주의하고 역순 순회를 고려하세요.

오늘 바로 실행해 보세요!

  • 오늘 할 일: 1부터 100까지의 숫자 중 소수(Prime Number)만 출력하는 for 문 작성하기
  • 이번 주 할 일: 슬라이스에 담긴 사용자 구조체 데이터를 range로 순회하며 특정 조건 필터링하기
  • 실행 직전 할 일: 내가 짠 반복문에 무한 루프 위험이 없는지 다시 한번 검토하기

이 글이 여러분의 Go 학습 여정에 작은 디딤돌이 되었기를 바랍니다. 혹시 코드를 작성하다가 막히는 부분이 있거나, 더 깊이 알고 싶은 패턴이 있다면 언제든 아래 댓글로 질문을 남겨 주세요. 여러분의 성장을 진심으로 응원합니다!

더 깊이 있는 Go 언어 마스터를 원하신다면, Go 반복문 완전 정복 가이드 글과 함께 읽어 보시는 것을 추천드려요.

댓글 남기기