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

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

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

개발을 하다 보면 똑같은 작업을 수십 번, 수백 번 반복해야 하는 순간이 정말 자주 찾아와요. 만약 1부터 1,000까지 숫자를 하나씩 출력해야 한다면 어떻게 하시겠어요? 일일이 코드를 복사해서 붙여넣는 것은 불가능에 가깝고, 그런 방식은 아주 작은 실수만 생겨도 전체 프로그램에 큰 문제를 일으키기 쉬워요.

처음 Go 언어를 배우는 분들이 가장 당혹스러워하는 지점 중 하나가 바로 이 반복문이에요. 다른 언어에서는 while이나 do-while 같은 다양한 반복문을 제공하지만, Go는 오직 for 하나로 모든 상황을 해결하거든요. 단순해 보이지만 이 하나의 도구로 모든 논리를 구현해야 하기에, 그 구조를 정확히 파악하는 것이 매우 중요해요.

반복문을 잘못 사용하면 프로그램이 멈추지 않는 무한 루프에 빠지거나, 데이터의 범위를 벗어나 에러를 내뱉으며 죽어버리곤 해요. 특히 실전 프로젝트에서는 대량의 데이터를 처리할 때 반복문의 효율성이 곧 프로그램의 성능으로 직결되기도 하죠. 단순히 돌아가게만 만드는 코드가 아니라, 안전하고 깔끔한 반복문을 작성하는 능력이 필요한 이유예요.

이 글을 끝까지 읽고 나면 여러분은 다음과 같은 능력을 갖추게 될 거예요.

  • Go의 유일한 반복문인 for의 모든 변형 패턴을 완벽히 이해해요.
  • 슬라이스나 맵 같은 컬렉션을 가장 효율적으로 순회하는 방법을 익혀요.
  • 실무에서 흔히 발생하는 반복문 관련 오류를 스스로 찾아내고 해결해요.
  • 복잡한 조건에서도 길을 잃지 않고 논리를 전개할 수 있어요.

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

본격적으로 코드를 작성하기 전에, Go의 반복문이 어떤 철학을 가지고 있는지 먼저 살펴볼게요. Go는 복잡함을 걷어내고 단순함을 추구하는 언어예요. 그래서 반복문도 다른 언어처럼 여러 종류를 나열하지 않고, 하나의 키워드를 상황에 맞게 변형해서 사용하도록 설계되었어요.

반복문을 사용하기 위해서는 기본적으로 제어 변수조건식의 개념이 머릿속에 잡혀 있어야 해요. 제어 변수는 반복이 몇 번 일어났는지 추적하는 역할을 하고, 조건식은 언제 반복을 멈출지를 결정하는 기준이 돼요. 이 두 가지가 서로 엇박자를 내면 프로그램은 영원히 멈추지 않는 늪에 빠지게 됩니다.

💡 알아두기
Go에는 별도의 while 문이 존재하지 않아요. 대신 for 문을 사용하여 while 문과 동일한 기능을 구현합니다. 이는 언어의 복잡도를 낮추려는 Go 설계자들의 의도가 담겨 있어요.

상황에 따라 어떤 방식의 반복문을 선택해야 할지 판단하는 것이 실력의 척도예요. 아래 표를 통해 각 상황별 권장되는 반복 스타일을 비교해 보세요.

사용 상황
권장 패턴 특징 및 장점
횟수가 정해진 경우 기본 C-style for 초기화, 조건, 증감식을 한 줄에 관리하여 가독성이 높아요.
조건이 충족될 때까지 조건식 전용 for while 문처럼 동작하며, 특정 상태 변화를 기다릴 때 유용해요.
슬라이스/맵 순회 for-range 인덱스나 키 값을 자동으로 가져와서 실수를 줄여줘요.
무한 반복이 필요한 경우 조건 없는 for 내부의 break 문을 통해 탈출 조건을 명확히 제어해요.

이 표를 머릿속에 담아두면 코드를 짜기 전에 어떤 도구를 꺼낼지 결정하는 시간이 훨씬 단축될 거예요. 자, 이제 준비가 끝났다면 실제 코드로 들어가 볼까요?

Go 반복문 실전 스니펫과 활용 패턴

이제 이론을 넘어 실제 코드로 어떻게 구현하는지 구체적으로 살펴볼게요. Go의 반복문은 단순해 보이지만, 어떻게 조합하느냐에 따라 강력한 힘을 발휘해요. 각 단계별로 가장 많이 쓰이는 패턴을 정리해 두었으니, 필요할 때마다 꺼내 보세요.

STEP 1. 가장 표준적인 횟수 기반 반복문

가장 기본이 되는 형태는 초기화 식, 조건 식, 증감 식을 한 줄에 모아 쓰는 방식이에요. 보통 C-style for loop라고 불러요. 이 방식은 반복 횟수를 명확하게 제어해야 할 때 가장 좋아요.

예를 들어, 특정 횟수만큼 숫자를 세거나 인덱스를 직접 조작해야 할 때 사용해요. 초기화 식에서 변수를 선언하고, 조건 식이 참(true)인 동안 실행되며, 매 회차가 끝날 때마다 증감 식을 실행하죠. 이 구조를 통해 코드의 흐름을 한눈에 파악할 수 있어요.

만약 인덱스를 1부터 시작하고 싶거나, 2씩 증가시키고 싶다면 증감 식 부분만 살짝 수정하면 돼요. 아주 유연하죠? 다만, 조건 식을 잘못 설정하면 프로그램이 끝없이 돌아갈 수 있으니 주의해야 해요.

STEP 2. 조건 중심의 while 스타일 구현하기

Go에는 while이라는 키워드가 없지만, 걱정하지 마세요. for 문에서 초기화 식을 생략하고 조건 식만 남겨두면 그것이 바로 while 문이 되거든요. 어떤 특정 조건이 만족될 때까지만 루프를 돌리고 싶을 때 이 패턴을 사용해요.

예를 들어, 사용자가 특정 명령어를 입력할 때까지 계속 기다리거나, 데이터 버퍼가 비워질 때까지 계속해서 데이터를 읽어오는 상황에서 아주 유용해요. 변수의 상태가 변함에 따라 루프가 종료되는 지점이 결정되기 때문에, 조건이 언제 false가 되는지를 설계하는 것이 핵심이에요.

STEP 3. 무한 루프와 정교한 탈출 전략

가끔은 처음부터 끝을 정해두지 않고, 특정 사건이 발생할 때까지 계속해서 무작 수행해야 하는 경우가 있어요. 이때는 조건 식을 아예 비워둔 채로 for만 적어주면 무한 루프가 생성돼요.

무한 루프는 양날의 검이에요. 잘못 사용하면 CPU 점유율을 100%로 끌어올리며 시스템을 마비시키지만, 적절히 사용하면 서버의 메인 이벤트 루프나 네트워크 리스너를 구현하는 데 필수적이에요. 이때는 반드시 내부에서 break 문을 사용하여 루프를 빠져나갈 수 있는 탈출구를 마련해야 해요. 혹은 return을 사용해 함수 자체를 종료시킬 수도 있죠.

⚠️ 주의
무한 루프 내부에서 작업을 수행할 때는, 가급적 아주 짧은 휴식 시간(time.Sleep 등)을 주어 CPU가 다른 작업도 처리할 수 있는 여유를 주는 것이 좋습니다.

STEP 4. 컬렉션을 위한 가장 강력한 도구, range

Go 프로그래밍을 하면서 가장 많이 쓰게 될 패턴은 단연 for-range일 거예요. 슬라이스(Slice), 배열(Array), 맵(Map), 문자열(String) 같은 컬렉션을 하나씩 꺼내어 처리할 때 이보다 편한 방법은 없거든요.

range를 사용하면 개발자가 직접 인덱스를 계산하거나 범위를 체크할 필요가 없어요. Go가 알아서 첫 번째 요소부터 마지막 요소까지 순서대로(맵의 경우는 무작위 순서로) 값을 가져다줍니다. 슬라이스에서는 (인덱스, 값) 쌍을 반환하고, 맵에서는 (키, 값) 쌍을 반환해요. 만약 인덱스가 필요 없다면 변수 이름을 언더바(\_)로 표시하여 무시할 수도 있어요. 이 기능은 코드를 매우 간결하고 실수 없이 만들어줍니다.

STEP 5. 중첩 반복문과 복잡한 로직 제어

때로는 반복문 안에 또 다른 반복문이 들어가는 중첩 반복문(Nested Loop)을 사용해야 해요. 2차원 배열을 탐색하거나, 여러 리스트를 서로 비교할 때 자주 쓰이죠. 하지만 중첩이 깊어질수록 코드는 복잡해지고 읽기 어려워져요.

이럴 때는 루프 내부의 로직을 별도의 함수로 분리하거나, continue 문을 적절히 사용하여 불필요한 계산을 건너뛰는 것이 좋아요. continue는 현재 진행 중인 회차의 나머지 코드를 무시하고 즉시 다음 회차로 넘어가는 마법 같은 키워드예요. 이를 잘 활용하면 조건문(if)을 깊게 중첩시키지 않고도 깔끔한 코드를 유지할 수 있습니다.

💡 알아두기
복잡한 중첩 루프를 짤 때는 언제나 ‘최악의 경우’를 생각하세요. 데이터가 1,000개인데 중첩 루프를 2번 쓰면 1,000,000번의 연산이 일어납니다. 성능 최적화의 첫걸음은 루프의 깊이를 줄이는 것입니다.

자주 하는 실수와 해결법

반복문을 작성하다 보면 누구나 한 번쯤은 실수를 하게 마련이에요. 특히 Go의 독특한 동작 방식 때문에 발생하는 실수들이 있죠. 아래 내용을 숙지해서 시행착오를 줄여보세요.

  • 인덱스 범위 초과(Out of Bounds)
    왜 발생하는가: 슬라이스의 길이를 계산할 때 len(s)를 사용해야 하는데, 실수로 1을 더하거나 잘못된 조건을 설정할 때 발생해요.
    ✅ 해결법: 가급적 직접 인덱스를 다루기보다 for-range 문을 사용하세요. 인덱스 계산 실수를 원천 차단할 수 있어요.
  • 무한 루프 발생
    왜 발생하는가: 탈출 조건이 절대 참이 될 수 없거나, 반복문 내부에서 제어 변수를 업데이트하는 것을 깜빡했을 때 나타나요.
    ✅ 해결법: 루프를 설계할 때 반드시 어떻게 이 루프가 끝날 것인가를 먼저 정의하세요. 탈출 조건이 포함된 코드를 작성한 후 테스트해야 합니다.
  • range 변수 재사용 문제
    왜 발생하는가: Go의 이전 버전들에서는 range 루프의 인덱스나 값 변수가 매 회차마다 새로 생성되는 것이 아니라 같은 메모리 주소를 공유했어요. 이로 인해 고루틴(Goroutine) 내부에서 해당 변수를 사용하면 의도치 않은 값이 참조될 수 있었죠.
    ✅ 해결법: 최신 Go 버전에서는 이 문제가 많이 개선되었지만, 여전히 루프 안에서 변수를 참조할 때는 새로운 지역 변수에 값을 복사해서 사용하는 습관을 들이는 것이 가장 안전해요.
  • 맵(Map) 순회 순서 오해
    왜 발생하는가: 맵을 range로 돌릴 때 매번 출력되는 순서가 바뀌는 것을 보고 데이터가 깨졌다고 오해하는 경우가 있어요.
    ✅ 해결법: Go의 맵은 순서가 보장되지 않는 자료구조예요. 순서가 중요하다면 맵의 키들을 슬라이스에 담아 정렬한 뒤, 그 슬라이스를 바탕으로 반복문을 돌려야 해요.
  • 반복 중 슬라이스 수정
    왜 발생하는가: 반복문이 돌아가는 도중에 슬라이스의 요소를 삭제하거나 추가하면 인덱스가 꼬이게 돼요.
    ✅ 해결법: 원본 슬라이스를 직접 건드리기보다는, 조건을 만족하는 요소들만 모은 새로운 슬라이스를 만들어 반환하는 방식이 훨씬 안전하고 깔끔해요.

자주 묻는 질문

Q. Go에 while 문이 없는데 정말 괜찮은 건가요?

네, 전혀 문제없어요. 오히려 문법이 단순해져서 코드를 읽는 사람이 어떤 형태의 반복문인지 고민할 필요가 없다는 장점이 있어요. 상황에 맞춰 for 문을 변형해서 쓰면 됩니다.

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

변수 자리에 언더바(\_)를 사용하면 돼요. 예: for _, value := range slice 이렇게 쓰면 인덱스는 무시하고 값만 가져올 수 있어요.

Q. break와 continue의 차이점이 정확히 무엇인가요?

break는 반복문 자체를 즉시 ‘종료’하고 밖으로 탈출하는 것이고, continue는 현재 차례만 ‘건너뛰고’ 바로 다음 차례로 넘어가는 것이에요. 상황에 맞춰 적절히 선택하세요.

Q. 중첩 루프에서 안쪽 루프의 break가 바깥쪽 루프까지 멈추게 할 수 있나요?

기본적인 break는 자신이 속한 가장 가까운 루프만 탈출해요. 바깥쪽 루프까지 한꺼번에 멈추고 싶다면 라벨(Label) 기능을 사용하거나, 조건 플래그 변수를 활용해야 해요.

성공적인 반복문 활용을 위한 마무리

지금까지 Go 프로그래밍의 심장이라고 할 수 있는 반복문 for의 다양한 모습들을 살펴보았어요. 단순한 문법을 넘어 어떤 상황에 어떤 패턴을 적용해야 효율적인지 감을 잡으셨기를 바라요.

반복문은 단순히 코드를 줄여주는 도구가 아니라, 프로그램의 논리적 흐름을 결정하는 핵심 설계 요소예요. 오늘 배운 내용을 바탕으로 여러분의 코드가 더 간결하고, 읽기 쉬우며, 무엇보다 안전하게 동작하도록 만들어 보세요.

✅ 핵심 요약

  • 횟수가 정해져 있다면 C-style for를 사용하세요.
  • while 문이 필요하면 조건식만 있는 for를 쓰세요.
  • 컬렉션 순회는 가급적 range를 사용하여 실수를 방지하세요.
  • 무한 루프를 쓸 때는 반드시 break 탈출구를 만드세요.
  • 맵의 순서는 보장되지 않는다는 점을 명심하세요.
  • 중첩 루프는 가급적 깊이를 낮추어 성능을 최적화하세요.

🚀 지금 바로 실행해 보세요!

  • 오늘 할 일: 배운 코드 스니펫 중 하나를 골라 본인의 IDE에서 직접 타이핑하고 실행해 보세요.
  • 이번 주 할 일: 현재 작성 중인 코드에서 중첩된 if문이나 복잡한 반복문을 range 문으로 리팩토링해 보세요.
  • 실행 직전 할 일: 반복문 내부에서 사용하는 변수가 의도치 않게 변경되지 않는지 다시 한번 검토하세요.

반복문을 다루는 능력이 향상되면 여러분의 Go 실력은 한 단계 더 높이 도약할 거예요. 공부하다가 막히거나 궁금한 점이 생긴다면 언제든 댓글로 남겨 주세요. 제가 확인하는 대로 정성껏 답변해 드릴게요! 😊

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

댓글 남기기