
반복문 for, 왜 지금 바로 익혀야 할까요?
수천 명의 사용자 데이터를 하나씩 확인하며 이메일을 보내야 하는 상황을 상상해 보세요. 만약 이 작업을 사람이 일일이 손으로 입력한다면 얼마나 많은 시간이 걸릴까요? 아마 퇴근은커녕 며칠 밤을 꼬박 새워야 할지도 몰라요. 프로그래밍의 진정한 가치는 바로 이런 지루하고 반복적인 작업을 컴퓨터에게 맡기는 데 있어요.
많은 입문 개발자가 처음 코드를 작성할 때 가장 당혹스러워하는 지점이 바로 이 반복적인 구조를 어떻게 제어하느냐예요. 단순히 똑같은 코드를 여러 번 복사해서 붙여넣는 것은 효율적이지 않을뿐더러, 나중에 코드를 수정할 때 지옥 같은 상황을 마주하게 만들거든요. Go 반복문 시작하기를 제대로 이해하는 것만으로도 여러분의 코드 품질은 차원이 달라질 수 있어요.
Go 언어는 다른 언어들과 달리 반복문을 구현하는 방식이 매우 간결하고 독특해요. 다른 언어에서는 while이나 do-while 같은 다양한 키워드를 사용하지만, Go는 오직 for 하나로 모든 반복 로직을 해결해요. 처음에는 이것이 조금 제한적이라고 느껴질 수 있지만, 익숙해지면 오히려 코드가 훨씬 깔끔하고 읽기 쉬워지는 마법을 경험하게 될 거예요.
오늘 이 글을 끝까지 읽고 나면 여러분은 다음 내용을 완벽하게 내 것으로 만들 수 있어요.
- Go 언어에서 유일하게 존재하는 for 반복문의 세 가지 기본 형태
- 조건에 따라 반복을 멈추거나 건너뛰는 정교한 제어 방법
- 슬라이스와 맵을 아주 쉽게 순회할 수 있는 range 키워드 활용법
- 실제 개발 현장에서 자주 발생하는 반복문 오류와 해결책
본격적인 시작 전, 꼭 알아두어야 할 준비물
반복문을 배우기 전에 먼저 갖춰야 할 기본적인 환경과 개념이 있어요. 무턱대고 코드부터 타이핑하기보다는, 내가 지금 무엇을 사용하고 있고 어떤 원리로 돌아가는지 머릿속에 지도를 그려두는 것이 훨씬 효율적이에요.
1. 개발 환경과 기본 지식
먼저 컴퓨터에 Go 컴파일러가 설치되어 있어야 해요. 터미널에서 go version 명령어를 입력했을 때 버전 정보가 정상적으로 출력된다면 준비는 끝난 셈이에요. 또한, 변수를 선언하고 값을 할당하는 아주 기초적인 문법을 알고 있어야 반복문 안에서 데이터를 자유롭게 다룰 수 있어요.
Go의 반복문은 다른 언어의 while 문을 포함하여 모든 반복 로직을 대체하도록 설계되었어요. 따라서 반복문 하나만 제대로 알아도 거의 모든 제어가 가능해요.
2. 반복문 유형별 비교
Go에서는 상황에 따라 반복문을 사용하는 방식이 조금씩 달라요. 어떤 상황에서 어떤 형태를 써야 할지 미리 판단 기준을 세워두는 것이 좋아요. 아래 표를 통해 각 유형의 특징을 비교해 보세요.
| 반복 유형 | 주요 용도 | 핵심 특징 |
|---|---|---|
| 기본 for 문 | 횟수가 정해진 반복 | 초기값, 조건식, 증감식을 한 줄에 작성 |
| 조건식 for 문 | 특정 조건이 유지될 때까지 | while 문과 유사한 동작 방식 |
| range 활용 문 | 배열, 슬라이스, 맵 순회 | 인덱스와 값을 동시에 추출 가능 |
| 무한 루프 | 지속적인 모니터링 작업 | 조건 없이 계속 실행, break로 탈출 필수 |
위 표를 보면 알 수 있듯이, 모든 반복은 종료 조건이 명확해야 해요. 종료 조건을 잘못 설정하면 프로그램이 영원히 멈추지 않는 무한 루프에 빠져 컴퓨터 자원을 모두 잡아먹을 수 있으니 항상 주의해야 해요.
실전! Go 반복문 핵심 구현 단계
이제 본격적으로 코드를 작성하며 반복문의 원리를 체득해 볼 시간이에요. 단순히 문법을 외우는 것이 아니라, 이 코드가 왜 이렇게 동작하는지 논리적인 흐름을 따라가는 것이 중요해요.
STEP 1. 표준적인 for 문 구조 익히기
가장 기본이 되는 형태는 초기화, 조건식, 증감식 세 가지 요소를 세미콜론으로 구분하여 한 줄에 적는 방식이에요. 이것은 우리가 흔히 아는 C언어나 Java의 방식과 매우 비슷해요.
예를 들어 1부터 5까지 숫자를 출력하고 싶다면 이렇게 작성할 수 있어요. 먼저 변수 i를 1로 시작하고, i가 5보다 작거나 같을 동안 반복하며, 한 번 돌 때마다 i를 1씩 증가시키는 구조예요. 이 과정에서 각 요소는 독립적으로 작동하며, 조건식이 거짓이 되는 순간 반복문은 즉시 종료돼요.
STEP 2. 조건식만 사용하는 while 스타일 활용하기
Go에는 별도의 while 키워드가 없지만, for 키워드 뒤에 조건식만 남겨두면 완벽하게 while 문처럼 동작해요. 특정 값이 일정 기준 이하로 떨어질 때까지 작업을 계속해야 하는 경우에 매우 유용해요.
예를 들어, 배터리 잔량이 0보다 큰 동안 계속해서 전력을 소비하는 로직을 짠다고 가정해 보세요. for battery > 0 { ... }와 같이 작성하면 배터리가 다 소모되는 즉시 반복이 멈추게 돼요. 이 방식은 반복 횟수를 미리 알 수 없을 때 사용하는 가장 강력한 도구예요.
STEP 3. 흐름을 제어하는 break와 continue
반복문 안에서 상황에 따라 흐름을 바꾸고 싶을 때가 있어요. break는 반복문을 즉시 완전히 빠져나오게 만들고, continue는 현재 차례의 남은 코드를 건너뛰고 곧바로 다음 반복으로 넘어가게 해요.
데이터 목록을 검색하다가 원하는 값을 찾으면
break를 사용하여 불필요한 나머지 검색을 중단하는 것이 성능 최적화의 핵심이에요.예를 들어, 1부터 100 사이의 숫자 중 7의 배수만 출력하고 싶다면 continue를 사용해 보세요. 숫자를 1씩 키우다가 7로 나누어떨어지는 경우에만 특정 동작을 수행하도록 제어할 수 있어요.
STEP 4. range를 이용한 스마트한 순회
현대적인 Go 프로그래밍에서 가장 많이 쓰이는 방식은 바로 range 키워드예요. 슬라이스(Slice)나 맵(Map) 같은 데이터 묶음을 다룰 때, 인덱스를 일일이 계산할 필요 없이 데이터의 처음부터 끝까지 아주 깔끔하게 훑을 수 있어요.
for index, value := range items { ... } 형태를 사용하면 현재 몇 번째 아이템인지 나타내는 인덱스와 실제 데이터 값을 동시에 얻을 수 있어요. 만약 인덱스가 필요 없다면 언더바(_) 기호를 사용하여 무시할 수도 있어요. 이는 코드의 가독성을 높여주는 아주 중요한 테크닉이에요.
STEP 5. 실전 시나리오: 사용자 목록 처리하기
이 모든 것을 합쳐서 실제 개발 현장에서 마주할 법한 시나리오를 만들어 볼게요. 사용자 이름이 담긴 슬라이스에서 특정 이름을 가진 사용자를 찾아 환영 메시지를 출력하는 프로그램이에요.
먼저 users := []string{"Kim", "Lee", "Park", "Choi"}와 같이 데이터 목록을 만들어요. 그 다음 for index, name := range users를 사용하여 목록을 하나씩 확인해요. 만약 name == "Park"라면, “찾았다!”라는 메시지와 함께 현재 인덱스를 출력하고 break를 사용하여 반복을 종료해요. 만약 찾지 못했다면 반복문이 끝날 때까지 아무 일도 일어나지 않죠. 이러한 구조는 데이터 처리 로직의 기본 뼈대가 됩니다.
맵(Map)을
range로 순회할 때는 데이터의 순서가 보장되지 않아요. 매번 실행할 때마다 결과 순서가 달라질 수 있다는 점을 반드시 기억하세요.자주 하는 실수와 해결법
반복문을 처음 접할 때는 누구나 실수를 하기 마련이에요. 특히 Go 언어의 특성을 고려하지 않으면 예상치 못한 버그가 발생할 수 있어요. 자주 발생하는 실수 5가지를 정리해 드릴게요.
- ❌ 실수: 증감식을 빠뜨려 무한 루프에 빠지는 경우
왜 발생하는가:i++와 같은 단계적 증가를 적지 않으면 조건식이 영원히 참이 돼요.
✅ 해결법: 반복문의 마지막 단계에서 변수가 어떻게 변하는지 반드시 눈으로 확인하세요. - ❌ 실수: 슬라이스의 범위를 벗어난 인덱스 접근
왜 발생하는가: 반복 횟수를 잘못 계산하여 실제 데이터 크기보다 큰 숫자를 참조하기 때문이에요.
✅ 해결법: 가급적 직접 인덱스를 계산하기보다range를 사용하여 안전하게 순회하세요. - ❌ 실수: 반복문 도중에 슬라이스의 길이를 변경하는 행위
왜 발생하는가: 데이터를 지우거나 추가하면 현재 돌고 있는 인덱스의 위치가 꼬이게 돼요.
✅ 해결법: 원본 데이터를 직접 수정하기보다 새로운 슬라이스에 결과를 담는 방식을 권장해요. - ❌ 실수:
range에서 사용한 변수를 외부에서 잘못 참조하는 경우
왜 발생하는가: (Go 1.22 이전 버전 기준)range의 반복 변수는 매 루프마다 재사용되므로 값이 덮어씌워져요.
✅ 해결법: 루프 안에서 값을 사용할 때는 별도의 변수에 복사해서 사용하거나 최신 Go 버전을 사용하세요. - ❌ 실수:
break를 써야 할 곳에continue를 쓰는 경우
왜 발생하는가: 동작의 차이를 명확히 구분하지 못해 로직이 멈추지 않고 계속 진행돼요.
✅ 해결법: 중단하고 싶은 것인지, 건너뛰고 싶은 것인지 명확히 정의하세요.
자주 묻는 질문
Q. Go에는 왜 while 문이 따로 없나요?
Go의 설계 철학은 최대한 단순하게 만드는 것이에요. for 문 하나만으로 모든 반복을 표현할 수 있기 때문에, 언어의 복잡도를 낮추기 위해 다른 키워드를 과감히 제거한 것이랍니다.
Q. 무한 루프를 만들고 싶을 때는 어떻게 하나요?
아무런 조건식 없이 for { ... }라고만 작성하면 돼요. 이 코드는 조건이 항상 참인 것처럼 동작하여 무한히 반복돼요. 이 경우 반드시 내부에 break를 사용하여 탈출 경로를 만들어 주어야 해요.
Q. range를 쓸 때 인덱스 번호가 필요 없으면 어떻게 하나요?
변수 이름 대신 언더바(_)를 사용하면 돼요. 예컨대 for _, value := range items라고 쓰면 인덱스는 무시하고 값만 가져올 수 있어요.
Q. 반복문 안에서 함수를 호출해도 괜찮은가요?
물론이에요. 하지만 반복 횟수가 매우 많다면 함수 호출로 인한 오버헤드가 성능에 영향을 줄 수 있어요. 반복이 너무 잦다면 로직을 인라인으로 작성하는 것도 고려해 보세요.
마치며: 이제 반복문의 달인이 될 시간이에요
지금까지 Go 언어의 핵심인 for 반복문에 대해 깊이 있게 살펴보았어요. 처음에는 복잡해 보였던 문법들이 이제는 조금 익숙하게 느껴지시나요? 반복문은 단순히 코드를 반복하는 도구가 아니라, 프로그래머가 논리적인 흐름을 설계하는 가장 기초적인 수단이에요.
- 기본 for 문은 초기화, 조건, 증감식으로 구성됩니다.
- while 문이 필요할 땐 조건식만 남긴 for 문을 사용하세요.
- break는 탈출, continue는 건너뛰기를 의미합니다.
- 데이터 순회에는 안전하고 편리한 range 키워드를 적극 활용하세요.
- 무한 루프를 사용할 때는 반드시 탈출 조건을 설계해야 합니다.
오늘 배운 내용을 바탕으로 지금 바로 터미널을 열고 직접 코드를 입력해 보세요. 머리로 이해하는 것과 손끝으로 익히는 것은 하늘과 땅 차이랍니다. 작은 예제부터 시작해서 점점 복잡한 데이터 구조로 범위를 넓혀가 보세요.
오늘 바로 실천할 일:
- 내 컴퓨터에서
go version확인하기 - 1부터 100까지 합계를 구하는 for 문 작성해 보기
- 슬라이스에 담긴 이름을
range로 하나씩 출력해 보기
만약 코드를 작성하다가 막히거나 이해가 가지 않는 부분이 있다면 언제든 댓글로 질문을 남겨 주세요. 여러분의 학습을 진심으로 응원하며, 함께 성장해 나갔으면 좋겠습니다!
더 깊이 있는 Go 프로그래밍을 원하신다면 Go 반복문 완전 정복 가이드 글도 함께 읽어 보시는 것을 추천드려요.