
반복되는 코드의 늪에서 벗어나는 법
개발을 하다 보면 똑같은 코드를 열 번, 아니 백 번 넘게 복사해서 붙여넣고 있는 자신을 발견할 때가 있어요. 화면을 가득 채운 `Console.WriteLine(“안녕하세요!”);` 문장들을 보며 ‘이걸 언제 다 일일이 치고 있지?’라는 막막함이 밀려오기도 하죠. 겨우 복사해서 붙여넣었다 해도, 나중에 문구 하나를 수정해야 한다면 수십 개의 줄을 찾아다니며 수정해야 하는 끔찍한 상황이 펼쳐져요.
이런 비효율적인 상황은 단순한 귀찮음을 넘어 코드의 가독성을 해치고, 결정적으로 치명적인 실수를 유발하는 원인이 돼요. 하나를 고칠 때 하나를 놓치는 순간, 프로그램은 예상치 못한 곳에서 오류를 뿜어내며 멈춰버리거든요. 반복문을 모른다는 것은 프로그래밍의 자동화라는 가장 큰 무기를 포기하는 것과 같아요.
오늘 이 C# 반복문 튜토리얼을 마치고 나면, 여러분은 단 몇 줄의 코드로 수만 번의 작업을 순식간에 처리하는 마법을 부릴 수 있게 돼요. 단순히 문법을 외우는 수준을 넘어, 어떤 상황에서 어떤 반복문을 꺼내 써야 가장 효율적인지 판단하는 감각까지 갖추게 될 거예요.
이번 가이드에서는 다음과 같은 핵심 내용을 차근차근 다룰 예정이에요.
- 상황별로 골라 쓰는 네 가지 핵심 반복문 종류
- 실무에서 바로 써먹는 구체적인 코드 활용 시나리오
- 무한 루프와 인덱스 오류를 피하는 실전 디버깅 팁
- 효율적인 컬렉션 순회를 위한 최신 C# 기법
반복문을 다루기 위한 기초 체력 기르기
반복문을 배우기 전에 반드시 이해해야 하는 개념이 있어요. 바로 제어 흐름(Control Flow)이에요. 프로그램은 기본적으로 위에서 아래로 흐르지만, 반복문은 이 흐름을 특정 지점으로 되돌려 보내는 역할을 해요. 이때 흐름을 결정하는 것은 ‘조건식’이며, 이 조건이 참인지 거짓인지에 따라 프로그램의 운명이 갈려요.
반복문을 설계할 때는 세 가지 구성 요소를 머릿속에 그려두는 것이 좋아요. 첫 번째는 시작점(초기화)이에요. 어디서부터 시작할 것인가를 정하는 거죠. 두 번째는 종료 조건이에요. 언제까지 반복할 것인가를 명시해야 해요. 마지막은 변화(증감)이에요. 한 번 돌 때마다 조건을 어떻게 변화시켜 종료 지점에 다다를 것인가를 결정해요.
이 세 가지 중 하나라도 빠지거나 잘못 설정되면, 프로그램은 영원히 멈추지 않는 무한 루프에 빠지게 돼요. 이는 컴퓨터의 자원을 순식간에 고갈시켜 시스템을 멈추게 만들 수 있는 위험한 행동이에요.
반복문 내부에서 사용하는 변수를 ‘루프 제어 변수’라고 불러요. 이 변수의 값이 조건식에 직접적인 영향을 미치기 때문에, 값이 변하는 과정을 면밀히 관찰하는 습관이 필요해요.
상황에 맞는 최적의 반복문을 선택하는 것은 코드의 성능과 가독성을 결정짓는 매우 중요한 기준이 돼요. 아래 표를 통해 각 반복문의 특징을 비교해 보세요.
| 반복문 종류 | 주요 특징 | 권장 사용 상황 |
|---|---|---|
| for | 인덱스 변수를 직접 제어함 | 반복 횟수가 명확하게 정해져 있을 때 |
| while | 조건식의 결과에만 의존함 | 언제 끝날지 모르는 상태에서 조건이 유지될 때 |
| do-while | 조건 검사를 마지막에 수행함 | 최소한 한 번은 반드시 실행해야 할 때 |
| foreach | 컬렉션의 요소를 순차적으로 읽음 | 배열이나 리스트의 모든 값을 읽을 때 |
이제 이 기본 개념들을 바탕으로, 실제 C# 프로그래밍 환경에서 각 반복문이 어떻게 구동되는지 구체적인 단계별 예제를 통해 파헤쳐 볼게요.
실무에서 바로 쓰는 C# 반복문 4종 세트
반복문의 이론을 익혔다면, 이제는 실제 코드가 어떤 흐름으로 움직이는지 눈으로 확인해야 할 때예요. 각 반복문은 저마다의 ‘전공 분야’가 다르기 때문에, 상황에 맞춰 적재적소에 배치하는 연습이 필요해요.
STEP 1. 횟수가 정해진 반복의 정석, for 문
for 문은 가장 강력하고 정밀한 제어력을 가진 반복문이에요. 우리가 반복해야 할 횟수를 정확히 알고 있을 때, 혹은 인덱스 번호(0, 1, 2…)를 직접 다뤄야 할 때 이보다 좋은 도구는 없어요. for 문은 하나의 문장 안에 초기화, 조건식, 증감식을 모두 담고 있어 코드의 흐름이 한눈에 들어온다는 장점이 있어요.
예를 들어, 1부터 10까지 숫자를 출력하고 싶다면 for 문을 사용해요. 먼저 변수 `i`를 1로 설정하고, `i`가 10보다 작거나 같을 동안 계속 실행하며, 한 번 실행할 때마다 `i`를 1씩 증가시키는 구조예요. 이 과정에서 인덱스 `i`는 반복문의 진행 상황을 나타내는 나침반 역할을 수행하게 돼요.
for 문에서 증감식을 `i++`가 아닌 `i += 2`로 설정하면 숫자를 두 칸씩 건너뛰며 반복할 수 있어요. 이처럼 제어 변수를 자유자재로 조절할 수 있는 것이 for 문만의 매력이에요.
STEP 2. 조건이 충족될 때까지 멈추지 않는 while 문
while 문은 횟수보다는 상태에 집중하는 반복문이에요.
자주 하는 실수와 해결법
반복문을 작성하다 보면 누구나 한 번쯤은 골치 아픈 오류에 직면하게 돼요. 숙련된 개발자라 할지라도 논리적인 허점은 언제든 생길 수 있죠. 자주 발생하는 대표적인 실수 패턴들을 정리했으니, 코드를 짜기 전에 한 번씩 체크해 보세요.
❌ 인덱스 범위 초과 (IndexOutOfRangeException)
왜 발생하는가: for 문에서 조건을 설정할 때 `i <= array.Length`처럼 등호를 잘못 붙여 배열의 마지막 범위를 넘어가는 경우예요. 배열은 0부터 시작하는데 길이를 기준으로 접근하면 마지막 칸을 넘어버리거든요.
✅ 해결법: 항상 조건을 `i < array.Length`로 설정하여 마지막 인덱스 하나 앞까지만 접근하도록 주의하세요.
❌ 무한 루프에 의한 프로그램 먹통
왜 발생하는가: while 문을 쓸 때 조건식을 거짓으로 만들어줄 변수의 값을 업데이트하지 않았을 때 발생해요. 루프 안에서 데이터가 변하지 않으니 조건은 영원히 참(true) 상태로 머물게 되죠.
✅ 해결법: 루프 내부에서 조건식에 영향을 주는 변수가 반드시 적절하게 변화하고 있는지 코드를 한 줄씩 따라가며 확인하세요.
❌ 컬렉션 수정 오류 (InvalidOperationException)
왜 발생하는가: foreach 문으로 리스트를 순회하는 도중에 리스트에 요소를 추가하거나 삭제하려고 하면 발생해요. 반복문이 ‘지금 어디를 읽고 있는지’ 혼란을 느끼기 때문이죠.
✅ 해결법: 반복 중에 요소를 삭제해야 한다면 foreach 대신 역순으로 도는 for 문을 사용하거나, 삭제할 항목들을 별도의 리스트에 모아두었다가 반복이 끝난 뒤에 처리하세요.
❌ 의도치 않은 조기 종료
왜 발생하는가: 중첩 반복문에서 안쪽 루프를 끝내고 싶어 break를 썼는데, 바깥쪽 루프까지 통째로 종료되어 버리는 경우예요. break는 자신을 감싸고 있는 가장 가까운 반복문 하나만 탈출하기 때문이죠.
✅ 해결법: 중첩 루프를 제어할 때는 플래그 변수(bool)를 활용하거나, 로직을 별도의 메서드로 분리하여 return을 사용하는 방식을 고려해 보세요.
자주 묻는 질문
Q. for 문과 while 문 중 어떤 것을 써야 할지 모르겠겠어요.
가장 쉬운 기준은 ‘횟수’예요. 반복할 횟수가 숫자로 딱 정해져 있다면 for 문이 가독성 면에서 압승이에요. 반면, ‘어떤 조건이 만족될 때까지’라는 개념이 더 강하다면 while 문이 훨씬 자연스러워요.
Q. foreach 문을 쓰면 for 문보다 성능이 느린가요?
아주 미세한 차이는 있을 수 있지만, 현대의 .NET Framework 환경에서는 무시해도 될 수준이에요. 오히려 코드의 안전성과 가독성이라는 엄청난 이득을 얻을 수 있기 때문에, 특별한 성능 최적화가 필요한 극단적인 상황이 아니라면 foreach 사용을 강력히 추천해요.
Q. break와 continue의 차이가 정확히 뭔가요?
break는 반복문 자체를 아예 파괴하고 밖으로 나가는 것이고, continue는
마스터를 위한 마지막 정리
지금까지 C# 반복문의 모든 것을 살펴보았어요. 반복문은 단순한 문법을 넘어, 프로그래머가 컴퓨터에게 ‘노동’을 시키는 가장 핵심적인 수단이에요. 오늘 배운 내용을 바탕으로 여러분의 코드가 훨씬 간결하고 강력해지길 바라요.
- 횟수가 명확할 때는 for 문을 선택하세요.
- 조건이 중요할 때는 while 문을 사용하세요.
- 최소 1회 실행이 필요하면 do-while 문이 답입니다.
- 컬렉션 순회는 안전한 foreach 문이 최고예요.
- 무한 루프 방지를 위해 조건 변화를 항상 점검하세요.
- 인덱스 오류를 피하려면 범위 설정을 철저히 하세요.
반복문을 익히는 것은 프로그래밍이라는 거대한 성을 쌓기 위한 튼튼한 주춧돌을 놓는 작업과 같아요. 이제 이론은 충분해요. 머리로 이해한 것을 손끝으로 익히는 과정이 남았습니다.
오늘 바로 할 일: Visual Studio를 켜고, 1부터 100까지의 숫자 중 짝수만 출력하는 for 문을 직접 작성해 보세요.
이번 주 할 일: 리스트(List)에 이름 5개를 넣고, foreach 문을 이용해 각 이름을 인사하는 문장으로 출력해 보세요.
실행 직전 할 일: 반복문 안에서 조건에 따라 break와 continue를 섞어 쓰는 시나리오를 머릿속으로 그려보세요.
예제 코드를 직접 따라 하며 오늘 바로 익혀 보세요. 작은 성공이 모여 거대한 실력이 됩니다. 반복문을 마스터했다면, 이제 프로그램의 흐름을 더욱 정교하게 제어할 수 있는 C# 조건문 관련 글로 넘어가 논리의 깊이를 더해보는 건 어떨까요?