
반복되는 코드의 굴레에서 벗어나는 법
열심히 코드를 작성하고 있는데, 갑자기 똑같은 코드를 수십 번 복사해서 붙여넣고 있는 자신을 발견한 적이 있나요? 분명히 같은 동작을 수행하는 코드인데, 변수 숫자만 하나씩 바꿔가며 입력하고 있다면 그것은 C# 반복문 용어와 개념을 제대로 활용하지 못하고 있다는 신호예요. 단순히 코드가 길어지는 문제를 넘어, 나중에 숫자를 하나만 바꿔야 할 때 수십 곳을 일일이 수정해야 하는 재앙이 찾아올 수 있어요.
주니어 개발자들이 실무 프로젝트에 투입되었을 때 가장 당황하는 순간 중 하나도 바로 이 지점이에요. 로직은 맞는데 코드가 너무 지저분해서 선임 개발자에게 피드백을 받거나, 반복문 조건식을 잘못 설정해서 프로그램이 멈추지 않고 계속 돌아가는 무한 루프에 빠지기도 하죠. 이런 실수는 단순히 기술적인 실수가 아니라, 반복문의 동작 원리를 명확하게 이해하지 못했을 때 발생해요.
오늘 이 글을 통해 여러분은 단순히 문법을 외우는 단계를 넘어, 어떤 상황에서 어떤 반복문을 꺼내 써야 하는지 판단할 수 있는 눈을 갖게 될 거예요. .NET Framework 환경에서 효율적으로 코드를 제어하는 능력을 키우면, 여러분의 코드는 훨씬 간결하고 전문적으로 변할 거예요.
이 글에서는 다음과 같은 내용을 중점적으로 다뤄요.
- 실무에서 반드시 쓰이는 핵심 반복문 용어 정리
- 상황별 최적의 반복문 선택 기준
- 가장 자주 실수하는 무한 루프와 인덱스 오류 해결법
- 실제 코드로 보는 반복문 활용 시나리오
반복문을 다루기 위한 필수 기초 지식
반복문을 본격적으로 작성하기 전에, 코드가 어떻게 움직이는지 설명하는 기초 언어들을 먼저 익혀야 해요. 이 용어들을 모르면 개발 커뮤니티에서 질문을 하거나 공식 문서를 읽을 때 마치 외국어를 듣는 것처럼 막막할 수 있어요. 반복문의 메커니즘을 이해하는 것은 설계도를 읽는 것과 같답니다.
반드시 알아야 할 핵심 용어
가장 먼저 반복(Iteration)이라는 단어에 익숙해져야 해요. 반복문이 한 번 실행되는 단위를 ‘한 번의 반복’이라고 부르며, 이 과정이 전체적으로 일어나는 것을 반복이라고 해요. 반복이 일어날 때마다 기준이 되는 값을 체크하는 것을 조건식(Condition)이라고 부르며, 이 조건이 참(true)인지 거짓(false)인지에 따라 다음 동작이 결정돼요.
또한, 반복이 계속될 수 있도록 변수의 값을 변화시키는 증감식(Increment/Decrement)도 매우 중요해요. 숫자를 1씩 늘리거나 줄이는 행위가 없으면 컴퓨터는 언제 멈춰야 할지 몰라 영원히 코드를 실행하게 되거든요. 이렇게 멈추지 않고 계속 돌아가는 상태를 무한 루프(Infinite Loop)라고 하며, 이는 실제 서비스 중인 프로그램에서 치명적인 장애를 일으키는 주범이 돼요.
반복문 유형별 선택 기준 비교
모든 반복문이 똑같은 역할을 하는 것은 아니에요. 상황에 맞지 않는 반복문을 사용하면 코드가 복잡해지고 성능이 떨어질 수 있어요. 아래 표를 통해 어떤 상황에 어떤 방식을 선택해야 하는지 확인해 보세요.
| 반복문 유형 | 주요 특징 | 가장 적합한 상황 |
|---|---|---|
| for 문 | 횟수가 명확하게 정해져 있음 | 정해진 숫자만큼 반복할 때 |
| while 문 | 조건이 참인 동안 계속 실행 | 종료 시점을 미리 알 수 없을 때 |
| do-while 문 | 최소 1회는 무조건 실행 | 조건 체크 전에 행동이 먼저 필요할 때 |
| foreach 문 | 컬렉션의 모든 요소를 순회 | 배열이나 리스트 전체를 훑을 때 |
반복문을 선택할 때 가장 먼저 스스로에게 물어보세요. “나는 몇 번을 반복할지 알고 있는가?” 만약 알고 있다면 for 문이 가장 깔끔하고, 모른다면 while 문이나 foreach 문이 유리해요.
실전 C# 반복문 활용 단계별 가이드
이제 이론을 넘어 실제 코드로 어떻게 구현하는지 알아볼게요. C# 프로그래밍의 핵심인 네 가지 주요 반복문을 단계별로 쪼개어 살펴볼 거예요. 각 단계의 예시를 머릿속으로 그리며 따라와 주세요.
STEP 1. 횟수가 정해진 경우의 정석, for 문
for 문은 반복 횟수가 명확할 때 사용하는 가장 강력한 도구예요. 초기화식, 조건식, 증감식이 한 줄에 모여 있어 구조를 한눈에 파악하기 매우 좋답니다. 예를 들어, 1부터 10까지 숫자를 출력해야 한다면 for 문이 정답이에요.
for 문의 구조를 보면 첫 번째 부분에서 시작 숫자를 정하고, 두 번째 부분에서 언제까지 할지 결정하며, 세 번째 부분에서 숫자를 어떻게 바꿀지 정해요. 이 세 가지가 유기적으로 맞물려 돌아가죠. 만약 100번의 데이터를 처리해야 하는 루프를 만든다면 for 문만큼 직관적인 것은 없어요. 하지만 주의할 점이 있어요. 조건식을 너무 복잡하게 짜거나 증감식을 생략하면 의도치 않은 결과를 초래할 수 있으니 항상 단순하게 유지하는 것이 좋아요.
STEP 2. 조건이 맞을 때까지 달리는 while 문
while 문은 “횟수”보다는 “상태”에 집중해요. 특정 조건이 참(true)인 동안에는 계속해서 코드를 실행하죠. 예를 들어, 사용자가 ‘종료’를 입력하기 전까지 계속해서 메뉴를 보여주는 프로그램을 만든다면 while 문이 가장 자연스러워요. 종료 시점이 숫자로 정해져 있는 게 아니라 사용자의 입력이라는 상황에 따라 달라지기 때문이에요.
while 문을 사용할 때 가장 위험한 것은 조건식이 영원히 참이 되는 상황이에요. 루프 내부에서 조건을 거짓으로 만들어줄 장치(예: 사용자의 입력값 변경)가 없다면 프로그램은 응답 없음 상태에 빠지게 돼요. 그래서 while 문을 쓸 때는 루프 안에서 조건에 영향을 주는 코드가 반드시 포함되어 있는지 검토해야 해요.
STEP 3. 일단 실행하고 보는 do-while 문
while 문과 비슷해 보이지만 결정적인 차이가 있는 것이 바로 do-while 문이에요. while 문은 시작하기 전에 조건을 먼저 검사하지만, do-while 문은 일단 코드를 한 번 실행한 뒤에 조건을 검사해요. 즉, 조건이 처음부터 거짓이라 하더라도 최소한 한 번은 반드시 실행된다는 점이 핵심이에요.
실무에서는 사용자에게 입력을 먼저 받고, 그 입력값이 올바른지 검사한 뒤 다시 입력을 요청하는 로직을 짤 때 아주 유용해요. “일단 입력을 받아라, 그리고 그 입력이 틀렸으면 다시 해라”라는 흐름이 do-while 문과 완벽하게 일치하거든요. 조건의 위치가 실행 순서를 바꾼다는 이 작은 차이를 이해하는 것이 숙련된 개발자로 가는 길이에요.
STEP 4. 컬렉션 탐험의 최강자, foreach 문
현대적인 C# 프로그래밍에서 가장 많이 쓰이는 형태는 바로 foreach 문이에요. 리스트(List)나 배열(Array) 같은 데이터 묶음(컬렉션) 안에 들어있는 모든 아이템을 하나씩 꺼내서 작업할 때 사용해요. for 문처럼 인덱스(index) 숫자를 직접 다룰 필요가 없어서 코드가 매우 간결하고 읽기 쉬워요.
예를 들어, 쇼핑몰의 장바구니에 담긴 상품 목록을 하나씩 출력할 때 foreach 문을 쓰면 “첫 번째 상품, 두 번째 상품…” 하고 숫자를 셀 필요 없이 “장바구니의 각 상품에 대하여”라고 바로 명령을 내릴 수 있어요. 다만, foreach 문을 사용하는 도중에 리스트의 항목을 삭제하거나 추가하는 것은 금지되어 있어요. 반복 중인 대상의 형태가 바뀌면 컴퓨터가 길을 잃기 때문이죠. 이 규칙은 실무에서 빈번하게 발생하는 오류 중 하나이니 꼭 기억해 두세요.
STEP 5. 흐름을 제어하는 마법, break와 continue
반복문 안에서도 상황에 따라 흐름을 끊거나 건너뛰어야 할 때가 있어요. 이때 사용하는 것이 break와 continue예요. break는 말 그대로 반복문을 즉시 탈출하여 밖으로 나가는 명령이에요. 원하는 데이터를 찾았을 때 더 이상 루프를 돌 필요가 없으므로 break를 써서 효율을 높여요.
반면 continue는 “이번 차례는 여기까지만 하고, 다음 차례로 넘어가자”라는 뜻이에요. 특정 조건에 맞는 데이터만 제외하고 싶을 때 사용하죠. 예를 들어, 1부터 10까지 출력하되 5만 빼고 싶다면, 5를 만났을 때 continue를 호출하면 돼요. 이 두 키워드를 적절히 섞어 쓰면 복잡한 조건문 없이도 아주 깔끔한 로직을 설계할 수 있어요.
쇼핑몰 시스템을 만든다고 가정해 봅시다. 전체 상품 목록을 보여줄 때는 foreach를, 결제까지 남은 횟수를 카운트할 때는 for를, 사용자가 결제를 완료할 때까지 기다릴 때는 while을 사용하는 것이 가장 논리적인 설계예요.
자주 하는 실수와 해결법
반복문을 공부하다 보면 누구나 한 번쯤은 겪게 되는 실수들이 있어요. 문제를 미리 알고 있으면 당황하지 않고 대처할 수 있답니다.
- ❌ 인덱스 범위를 벗어나는 오류(IndexOutOfRangeException)
왜 발생하나요? 배열의 크기가 10인데, 반복문을 11번 돌리려고 할 때 발생해요. 보통 조건식에 <=를 써서 마지막 인덱스보다 하나 더 많이 접근할 때 생겨요.
✅ 해결법: 배열의 길이를 사용할 때는 항상 i < array.Length 처럼 작다 기호를 사용하여 마지막 인덱스를 넘지 않도록 주의하세요. - ❌ 끝나지 않는 무한 루프
왜 발생하나요? 조건식이 항상 true로 유지되거나, 증감식이 빠졌을 때 발생해요.
✅ 해결법: 루프가 끝날 수 있는 명확한 탈출 조건이 있는지, 그리고 루프 안에서 그 조건을 만족시키는 변화가 일어나는지 반드시 확인하세요. - ❌ foreach 문 안에서 컬렉션 수정하기
왜 발생하나요? 반복 중인 리스트의 요소를 삭제하거나 추가하면, 반복 엔진이 다음에 읽어야 할 위치를 찾지 못해 에러가 나요.
✅ 해결법: 요소를 삭제해야 한다면 foreach 대신 for 문을 사용하고, 인덱스를 뒤에서부터 거꾸로 줄여가며 삭제하는 방식을 권장해요. - ❌ break와 return의 혼동
왜 발생하나요? 반복문만 빠져나가고 싶은데 함수 전체를 끝내버리는 실수를 해요.
✅ 해결법: 현재 위치한 반복문만 탈출하고 싶다면 반드시 break를 사용하세요. return은 메서드 자체를 종료시킨다는 점을 잊지 마세요.
자주 묻는 질문
Q. for 문과 while 문은 결과가 같으면 아무거나 써도 되나요?
결과는 같을 수 있지만, 코드의 의도(Intent)가 달라요. 횟수가 정해져 있다면 for 문을 써야 다른 개발자가 코드를 볼 때 “아, 이건 몇 번 돌겠구나”라고 바로 이해할 수 있어요. 가독성 측면에서 훨씬 유리하답니다.
Q. 중첩 반복문(반복문 안에 반복문)을 사용해도 성능에 문제가 없나요?
중첩 루프는 데이터 양이 많아지면 실행 시간이 기하급수적으로 늘어날 수 있어요. 데이터가 아주 많다면 이중 루프 대신 딕셔너리(Dictionary) 같은 자료구조를 활용하여 효율을 높이는 방법을 고민해야 해요.
Q. foreach 문은 for 문보다 무조건 느린가요?
과거에는 차이가 있었지만, 최신 .NET 환경에서는 컴파일러 최적화 덕분에 거의 차이가 없어요. 오히려 안전하고 읽기 쉬운 foreach를 우선적으로 사용하는 것이 실무적인 관점에서는 더 좋은 선택이에요.
Q. 반복문 안에서 if 문을 너무 많이 쓰면 어떻게 하나요?
조건이 너무 복잡하다면 반복문 내부의 로직을 별도의 메서드로 분리해 보세요. 반복문은 “무엇을 반복할 것인가”에 집중하고, 메서드는 “어떻게 처리할 것인가”를 담당하게 하면 코드가 훨씬 깨끗해져요.
성장을 위한 마지막 체크리스트
오늘 배운 내용을 바탕으로 여러분의 코드를 다시 한번 검토해 보세요. 작은 차이가 프로페셔널한 개발자와 초보 개발자를 가르는 기준이 됩니다.
- 정해진 횟수는 for, 조건 중심은 while, 최소 1회 실행은 do-while을 선택하세요.
- 컬렉션 전체를 순회할 때는 안전한 foreach가 가장 좋습니다.
- 무한 루프를 막기 위해 증감식과 종료 조건을 항상 점검하세요.
- IndexOutOfRangeException을 피하려면 배열 범위를 확인하세요.
- 반복 도중 컬렉션 수정은 for 문과 역순 인덱스를 활용하세요.
- break와 continue로 흐름을 정교하게 제어하세요.
오늘 배운 내용을 실무에 바로 적용해 보고 싶다면, 지금 바로 연습용 프로젝트에서 작은 리스트를 만들어 foreach 문으로 출력하는 것부터 시작해 보세요. 직접 타이핑하고 오류를 마주해 보는 것이 가장 빠른 학습법이에요.
이번 주에 할 일: 오늘 배운 반복문 유형 4가지를 각각 활용한 아주 작은 예제 코드를 직접 작성해 보세요.
실행 직전 할 일: 작성한 코드에 무한 루프의 위험은 없는지, 인덱스 범위는 안전한지 눈으로 직접 확인해 보세요.
반복문 마스터가 되셨나요? 그렇다면 다음 단계로 넘어가 볼 시간이에요. 로직의 흐름을 결정하는 또 다른 핵심, C# 조건문 관련 글을 통해 제어문의 완성을 경험해 보세요. 여러분의 성장을 응원합니다!