[IT-정보] Go 반복문 치트시트: 핵심 문법 총정리 – 입문자를 위한 실전 활용 예제와 패턴 가이드

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

Go 반복문, 왜 이것만 알면 될까요?

다른 프로그래밍 언어를 공부하다가 Go(Golang)로 넘어온 분들이 가장 먼저 당황하는 순간이 있어요. 바로 while 문이 보이지 않을 때예요. 파이썬이나 자바에서는 조건에 따라 반복하는 while 문이 아주 익숙하겠지만, Go는 미니멀리즘을 지향하는 언어답게 오직 for라는 키워드 하나로 모든 반복을 처리해요.

처음에는 “어떻게 문법 하나로 이걸 다 해?”라는 의문이 들 수도 있어요. 하지만 이 단순함이 오히려 코드의 가독성을 높이고, 개발자가 반복문의 구조를 더 명확하게 이해하도록 도와줘요. 반복문이 제대로 작동하지 않아 무한 루프에 빠지거나, 슬라이스의 범위를 벗어나 에러를 마주했던 경험이 있다면 오늘 이 글이 정말 큰 도움이 될 거예요.

이 가이드를 끝까지 읽고 나면, 복잡한 반복 구조도 겁내지 않고 능숙하게 작성할 수 있어요. 단순한 카운트부터 데이터 뭉치를 훑는 작업까지, 상황에 맞는 최적의 반복 패턴을 골라 쓰는 눈이 생길 거예요.

💡 이 글에서 다루는 내용

  • 기본적인 for 문법과 동작 원리
  • 데이터를 효율적으로 순회하는 range 활용법
  • 무한 루프와 흐름 제어(break, continue)
  • 실전에서 바로 쓰는 반복문 패턴

반복문 사용 전 반드시 체크해야 할 기본 개념

Go의 반복문을 제대로 쓰려면 단순히 문법을 외우는 것보다, 데이터의 형태를 먼저 파악하는 것이 중요해요. 내가 다루려는 대상이 숫자 하나인지, 아니면 여러 값이 들어있는 리스트(slice)인지, 혹은 이름표가 붙은 주머니(map)인지에 따라 사용하는 방식이 완전히 달라지거든요.

또한, 반복을 언제 멈출 것인지에 대한 조건도 미리 설계해야 해요. 조건을 잘못 설정하면 프로그램이 멈추지 않고 계속 돌아가는 무한 루프의 늪에 빠질 수 있어요. 그래서 Go에서는 반복문의 시작, 조건, 증감식을 한 줄에 모아서 쓰거나, 혹은 조건만 남겨두는 식으로 아주 유연하게 구조를 짤 수 있도록 설계되어 있어요.

아래 표를 보고 지금 내가 구현하려는 로직이 어떤 유형에 속하는지 먼저 확인해 보세요.

반복 유형 주요 특징 가장 적합한 상황
표준형 for 초기화, 조건, 증감식 사용 정확한 횟수가 정해진 숫자 반복
range 활용형 인덱스와 값을 동시에 추출 슬라이스나 맵의 모든 요소 순회
조건 중심형 while 문과 동일한 동작 특정 조건이 만족될 때까지 반복
무한 루프형 조건식 없이 실행 서버 대기나 지속적인 작업 수행

준비가 되었다면, 이제 구체적인 문법의 세계로 들어가 볼까요? 각 유형이 실제 코드에서 어떻게 구현되는지 단계별로 차근차근 알아봐요.

실전에서 바로 쓰는 Go 반복문 핵심 패턴

이제 본격적으로 Go 반복문 치트시트의 핵심인 실전 패턴들을 살펴볼게요. 이론보다는 실제 어떤 상황에서 어떤 코드를 써야 하는지에 집중해서 설명해 드릴게요.

STEP 1. 가장 기본이 되는 표준형 for 문법

가장 고전적인 방식이에요. 우리가 흔히 아는 C언어나 Java의 for 문과 매우 흡사하죠. 이 방식은 세 가지 요소로 구성돼요. 변수 초기화, 반복 조건, 증감식이에요. 이 세 가지를 세미콜론(;)으로 구분해서 한 줄에 적어주는 게 특징이에요.

예를 들어, 1부터 10까지 숫자를 출력하고 싶다면 `i := 1`로 시작해서 `i <= 10`인 동안 실행하고, 한 번 돌 때마다 `i++`를 해주는 식이에요. 이 방식의 장점은 루프의 통제권이 개발자에게 완벽하게 있다는 거예요. 숫자를 거꾸로 세거나, 2씩 건너뛰며 세는 작업도 아주 자유롭게 할 수 있어요. 특정 인덱스부터 시작해서 특정 인덱스에서 끝내야 하는 정교한 작업이 필요할 때 가장 먼저 고려해야 할 방식이에요.

STEP 2. 컬렉션을 순회하는 마법, range 활용법

Go 프로그래밍을 할 때 가장 많이 쓰게 될 패턴이에요. 슬라이스(slice)나 배열, 맵(map) 같은 데이터 묶음을 다룰 때 일일이 인덱스를 계산할 필요가 없어요. range 키워드를 사용하면 Go가 알아서 첫 번째 요소부터 마지막 요소까지 하나씩 꺼내주거든요.

여기서 주의할 점은 range가 두 가지 값을 반환한다는 거예요. 하나는 현재 요소의 인덱스(index)이고, 다른 하나는 그 위치에 들어있는 값(value)이에요. 만약 인덱스는 필요 없고 값만 쓰고 싶다면, 언더바( _ )를 사용해서 인덱스를 무시할 수 있어요. 반대로 값은 필요 없고 순서만 알고 싶다면 값 자리에 언더바를 써주면 돼요. 이 규칙만 잘 지켜도 코드가 훨씬 깔끔해지고 가독성이 올라가요.

맵(map)을 순회할 때는 인덱스 대신 ‘키(key)’가 반환된다는 점도 꼭 기억해 두세요. 맵은 순서가 보장되지 않기 때문에, 실행할 때마다 순회하는 순서가 달라질 수 있다는 사실도 실무에서 아주 중요한 포인트예요.

STEP 3. 조건에 따른 흐름 제어: break와 continue

반복문이 무조건 끝까지 돌아야 하는 건 아니에요. 중간에 원하는 데이터를 찾았다면 바로 멈춰야 하고, 특정 조건의 데이터만 건너뛰고 싶을 때도 있죠. 이때 사용하는 것이 바로 breakcontinue예요.

break

자주 하는 실수와 해결법

코드를 짜다 보면 누구나 실수를 해요. 특히 반복문은 논리적인 오류가 발생하기 가장 쉬운 구간이에요. 자주 발생하는 실수 5가지를 정리해 드릴게요.

인덱스 범위 초과 (Index Out of Range)
왜 발생하는가: 반복문의 종료 조건을 `i <= len(slice)`처럼 잘못 설정해서 슬라이스의 마지막 인덱스를 넘어설 때 발생해요.
해결법: 항상 종료 조건을 `i < len(slice)`로 작성하거나, 인덱스 계산이 복잡하다면 안전하게 range를 사용하세요.

의도치 않은 무한 루프
왜 발생하는가: 루프 내부에서 조건을 변화시키는 증감식(i++)을 빠뜨렸거나, 탈출 조건이 절대 만족될 수 없는 구조일 때 발생해요.
해결법: 루프를 시작하기 전에 반드시 “어떤 상황에서 이 루프가 끝나는가?”를 명확히 정의하고, 탈출 경로를 코드로 확인하세요.

range 변수 재사용 문제 (Go 1.22 이전 버전)
왜 발생하는가: range로 꺼낸 변수의 주소값을 다른 곳에 저장해 두면, 모든 저장된 값이 마지막 요소의 값으로 바뀌는 현상이 생길 수 있어요.
해결법: 최신 Go 버전을 사용하면 이 문제가 대부분 해결되었지만, 구버전이라면 루프 안에서 변수를 새로 복사해서 사용해야 해요.

맵(map) 순회 순서에 의존하는 로직
왜 발생하는가: 맵은 순서가 무작위예요. 한 번은 A-B 순서로 돌다가, 다음에는 B-A 순서로 돌 수 있어요.
해결법: 순서가 중요하다면 맵의 키를 별도의 슬라이스에 담아 정렬한 뒤, 그 슬라이스를 기준으로 순회하세요.

불필요한 연산 반복
왜 발생하는가: 루프가 돌 때마다 변하지 않는 값을 루프 안에서 매번 계산하거나 함수를 호출할 때 발생해요.
해결법: 반복문 밖에서 미리 계산해 둘 수 있는 값은 밖으로 빼내어 성능을 최적화하세요.

자주 묻는 질문

Q. Go에는 while 문이 정말 없나요?

네, 맞아요. 하지만 걱정하실 필요 없어요. for condition { … } 구조를 사용하면 우리가 원하는 모든 while 문 기능을 완벽하게 대체할 수 있거든요.

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

인덱스 자리에 언더바( _ )를 넣으시면 돼요. 예시로 `for _, value := range slice`와 같이 작성하면 인덱스는 무시하고 값만 깔끔하게 가져올 수 있어요.

Q. 중첩된 for 문에서 바깥쪽 루프를 한 번에 깨고 싶을 때는요?

라벨(Label) 기능을 사용하세요. `OuterLoop: for …`라고 이름을 붙인 뒤, 안쪽에서 `break OuterLoop`라고 호출하면 바깥쪽까지 한 번에 탈출할 수 있어요.

Q. 슬라이스를 순회하면서 요소를 삭제해도 괜찮을까요?

조금 위험해요. 요소를 삭제하면 슬라이스의 길이가 변해서 인덱스가 꼬일 수 있거든요. 요소를 삭제할 때는 인덱스를 뒤에서부터 거꾸로(역순으로) 순회하는 것이 가장 안전한 방법이에요.

Q. for 문 안에서 다른 고루틴(goroutine)을 실행할 때 주의할 점은?

반복문 변수의 주소를 고루틴에 그대로 전달하면 모든 고루틴이 마지막 값만 참조하는 문제가 생길 수 있어요. 반드시 루프 안에서 변수를 복사해서 전달해야 안전해요.

완벽한 반복문 마스터를 위한 마무리

지금까지 Go의 다양한 반복문 패턴과 실전 활용법을 살펴보았어요. 처음에는 문법이 단순해서 막막할 수 있지만, 익숙해지면 이보다 더 명확하고 강력한 도구는 없을 거예요. 오늘 배운 내용을 바탕으로 여러분의 코드를 더 깔끔하고 효율적으로 다듬어 보세요.

✅ 핵심 요약

  • 정확한 횟수는 표준형 for, 데이터 순회는 range를 사용하세요.
  • while 문이 필요할 땐 for 조건식만 남겨 사용하세요.
  • 중간 탈출은 break, 다음 차례는 continue를 활용하세요.
  • 맵(map) 순회 시에는 순서가 보장되지 않음을 항상 유의하세요.
  • 무한 루프를 쓸 때는 반드시 안전한 탈출 조건이나 휴식 시간을 넣으세요.
  • 슬라이스 삭제 시에는 인덱스 꼬임을 방지하기 위해 역순 순회를 권장해요.

지금 바로 실행해 보세요!

  • 오늘 할 일: 1부터 100까지의 숫자 중 짝수만 출력하는 코드를 직접 짜보세요.
  • 이번 주 할 일: 슬라이스에 담긴 이름들을 range로 순회하며 특정 이름을 찾으면 멈추는 로직을 구현해 보세요.
  • 실행 직전 할 일: 내가 짠 루프가 무한 루프에 빠질 가능성은 없는지, 종료 조건이 명확한지 다시 한번 눈으로 검토하세요.

이 가이드가 여러분의 Go 프로그래밍 여정에 작은 디딤돌이 되었기를 바라요. 혹시 코드를 작성하다가 막히는 부분이 있거나 이해가 안 되는 패턴이 있다면, 언제든 댓글로 질문을 남겨 주세요. 함께 고민하고 답변해 드릴게요!

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

댓글 남기기