F.R.I.D.A.Y.

C: 반복문 본문

DEV/C C++

C: 반복문

F.R.I.D.A.Y. 2020. 9. 7. 23:24
반응형

 C언어의 반복문에 대해 알아봅니다.


일반적인 코드 작성

 1부터 10까지 차근차근 더하는 코드를 작성해보겠습니다.

#include <stdio.h>

int main(void){
    int total = 0;
    
    total += 1;
    total += 2;
    total += 3;
    total += 4;
    total += 5;
    total += 6;
    total += 7;
    total += 8;
    total += 9;
    total += 10;
    
    printf("1부터 10의 합은 %d 입니다.\n", total);
}

 고작 더하는 값에 열 줄을 작성했습니다. 만일 더해야 하는 범위가 10까지가 아니라 100, 아니 그보다 더 큰 수라면 어떻게 하시겠어요? 이렇게 반복적으로 작업을 해야 하는 것은 많습니다. 그래서 반복문이 생겨났습니다.

 

반복문

 이름 그대로 반복을 위해 생겨난 문법입니다. 크게 세 가지의 반복문이 존재합니다. while, do-while, for 이렇게 말이죠. 먼저 가장 대중적으로 사용되는 for 반복문을 배워보겠습니다.

 

for

 대부분의 코드에서 사용되는 for 반복문입니다. for 반복문의 기본 구조는 다음과 같습니다.

for(초기화식; 탈출 조건; 증감식){
    반복할 코드
}

 설명에는 이해를 돕기 위해 1부터 10까지 더하는 아래의 반복문을 이용합니다.

for(int i = 1; i <= 10; ++i){
    total += i;
    // total = total + i; // 와 같은 코드입니다.
}
초기화식

 반복문을 작성하면서 필요한 변수들의 초기화를 진행하는 부분입니다. 주로 매 반복마다 일정하게 변화하는 변수의 값의 초기 상태를 결정하도록 합니다.

 설명의 코드에서는 처음 1부터 더해야 하므로 변수 i를 선언하고 i의 시작 값을 1로 설정한 모습을 볼 수 있습니다. 여기 <초기화식> 부분에서는 예시 코드에서처럼 변수의 선언이 가능합니다.[# 이 초기화식 부분에서 선언한 변수는 해당 반복문 안쪽에서만 사용할 수 있습니다] 또한, 밖에서 이미 선언한 변수도 이용할 수 있습니다.

 만일 초기화식 부분에서 변수를 선언하지 않았더래도 아래처럼 사용할 수 있습니다.

int i;
for( i = 1; i <= 10; ++i){
    total += i;
}

 이렇게 반복문의 초기화식 밖에서 선언한 변수는 반복문이 끝나더라도 이용 가능하므로 여러 방면으로도 사용할 수 있습니다.[# 요즘은 초기화식 안에서 변수를 선언하는 것을 제공하지만, 옛날에는 기술적 제한으로 변수는 모두 함수의 시작 부분, 예컨대 main 함수에서는 다른 모든 명령을 실행하기 전에 작성해야 했습니다.]

 

탈출 조건

 반복문은 꼭 탈출 조건이 필요합니다. 그렇지 않으면 무한 반복이 이루어져 경우에 따라서는 프로그램이 응답 안함 상태에 빠지기도 합니다. 탈출 조건은 어디에서부터 어디까지 라는 범위가 정해져 있을 때, 어디까지에 해당하는 부분입니다.[# 어디에서부터가 초기화식이죠]

 반복문은 이 탈출 조건의 연산이 거짓(false)이 나올 때까지 반복합니다. 위 예시 코드에서 조건문은 <i의 값이 10 이하>입니다. 따라서 i가 11이 되기 전에는 연산의 결과가 참(true)을 가지므로 계속해서 아래의 명령을 수행합니다.

total += i;

 탈출 조건의 핵심은 "탈출 조건의 연산값이 거짓이 나와야 반복하지 않는다"입니다. 따라서 조건식을 넣지 않더라도 상수를 넣어 탈출 조건을 만들 수 있습니다.

더보기

# 참과 거짓?

C언어에서 참의 대푯값은 1이며, 거짓은 0입니다. 여기서 중요한 점은 1이 참이 아니라 "대푯값"이라는 점입니다. 달리 말해서, 0은 거짓이며 그 외의 모든 수는 참입니다. 간결히 하기 위해 1을 대푯값으로 둔 것뿐이죠. [0.1]이든 [0.000000001]이든 0이 아니므로 참입니다.

 

# 참 = True, 거짓 = False

 

증감식

 예시 코드는 1부터 10까지 더하는 코드입니다. 처음 반복에서 i는 초기화식에 의해 값으로 1을 가집니다. 반복하는 코드에서는 total에 i값을 더합니다. 그럼 i값이 1에서 2로, 2에서 3으로... 9에서 10으로 증가하면서 값을 더해야겠죠. 이 증가를 증감식에서 합니다. 말처럼 예시 코드에서 필요한 증가만 하는 것이 아니라 감소도 할 수 있습니다. 또, 값을 1씩 줄이는 것이 아니라 2, 혹은 3 이상으로 증감시킬 수도 있습니다.

 

while

 while 반복문도 for 반복문 못지않게 자주 사용하는 문법입니다. while 반복문은 아래와 같은 기본 식을 가집니다.

while(탈출 조건){
    // 반복 명령
}
더보기

# 다른 곳에서 설명하는 기본 구조와 다르네요?

 다른 여러 곳에서 설명하는 구조는 아마 아래의 코드와 유사할 것입니다.

// 초기화식
int i = 0;

while(i < 10 /* 탈출 조건 */){
    // 반복 명령
    
    i++; // 증감식
}

 이렇게 설명하지 않은 이유는 이 코드가 for 반복문에 영향을 받기 때문입니다. 애초에 실 사용할 때, for 반복문과 while 반복문을 사용하는 분야가 따로 있습니다. 어느 분야에서 던 for 반복문이나 while 반복문이나 사용하는 것에는 문제가 없지만 모양새에서 사용하는 분야가 갈립니다.

 

 for 반복문의 경우 시작과 끝이 눈에 보이다 보니 주로 범위가 한정된 반복[# 예컨대 수를 더하던지, 배열을 사용하는 등의 행위]을 할 때 사용한다면, while 반복문은 시작과 끝이 눈에 드러나 있지 않습니다. 그래서 while 반복문은 주로 범위는 한정되어있지 않지만 어떤 특정 대상을 찾을 때, 혹은 끝을 알 수는 없지만 분명한 탈출 조건이 있을 때[# 문자열 탐색 등] 주로 사용하곤 합니다.

 

 결국은 사용하는 개발자의 선호에 따라 갈리는 것이므로, 무엇이 옳다 아니다를 논할 수 있는 문제는 아닙니다.

 

 while 반복문은 위 접은글을 보셨다면 아시겠지만 유한 범위의 반복을 할 때보다는 반복할 수가 특정되지 않을 때 사용합니다.

 예컨대 C언어에서 문자열에서 특정 문자를 찾는 경우 등을 볼 수 있겠네요.

 

do-while

 가장 사용 빈도가 낮은 반복문입니다. 어떤 경우에서던 꼭 한번은 실행을 해야하는 반복을 할 때 이 do-while 반복문을 사용합니다. 실행을 일단 한다는 특성상, for 반복문이나 while 반복문에 비해서는 사용 빈도수가 낮습니다.

do{
   // 반복할 코드
}while(/*탈출 조건*/);

 이 문법의 핵심은 크게 두 가지 입니다. 반복 대상이 되는 명령 집합[# 중괄호로 둘러싸인 부분]이 탈출 조건보다 앞선다는 점, 이로 인해 탈출하기 전에 한 번은 실행을 하게 되는 것입니다. 다른 하나는 while(탈출 조건) 뒤에 꼭 세미콜론을 작성해주어야 한다는 점입니다. 세미콜론을 작성하는것까지가 문법입니다.

 

 이 반복문을 주로 사용할 때는 앞에 설명한 특성을 이용해야 할 때입니다. 데이터의 형식을 검사하거나, 범위를 제한하는 등의 행위가 필요할 때이겠죠. 이 작업을 하려면 무조건 입력이 있어야 할테니까요.

int a,b;

do{
    scanf("%d %d", &a, &b);
}while( !(a < 20 && b < 40) ); // a가 20 이상, 혹은 b가 40 이상이면 반복

 위 코드에서 a와 b 중 하나라도 범위를 벗어난 값을 넣으면 정상 범위의 데이터를 받을 때까지 무한정 입력을 받도록 코드가 반복됩니다.

 


반복문의 종류가 많은 이유

 포장을 하면 개인의 취향을 존중해주고자 생긴 것입니다. 옛날, C언어가 태동할 적에는 C언어가 존재하지 않으니 다른 언어를 사용하던 개발자들이 있었겠죠. C언어 개발팀은 이들을 포용할 필요가 있었습니다. 사람들이 사용하지 않으면 그 아무리 좋은 것이라도 사라지고 말테니까요. 그 시대 각 언어들이 제공하던 반복문을 비슷하게 따와야 그 언어를 사용하던 사람들이 C언어도 사용할테니 반복문도 여러 개가 되었겠죠?

 이 이야기는 비단 반복문에서 끝나지는 않습니다. 찾아보면 goto라는 구문도 결국 다른 언어 사용자들을 끌어들이기 위해 C언어에 집어넣은 문법이 됩니다. 절차지향을 지향하는 C언어의 패러다임에서 goto는 자신의 패러다임을 깨트리는, 그럼에도 사용자를 끌어들이기 위한. C언어 개발자들에겐 필요악같은 존재가 아니었을까요? [# 물론, goto 구문이 나쁜 것은 아니지만 잘 사용하지 않으면 코드 분석을 어렵게하고 진행순서를 파악하는것을 어렵게 하는 존재입니다. 따라서 자신이 정말 자신있지 않으면 되도록 지양하기 바랍니다.]

 

 마음대로 사용하되, 여러 사람들이 이용해야 할 코드라면 각 반복문이 주로 이용되는 영역이 있으니, 관례를 지켜줍시다 :)

# index

728x90
반응형
Comments