[IT-정보] Go 반복문 치트시트 핵심 문법 정리 – 입문자를 위한 Golang for 루프 실전 가이드

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

왜 Go 반복문 mastering이 개발 효율을 결정할까요?

코드를 작성하다 보면 똑같은 작업을 수십 번, 수백 번 반복해야 하는 상황을 마주하게 돼요. 단순한 숫자를 세는 것부터 복잡한 데이터 구조를 하나씩 꺼내 확인하는 과정까지, 이 모든 것을 효율적으로 처리하는 도구가 바로 반복문이에요. 하지만 초보 개발자라면 반복문 안에서 예상치 못한 무한 루프에 빠지거나, 존재하지 않는 데이터의 위치를 참조하며 프로그램이 갑자기 멈춰버리는 당혹스러운 경험을 하곤 합니다.

특히 Go 언어는 다른 언어와 달리 반복문의 종류가 매우 단순해요. 오직 for 하나로 모든 것을 해결해야 하죠. 이 단순함은 강력한 무기가 되기도 하지만, 제어 방법을 제대로 모르면 코드가 순식간에 복잡해질 위험이 있어요. 구글의 클라우드 인프라나 고성능 서버를 만드는 데 사용되는 Go를 제대로 다루려면, 이 핵심적인 루프를 자유자재로 다룰 수 있어야 해요.

이 가이드는 단순히 문법을 나열하는 데 그치지 않아요. 실무에서 어떤 패턴으로 반복문을 사용하는지, 그리고 흔히 저지르는 실수를 어떻게 피해야 하는지를 중심으로 구성했습니다. 이 글을 끝까지 읽고 나면, 여러분은 어떤 데이터 뭉치를 만나더라도 당황하지 않고 깔끔한 Go 반복문 코드를 작성할 수 있게 될 거예요.

💡 알아두기
Go 언어의 철학은 ‘단순함’이에요. 복잡한 반복문 구조를 여러 개 만드는 대신, 하나의 강력한 도구를 깊이 있게 사용하는 것을 권장합니다.

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

  • Go 반복문의 기본 구조와 작동 원리
  • 슬라이스와 맵을 위한 range 활용법
  • 실전에서 바로 쓰는 핵심 코드 스니펫
  • 개발자를 괴롭히는 흔한 실수와 해결책

Go 반복문을 시작하기 전 반드시 체크할 사항

반복문을 본격적으로 작성하기 전에, Go 언어만이 가진 독특한 특징을 이해하는 것이 중요해요. 다른 프로그래밍 언어인 C나 Java를 경험해 보셨다면, Go의 반복문이 얼마나 절제되어 있는지 바로 체감하실 수 있을 거예요. Go에는 while이나 do-while 같은 별도의 키워드가 없어요. 오직 for 키워드 하나가 이 모든 역할을 수행하죠.

이것이 의미하는 바는 명확해요. 조건이 하나만 필요할 때는 for를 while처럼 쓰고, 조건과 증감식이 모두 필요할 때는 전통적인 방식으로 사용하는 식이죠. 이러한 단순함 덕분에 코드가 간결해지지만, 반대로 말하면 조건식의 논리적 설계가 완벽하지 않으면 프로그램이 멈추지 않는 치명적인 오류가 발생할 수 있다는 뜻이기도 해요.

반복문을 설계할 때 스스로에게 다음 세 가지 질문을 던져보세요. 첫째, 반복을 멈추게 할 명확한 종료 조건이 있는가? 둘째, 반복할 때마다 데이터의 상태가 올바르게 변하고 있는가? 셋째, 반복문 내부에서 너무 많은 일을 하려고 해서 가독성을 해치지는 않는가? 이 질문들에 확신을 가지고 답할 수 있을 때 비로소 안정적인 코드가 탄생합니다.

구분 전통적 방식 (C/Java) Go 방식 (Golang)
기본 반복문 for (초기화; 조건; 증감) for 초기화; 조건; 증감
조건 중심 루프 while (조건) for 조건
무한 루프 while (true) for
데이터 순회 for-each 문 사용 for range 사용

또한, Go에서 반복문을 사용할 때는 데이터의 메모리 효율성을 항상 고려해야 해요. 특히 대규모 슬라이스를 다룰 때, 반복문 내부에서 새로운 슬라이스를 계속 생성하거나 무거운 객체를 복사하면 성능이 급격히 떨어질 수 있어요. 따라서 반복문을 쓰기 전, 내가 다루려는 데이터의 크기와 구조를 먼저 파악하는 습관을 들이는 것이 좋습니다.

실전에서 바로 쓰는 Go 반복문 활용법

이제 이론을 넘어 실제 코드가 어떻게 움직이는지 살펴볼게요. Go의 반복문은 상황에 따라 크게 다섯 가지 패턴으로 나뉩니다. 각 단계별로 어떤 상황에서 무엇을 써야 하는지 구체적인 시나리오와 함께 익혀보세요.

STEP 1. 가장 기본적인 C 스타일 for 루프

가장 먼저 익혀야 할 패턴은 초기화, 조건식, 증감식이 포함된 전통적인 형태예요. 숫자를 일정 횟수만큼 세거나, 특정 범위 내에서 인덱스를 직접 제어해야 할 때 가장 강력해요. 예를 들어, 배열의 특정 인덱스부터 시작해서 역순으로 탐색해야 하는 상황이라면 이 방식이 필수적이죠.

이 구조에서 주의할 점은 조건식의 경계값이에요. 인덱스가 슬라이스의 길이를 넘어가는 순간, 프로그램은 즉시 에러를 내뿜으며 중단됩니다. 코드를 작성할 때 항상 ‘마지막 인덱스가 무엇인가’를 명확히 계산해야 해요.

💡 알아두기
Go에서는 세미콜론(;)을 사용해 각 요소를 구분하지만, 문장 끝에는 붙이지 않아요. 이는 문법적 간결함을 유지하기 위한 규칙이에요.

STEP 2. 슬라이스와 맵을 위한 range 활용하기

실무에서는 인덱스 번호보다 데이터의 ‘값’ 자체가 중요한 경우가 훨씬 많아요. 이때 사용하는 것이 바로 range 키워드입니다. 슬라이스를 순회할 때는 인덱스와 값을 동시에 얻을 수 있고, 맵(Map)을 순회할 때는 키(Key)와 값(Value)을 쌍으로 가져올 수 있어요.

range를 사용할 때의 핵심 팁은, 만약 인덱스가 필요 없다면 언더스코어(_)를 사용하여 명시적으로 무시하는 거예요. 이는 코드를 읽는 다른 개발자에게 ‘나는 이 인덱스를 사용하지 않는다’는 의도를 확실히 전달하는 아주 좋은 습관입니다. 맵을 순회할 때는 맵의 순서가 보장되지 않는다는 점을 반드시 기억하세요. 매번 실행할 때마다 결과 순서가 달라질 수 있으므로, 정렬된 결과가 필요하다면 별도의 정렬 과정을 거쳐야 해요.

STEP 3. 무한 루프와 제어문(break, continue) 사용법

때로는 조건이 명확하지 않거나, 특정 이벤트가 발생할 때까지 계속 작동해야 하는 루프가 필요해요. Go에서는 아무런 조건 없이 for만 적으면 무한 루프가 됩니다. 이때 탈출구가 없다면 프로그램은 영원히 멈추지 않겠죠? 그래서 breakcontinue의 활용이 매우 중요해요.

특정 조건에서 현재 차례를 건너뛰고 다음 반복으로 넘어가고 싶다면 continue를, 루프 전체를 즉시 종료하고 싶다면 break를 사용하세요. 예를 들어, 데이터 목록을 검사하다가 원하는 값을 찾으면 더 이상 검사할 필요가 없으니 break로 빠져나오는 것이 효율적입니다.

STEP 4. 중첩 반복문과 라벨(Label) 활용

반복문 안에 또 다른 반복문이 들어가는 중첩 루프는 복잡한 알고리즘을 구현할 때 자주 쓰여요. 하지만 문제가 하나 있어요. 안쪽 루프에서 break를 쓰면 바로 위쪽의 루프만 종료될 뿐, 바깥쪽 루프는 여전히 돌아가고 있다는 사실이죠. 바깥쪽 루프까지 한꺼번에 종료하고 싶을 때 사용하는 기술이 바로 break 라벨명과 같은 방식으로 호출할 수 있어요. 이는 복잡한 2차원 배열이나 다중 리스트를 처리할 때 코드를 훨씬 직관적이고 깔끔하게 만들어 줍니다. 다만, 너무 남용하면 코드의 흐름을 추적하기 어려워지므로 꼭 필요한 순간에만 사용하는 것이 좋아요.

STEP 5. 효율적인 성능을 위한 반복문 최적화

마지막으로 프로덕션 환경에서 고려해야 할 성능 최적화 단계예요. 반복문이 수만 번, 수백만 번 돌아가는 상황에서는 아주 작은 비용도 크게 느껴질 수 있어요. 가장 흔한 실수 중 하나는 반복문이 돌 때마다 매번 새로운 메모리를 할당하는 것이에요. 반복문 외부에서 변수를 미리 선언해 두고, 내부에서는 값만 업데이트하는 방식을 사용하면 가비지 컬렉터(GC)의 부담을 획기적으로 줄일 수 있습니다.

또한, 슬라이스의 길이를 매번 함수 호출로 계산하기보다는, 루프 시작 전에 변수에 담아두는 것도 미세한 성능 향상에 도움이 됩니다. 성능 최적화는 코드가 동작하는 것을 확인한 뒤, 병목 현상이 발생하는 지점을 찾아 적용하는 것이 가장 현명한 순서라는 점을 잊지 마세요.

⚠️ 주의
맵(Map)을 순회하면서 해당 맵의 요소를 직접 삭제하거나 추가하는 행위는 예기치 못한 동작을 유발할 수 있으니 매우 조심해야 합니다.

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

자주 하는 실수와 해결법

실수: 슬라이스의 범위를 벗어난 인덱스 참조
왜 발생하는가: 반복문의 종료 조건을 i <= len(slice)와 같이 잘못 설정하여 마지막 요소 이후의 위치를 건드리기 때문이에요.
해결법: 항상 i < len(slice)와 같이 미만(<) 기호를 사용하여 인덱스가 범위를 넘지 않도록 철저히 관리하세요.

실수: range 루프 변수의 재사용 문제
왜 발생하는가: Go의 range는 반복마다 변수의 값을 업데이트할 뿐, 새로운 메모리 주소를 할당하지 않는 경우가 있어 고루틴(Goroutine)과 함께 쓸 때 문제가 돼요.
해결법: 루프 내부에서 사용할 변수를 별도로 선언하여 값을 복사한 뒤 사용하거나, 루프 블록 안에서 변수를 새로 생성하세요.

실수: 무한 루프에 의한 CPU 점유율 폭증
왜 발생하는가: 종료 조건을 결정하는 변수가 루프 내부에서 제대로 업데이트되지 않아 조건식이 영원히 참(true)이 되기 때문이에요.
해결법: 증감식이나 조건 변수가 루프의 매 단계마다 논리적으로 변화하고 있는지 코드를 한 줄씩 검토하세요.

실수: 맵 순회 중 데이터 수정
왜 발생하는가: 반복문이 돌고 있는 데이터 집합을 중간에 바꿔버리면 순회 로직이 꼬이게 됩니다.
해결법: 수정할 데이터를 별도의 슬라이스에 먼저 모아둔 뒤, 루프가 완전히 끝난 후에 일괄 처리하세요.

실수: 중첩 루프 탈출 실패
왜 발생하는가: 안쪽 루프에서 break를 썼는데, 바깥쪽 루프까지 멈추길 기대했기 때문이에요.
해결법: 바깥쪽 루프를 한꺼번에 종료해야 한다면 반드시 라벨(Label)을 정의하고 break 라벨명 형식을 사용하세요.

자주 묻는 질문

Q. Go에는 while 문이 없는데 어떻게 하면 되나요?

for 키워드 뒤에 조건식만 적으면 됩니다. 예를 들어 for i < 10 { ... }와 같이 작성하면 Java나 Python의 while 문과 똑같이 동작해요.

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

언더스코어 기호인 _를 사용하면 됩니다. for _, value := range slice와 같은 형식을 사용하면 인덱스 없이 값만 깔끔하게 가져올 수 있어요.

Q. for 루프 안에서 goroutine을 호출할 때 주의할 점이 있나요?

네, 매우 중요해요. 루프의 인덱스 변수를 직접 고루틴에 넘기면 모든 고루틴이 마지막 인덱스 값만 참조하는 실수가 생길 수 있어요. 반드시 루프 안에서 변수를 새로 복사해서 전달하세요.

Q. 맵(Map)을 순회할 때 순서가 왜 매번 바뀌나요?

Go의 설계 철학상 맵은 순서가 없는 자료구조예요. 개발자가 순서에 의존하는 코드를 짜지 못하도록, 런타임 단계에서 의도적으로 순서를 무작위로 섞어서 제공합니다.

Q. 무한 루프를 안전하게 종료하는 가장 좋은 방법은 무엇인가요?

상태 값을 체크하는 조건식을 쓰거나, 특정 신호(Channel)를 받았을 때 break로 탈출하도록 설계하는 것이 가장 표준적이고 안전해요.

Go 반복문 마스터를 위한 마지막 단계

오늘 우리는 Go 언어의 핵심인 반복문의 기초부터 실전 활용 패턴, 그리고 실무에서 마주치는 함정들까지 폭넓게 살펴보았어요. 반복문은 단순히 코드를 반복하는 도구가 아니라, 데이터의 흐름을 제어하고 프로그램의 성능을 결정짓는 중요한 설계 요소라는 점을 꼭 기억해 주세요.

✅ 핵심 요약

  • Go의 반복문은 오직 for 하나로 모든 것을 처리해요.
  • 데이터 순회 시에는 인덱스와 값을 동시에 주는 range가 매우 유용해요.
  • 중첩 루프를 한 번에 탈출하려면 라벨(Label)을 사용하세요.
  • 슬라이스 인덱스 접근 시에는 항상 범위(Boundary)를 체크해야 해요.
  • 고루틴과 함께 쓸 때는 반복문 변수의 복사 문제를 반드시 주의하세요.
  • 성능을 위해서는 반복문 내부에서의 불필요한 메모리 할당을 피해야 해요.

이제 이론 공부는 충분해요. 직접 코드를 쳐보며 몸으로 익히는 시간이 필요합니다. 지금 바로 IDE를 켜고, 다음 미션을 수행해 보세요!

  • 오늘 할 일: 슬라이스에 담긴 숫자들의 합계를 구하는 for 루프 작성하기
  • 이번 주 할 일: 맵(Map)을 순회하며 특정 조건에 맞는 키(Key)만 추출하는 로직 구현하기
  • 실행 직전 할 일: 작성한 반복문 코드에 인덱스 범위 에러가 발생할 가능성이 없는지 검토하기

Go 프로그래밍을 공부하다가 막히는 부분이 있다면 언제든 댓글로 남겨 주세요. 여러분의 학습을 돕기 위해 성심성의껏 답변해 드릴게요. 함께 성장해 나갔으면 좋겠습니다!

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

댓글 남기기