티스토리 뷰

반응형

2021.10.24 - [코딩 공부/C 언어] - [C언어 기초] 반복문 while

 

[C언어 기초] 반복문 while

2021.10.16 - [코딩 공부/C 언어] - [C언어 기초] 조건문 switch [C언어 기초] 조건문 switch 2021.10.10 - [코딩 공부/C 언어] - [C언어 기초] if ~ else와 else if [C언어 기초] if ~ else와 else if 2021.10.05..

hgu-can.tistory.com

2021.10.31 - [코딩 공부/C 언어] - [C언어 기초] 반복문 do ~ while

 

[C언어 기초] 반복문 do ~ while

2021.10.24 - [코딩 공부/C 언어] - [C언어 기초] 반복문 while [C언어 기초] 반복문 while 2021.10.16 - [코딩 공부/C 언어] - [C언어 기초] 조건문 switch [C언어 기초] 조건문 switch 2021.10.10 - [코딩 공부/..

hgu-can.tistory.com

 

저번 시간까지 반복문 while에 대해 알아보았습니다. 

이번에는 while과 비슷하지만 형태가 약간 다른 for문에 대해 배워보겠습니다. 

 


 

반복문 for

 

 우리가 지금까지 배운 while 문에서는 반복문이 무한 루프에 빠지지 않게 하는 탈출 조건을 적어줄 때 따로따로 적어줘야 했어요. 

 

int i = 0; //초기값
while (5 >= i) //조건식
{
    printf("%d", i);
    i++; //증감식
}

 

 이런 식으로요. 

 근데 쓰다 보면 i++;를 까먹고 안 쓸수도 있고 또 매번 저렇게 따로 쓰려니까 좀 번거롭기도 하고 코드도 쓸데없이 좀 길어지는 것 같구... 약간 비효율적인 거 같기도 하잖아요? 일단 저 코드에서 i++;를 까먹고 쓰지 않고 코드를 실행 해버리면 프로그램 자체가 무한루프에 빠져 버리니깐요... 쬐끔 위험하단 생각도 들어요. 

 그래서 이런 단점을 보완해서 쓸 수 있는 것이 for 문입니다. while 처럼 조건식을 평가해서 종속 문장을 반복 실행하는 것은 똑같지만 형태가 약간 다릅니다. 

 

for (초기값; 조건식; 증감식)
{
    종속문장;
}

 

 for 문은 이렇게 생겼습니다. 초기값과 조건식 증감식을 한 줄에 몰아서 쓰니까 while 문에 비해 조금 깔끔하게 쓸 수 있겠다는 느낌이 들죠~??

 

#include <stdio.h>

void main()
{
    int sum = 0;
    for (int i = 10; 1 <= i; i--)
    {
        sum += i;
    }
        
    printf("Sum : %d", sum);
}

 

 그럼 비주얼 스튜디오를 켜서 이 코드를 적어봅시다. 

 초기값으로는 i를 10이라 설정해 주었고 

 조건식으로는 i가 1보다 크거나 같을 때까지 반복하라고 정해 주었습니다. 

 마지막으로 증감식으로는 종속문장들의 실행이 끝날 때마다 i를 1씩 감소시키라고 했습니다. 

 종합하자면 i가 10부터 시작하는데 i가 1보다 크거나 같을 때까지 1씩 감소시키면서 sum에 더하는 것을 반복하라는 뜻이 되네요! 이 말은 10~1까지의 누적 합계를 구해라는 말과 같다는 것을 알 수 있습니다. 

 

 

 실행해 보면 10 ~ 1까지의 누적합계를 구해주는 것을 볼 수 있습니다. 결과 자체는 while 문이랑 다를 것이 없죠?

 

#include <stdio.h>

void main()
{
	int i, sum = 0;
	for (i = 10; 1 <= i; i--)
		sum += i;
        
	printf("Sum : %d", sum);
}

 

 위 코드는 이렇게 쓸 수도 있습니다. 차이점이라면 int i 의 선언을 for 문 밖에서 했느냐 아니냐 차이죠. for 문 내에서 사용할 조건식의 변수를 꼭 for 문 안에서 선언하지 않아도 된다는 것을 보여드리려고 한 번 더 적어 보았습니다. 

 하지만 컴퓨터에게는 int i 의 선언 위치에 따라서 약간 다르게 다가옵니다. 왜냐면 변수는 한 번 선언되면 모든 곳에서 사용할 수 있는 것이 아니고 선언된 위치에 따라 사용할 수 있는 곳이 정해지거든요. 

 

#include <stdio.h>

void main()
{
    int sum = 0;
    for (int i = 10; 1 <= i; i--)
    {
        sum += i;
    }
        
    printf("Sum : %d", sum);
    printf("i : %d", i);
}

 

 아까 썼던 코드를 이렇게 한 번 수정해 볼까요?

 

 

 이런 메시지가 나오면서 빨간줄이 나오는 것을 볼 수 있습니다. 실행하려 해도 빌드도 안 되죠?

 선언되지 않은 변수 i를 사용했다니? 아까 선언했는데 얜 무슨 말을 하는걸까 싶으실 수 있어요. 

 

 그 이유는 변수에는 지역성이라는 것이 있기 때문입니다. 우리는 부산에서 태어나도 서울에 가서 살 수 있지만 변수들은 안타깝게도 그럴 수가 없어요...ㅠ.ㅠ 변수는 어떤 지역에서 한 번 태어나면 평생 그 지역에서만 살다가 자기가 태어난 지역이 사라지면 함께 사라집니다. 

 

 

 그림으로 나타내자면 위와 같이 표현할 수 있습니다. 우리가 선언한 변수들은 같은 지역 안에 있을 때에만 그 변수에 접근할 수 있습니다. 그림으로 보면 for 지역이 main 함수 지역 안에 있지만 독립된 공간을 가지고 있습니다. 우리가 서울에 있는 모든 집의 내부를 볼 수 없듯이(사생활 침해... 철컹철컹) 컴퓨터도 독립된 공간에 있는 변수의 바깥에서는 그 변수를 참고할 수 없다고 생각하시면 이해가 좀 더 편하실 것이라 생각됩니다. 

 

for (int i = 0; 1 <= i; i--)
{
    //i was born in here...
}

 

 for 문을 쓰면서 int i 를 선언했기 때문에 변수 i는 for 문 지역 안에서 태어난 것으로 간주되거든요. 그래서 for 문의 밖에서는 참고할 수가 없는 것입니다. 이 지역의 구분은 중괄호 { } 로 됩니다. 중괄호를 어디까지 쳤느냐가 어떤 함수의 지역을 결정하는 것이죠. 

 

#include <stdio.h>

void main()
{
    int oddSum = 0, evenSum = 0;
    for (int Num1 = 1,Num2 = 2; 100 >= Num1 && 100 >= Num2; Num1 += 2, Num2 += 2)
    {
        oddSum += Num1;
        evenSum += Num2;
    }
    printf("홀수의 합 : %d\n", oddSum);
    printf("짝수의 합 : %d\n", evenSum);
}

 

 예제 하나로만 끝나면 아쉬우니까 좀 더 이해를 돕기 위해서 예제를 하나 더 볼까요? 이번엔 이 코드를 적고 실행해 봅시다. 

 이번 for문은 Num1은 1부터, Num2는 2부터 시작하는데 두 변수는 각각 100보다 작거나 같을 때까지 각각 2씩 증가시키면서 중괄호 { } 안의 종속문장을 반복해라는 조건을 정해 주었습니다. 

 

 

 좐~ 실행하면 홀수의 합과 짝수의 합을 각각 잘 구해주는 것을 볼 수 있습니다. 

 

 

 이번 코드의 지역을 그림으로 본다면 위와 같이 표현할 수 있습니다. Num1과 Num2는 for 지역 안에 포함되고 oddSum과 evenSum은 main 함수 지역에 포함됩니다. 코드에서 for 의 중괄호 { } 안에서 oddSum과 evenSum을 썼지만 맨 처음에 선언은 for 지역의 밖인 main 함수 지역에서 되었기 때문에 마지막에 for 의 중괄호 { } 밖에서도 쓸 수 있는 것입니다. 

 

#include <stdio.h>

void main()
{
    int i = 0;
    for ( ; 10 > i; i++) //for문에서 사용할 변수가 바깥에서 이미 선언되었다면 초기값 선언 부분 생략 가능 
    {
        int j = 100;
    }
    
    printf("%d\n", i);
    printf("%d\n", j); //둘 다 가능할까?
}

 

 마지막으로 위와 같이 적었을 때 반복문이 끝나고 나서 마지막에 변수 i와 j를 모두 출력하는 것이 가능할까요? i와 j는 각각 어느 지역에 속해 있을까요? 지금까지 잘 따라오셨다면 정답을 아실 수 있을 것입니다. 

 

 

break와 continue

 

 그럼 이번에는 반복문을 강제로 끝낼 수 있는 방법을 알아봅시다. 코드를 쓰다 보면 기본적으로는 내가 정한 횟수만큼 반복을 하는데 어떤 특정한 조건이 발생했을 때엔 이 반복문을 끝내거나 한 번만 건너뛰고 실행을 했으면 좋겠다... 와 같은 경우가 생길 수 있습니다. 그럴 때 사용하는 것이 break와 continue 입니다. 

 

break

 for, while, do~while, switch~case 문에서 해당 동작을 종료할 때 사용. 종속 문장을 쭉 실행하다가 break를 만나면 바로 종료하고 반복문을 빠져 나옵니다. 

 

continue

 for, while, do~while 문에서 종속 문장의 실행을 건너뛰고 싶을 때 사용. 종속 문장을 쭉 실행하다가 continue를 만나면 continue 다음에 있는 문장들은 실행하지 않고 다음 반복을 진행하기 위해서 조건문을 확인하러 갑니다. 

 

break 예제

#include <stdio.h>

void main()
{
    int Num;
    for (Num = 1; 5 >= Num; Num++)
    {
        printf("Num = %d\n", Num);
        if (3 == Num)
            break;
    }
    printf("반복이 끝난 후 Num = %d\n", Num);
}

 

 

 위 break 예제를 쓰고 실행해 보면 위와 같은 결과를 얻을 수 있습니다. 원래 쓴 반복문의 조건대로면 Num이 5가 될 때까지 출력해야 하는데 3까지만 출력하고 반복문을 빠져나왔죠?

 

continue 예제

#include <stdio.h>

void main()
{
    int Num;
    for (Num = 1; 5 >= Num; Num++)
    {
        if (3 == Num)
            continue;
        printf("Num = %d\n", Num);
    }
}

 

 

 이번엔 위 continue 예제를 쓰고 실행해 보면 위와 같은 결과를 얻을 수 있습니다. 3만 건너뛰고 반복문을 실행했습니다. 

 

 break와 continue 의 특성을 잘 활용하면 보다 효율적인 코드를 작성할 수 있습니다. 

 


 

 그럼 오늘 배운 것을 복습할 수 있는 문제 두 개를 풀어보면서 마무리해 봅시다. 

 

1. 1~1,000까지의 누적합계를 구해서 출력하는데, 3의 배수는 합에서 제외하며 3과 5의 공배수는 제외하지 않는다.

2. 1부터 시작해서 홀수의 합을 구하는데, 그 합이 10,000이 넘기 직전의 수를 구해라.
출력형태 : 수 : 000 합 : 0000

 

 오늘 배운 것들과 그간 배운 것들을 잘 활용하시면 충분히 풀 수 있는 문제입니다. 최대한 구글링 없이 스스로 풀어 보시고 피드백이 필요하시면 언제든 댓글로 남겨주세요. 

 

 그럼 다음 포스트에선 다중 for 문에 대해 알아보겠습니다. 예습복습 열심히 하시고 다음에 만나요~!

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함