혼자 공부하는 C - 선택문과 반복문




오늘은 기본문법인 선택문과 반복문에 대해 정리합니다.



선택문



갑자기 생각난 아보카도 짤



프로그램을 작성하다 보면 때에 따라 다르게 처리를 해야할 때가 있습니다. 이럴 때에는 제어문을 사용할 수 있고 종류는 아래와 같습니다.

  • 선택문: if, switch ~ case
  • 반복문: while, for, do ~ while
  • 분기문: break, continue, goto, return

1. if 문

if문 기본 구조

if문은 제시한 조건에 만족하면 (True라면) 실행문을 진행합니다.


1
2
3
4
if (a > 10) // 조건식
{
b = a; // 실행문
}

코드 규칙

  1. if문은 중괄호를 사용하고 들여쓰기해 실행문을 명확히 구분하는 것이 좋습니다.
  2. 실행할 문장이 두 문장 이상이면 반드시 중괄호로 묶어야 합니다.

if ~ else 문

조건에 만족하는 경우는 if 하위의 실행문을 실행하지만, 조건에 만족하지 않을 때에만 처리하는 것도 가능합니다. else하위에 실행문을 추가로 넣으면 됩니다.


1
2
3
4
5
6
7
8
if (a >= 0)
{
a = 1;
}
else
{
a = -1
}

코드 규칙

  1. if ~else 문의 else에는 조건을 사용하지 않습니다.
  2. 실행할 문장이 두 문장 이상이면 반드시 중괄호로 묶어야 합니다.
  3. 경우에 따라 if문을 두번 사용하는 것 보다 if ~else문을 한 번 사용하는 것이 좋습니다.

예를 들어보겠습니다.

크리스마스 때까지 애인이 생기지 않는다면, 친구가 소개팅을 주선해주기로 한 상황입니다.

이를 코드로 구현한다면 다음처럼 표현할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main(void)
{
char answer;

printf("곧 크리스마스도 다가오는데.. 그 때 얘기 했던거, 혹시 기미가 보이니? [Y/N]");
scanf("%c", &answer);

if (answer == 'Y')
{
printf("그렇다면 소개팅을 주선해 줄게!\n");
}
else
{
printf("다행이네 그렇다면 잘해봐!\n");
}

}



if ~ else if ~ else 문

조건에 맞으면 if 하위 실행문을 실행하는데, 다른 조건을 더 추가하고 싶을 수 있습니다. 그럴때 else if 를 사용하면 추가 조건에 따른 실행문을 추가할 수 있습니다.

출근시 날씨가 좋으면 도보나 자전거를 타고, 안좋으면 자동차를 이용하고, 더 안좋으면 대중교통을 이용하는 것으로 예를 들 수도 있습니다. 더 안좋으면 재택을…


예를 들면 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
if (a > 0)
{
b = 1;
}
else if (a == 0)
{
b = 2;
}
else
{
b = 3;
}

코드 규칙

  1. 각 조건에 따라 실행할 문장이 두 문장 이상이면 반드시 중괄호로 묶어야 합니다.
  2. 조건식을 차례로 검사하므로 이전 조건의 결과가 반영됩니다.

if문 중첩

if문은 if문 안에 if문을 넣는 방식으로 중첩하여 사용할 수도 있습니다.


1
2
3
4
5
6
7
8
9
10
11
if (a > 10)
{
if (b >= 0)
{
b = 1;
}
else
{
b = -1;
}
}

사용 이유

  1. 선행조건이 있으면 불필요한 조건 검사를 하지 않습니다.

  2. 선행조건이 없어도 실행 효율을 위해 의도적으로 중첩해 사용할 수 있습니다.

    참고) 분할 정복 기법 (divide and conquer)


switch ~ case 문

switch문은 여러개의 상수 중 조건에 해당하는 하나를 실행합니다.


1
2
3
4
5
6
7
8
9
10
11
12
switch ( 조건식 )
{
case 상수식1:
실행문1;
break;
case 상수식2:
실행문2;
break;
case 상수식3:
실행문3;
break;
}

코드 규칙

  1. 조건식으로 정수만 사용해야 합니다.
  2. 기본적으로 case는 break를 포함합니다. (해당 블록에서 빠져나오기 위함입니다)

break문을 생략했을 때 예시입니다.


1
2
3
4
5
6
7
8
9
10
11
12
int a = 2;
int b = 0;

switch ( a )
{
case 1:
b += 1;
case 2:
b += 2;
case 3:
b += 3;
}

a는 2이므로 2번째 case에 들어갑니다. break가 있으면 해당 블록에서 종료되나, 없으므로 아래 case3로 이동한 뒤 실행하게 됩니다.



반복문

1. while, for, do ~ while 문

어떤 작업을 반복해서 처리해야 하는 경우, 같은 문장을 여러번 반복해서 작성하는 것을 비효율 적입니다. 조건에 따라 특정 실행문을 반곱할수 있도록 3가지 반복문이 있습니다.

  • while 문
  • for 문
  • do ~ while 문

while문

조건식을 만족하면 (True라면) 실행문을 반복합니다. 만족하지 못하면 loop를 종료하고 빠져나옵니다.


1
2
3
4
5
6
7
8
int a = 1;

while (a < 10)
{
a = a * 2; // 1 -> 2 -> 4 -> 8 -> 16 으로 반복되며, 16은 10보다 크므로 종료.
}

printf("%d", a); // 16

for 문

for문은 실행문을 원하는 횟수만큼 반복할 때 사용합니다. while문과 구조가 비슷합니다.


1
2
3
4
for (i = 0; i < 3; i++)
{
a = a * 2;
}

for 문의 괄호는 초기식; 조건식; 증감식 으로 나누어져 있습니다.

i를 0으로 지정하고, 하나의 loop마다 i를 1씩 증가시키며, 3보다 낮은 경우에만 반복합니다.

주의점

  1. 초기식, 조건식, 증감식은 반복 횟수를 알기 쉽게 작성해야합니다.

  2. 반복 횟수를 세는 변수를 반복문 안에서 바꾸지 않는 것이 좋습니다.

    위 예시에서는 i를 실행문에서 직접 조작하는 경우입니다. 이해하기 어려울 수 있고 버그가 나타나기 쉽습니다.


do ~ while 문

do ~ while문은 실행문을 실행한 다음에 조건식을 만족하는지 확인합니다. 실행문을 최소 한번을 진행합니다.


1
2
3
4
do
{
a = a * 2;
} while (a < 10)

break와 continue

반복문을 실행하는 중에 특정 조건에 따라 loop를 종료시키거나 건너 뛰어야 하는 경우가 있습니다. 그 때, break와 continue를 사용할 수 있습니다.

예를 들면 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
for (i = 0; i < 5; i++)
{
if (i == 2)
{
continue; // 현재 실행문을 건너뛰고 다음 loop 진행
}
else if (i == 4)
{
break; // loop를 종료
}
printf("%d", i); // 0 1 3 출력
}



오늘 정리는 여기까지입니다.

책에 각 항목에 대해 상세히 나와있는데, 갑작스럽게 용어가 많이 나온다면 혼란스러울 수 있습니다. 혼자 공부하는 C언어 책 뒤쪽에는 용어 노트가 있는데, 용어별로 짧게 정리가 되어있습니다. 어려운 내용은 이해를 위해 손수 그린 그림도 있어서 참고하기 좋아보입니다.

오늘 나온 내용의 일부를 아래처럼 활용해 보았습니다.



용어노트



오늘은 선택문과 반복문에 대해 정리를 해보았습니다.

읽어주셔서 감사합니다 👋