#13 조건문

특정 조건에 따라서 코드를 실행시키거나, 실행시키지 않을 수 있습니다

Table Of Contents

오늘은 조건문에 대해서 배워보겠습니다.

지금까지는 우리가 코딩한 내용을 실행하면, 모든 내용을 순서대로 실행했습니다.

조건문은 특정 조건일 때만 특정 코드를 실행하도록 해 주는 문법입니다.

조건문은 이런 식으로 사용하면 됩니다.

예시 1.

if (조건문1) { (조건문1 안의 내용이 참일 때 실행할 코드) }

예시 2.

if (조건문1) { (조건문1 안의 내용이 참일 때 실행할 코드) } else { (조건문1의 내용이 참이 아닐 때 실행할 코드) }

예시 3.

if (조건문1) { (조건문1 안의 내용이 참일 때 실행할 코드) } else if (조건문2) { (조건문1의 내용이 거짓이면서, 조건문 2의 내용이 참일 때 실행할 코드) } else { (조건문1의 내용도, 2의 내용도 참이 아닐 때 실행할 코드) }

아래에서는 이 문법을 적용해보겠습니다.

  1. 점수가 60점 이상일 때 “통과"를 출력하는 코드를 작성해봅시다.

    우선 if문 문법은 이렇습니다.

    if (조건문1) { (조건문1 안의 내용이 참일 때 실행할 코드) }

    이번 경우에 적용시키면 아래처럼 되겠네요.

    if (점수가 60보다 크거나 같음) { "통과"를 출력 }

    이제 이 내용을 코드로 옮기면 이렇게 됩니다.

    if (score >= 60) { printf("통과"); }

조건문 괄호 안에는 어떤 내용들이 들어갈 수 있을까요?

점수가 60점을 넘을 때, a와 b가 같은 숫자일 때, 문자열의 길이가 5보다 클 때, a가 3이고 b가 5일 때 등등... 다양한 내용이 들어갈 수 있습니다. 이런 경우 관계 연산자논리 연산자 등을 이용해서 조건식을 만들 수 있습니다.

이전 주차에서는 산술 연산자를 사용하는 방법을 배웠습니다. a + b라는 식은 피연산자 a와 피연산자 b를 더한 값을 반환해주죠. a - b는 피연산자 a에서 b를 뺀 값을 반환해줍니다.

관계 연산자와 논리 연산자는 논리적인 값을 반환해줍니다.

관계 연산자

관계 연산자는 두 피연산자를 비교해서 참 또는 거짓을 가려줍니다.

관계 연산자에는 <, >, <=, >=, ==, !=이 있습니다.

<

우리가 흔히 사용하는 부등호의 의미와 같습니다.

a < b는 b가 a보다 클 때, a가 b보다 작을 때 참을 반환합니다.

반대로 a가 b보다 같거나 클 때, b가 a보다 작거나 같을 때 거짓을 반환합니다.

3 < 5라는 식을 보면, 3은 5보다 작으므로 결과값이 참이 됩니다.

하지만 3 < 3이라는 식이 주어진다면, 결과값은 거짓이 됩니다.

>

위와 마찬가지입니다.

a > b는 a가 b보다 클 때, b가 a보다 작을 때 참을 반환합니다.

반대로 b가 a보다 같거나 클 때, a가 b보다 작거나 같을 때 거짓을 반환합니다.

<=

<에 등호가 붙어서 같다는 의미가 추가됩니다.

a <= b는 b가 a보다 크거나 같을 때, a가 b보다 작거나 같을 때 참을 반환합니다.

반대로 a가 b보다 클 때, b가 a보다 작을 때 거짓을 반환합니다.

>=

위와 마찬가지입니다.

a >= b는 a가 b보다 크거나 같을 때, b가 a보다 작거나 같을 때 참을 반환합니다.

반대로 b가 a보다 클 때, a가 보다 작을 때 거짓을 반환합니다.

==

같음을 나타냅니다.

수학에서는 같음을 표현할 때 =를 사용하지만, C언어에서는 ==를 사용합니다. C언어에서 =는 대입의 의미로만 사용됩니다.

a = b는 “b의 값을 a에 대입하라”라는 뜻으로만 사용됩니다.

a == b는 a와 b의 값이 같을 때 참을 반환합니다.

반대로 a와 b가 다르면 거짓을 반환합니다.

3 == 3이라는 식이 있다면, 이 식의 결과값은 참이 됩니다.

!=

같지 않음을 나타냅니다.

a != b는 a와 b의 값이 다를 때 참을 반환합니다.

반대로 a와 b가 같으면 거짓을 반환합니다.

논리 연산자

산술 연산자가 산술 연산의 결과값을 반환하는 것처럼, 논리 연산자는 논리 연산의 결과값을 반환합니다.

관계 연산자에는 &&, ||, !이 있습니다.

&&

AND 연산의 결과값을 반환합니다.

AND 연산은 피연산자 두 개의 값이 모두 참일 경우에 결과값이 참이 되고, 나머지 경우에서는 결과값이 거짓이 되는 연산입니다.

a && b식의 결과값은 이렇게 나타납니다.

ab결과
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

논리 연산을 처음 접해보신 분은 논리 연산에 대해서 아직 감이 안 오실 수도 있습니다. true false 대신에 임의로 식을 몇 개 채워보겠습니다.

ab결과
1 < 2 (true)3 == 3 (true)true
1 < 2 (true)3 == 4 (false)false
1 >= 2 (false)3 == 3 (true)false
1 >= 2 (false)3 == 4 (false)false

위에서 배운 관계연산자를 이용해서 식을 몇 개 작성해보았습니다.

이제 a && b라는 식의 a, b에 각 식을 대입해볼까요?

(1 < 2) && (3 == 3) 식을 보면, 1 < 2는 참이고, 3 == 3도 참입니다. 이런 경우에 && 연산은 결과값으로 참을 반환합니다.

(1 < 2) && (3 == 4) 식을 보면, 1 < 2는 참이지만, 3 == 4는 거짓입니다. 이런 경우에 && 연산은 결과값으로 거짓을 반환합니다.

(1 >= 2) && (3 == 3) 식을 보면, 1 >= 2는 거짓이고, 3 == 3은 참입니다. 이런 경우에 && 연산은 결과값으로 거짓을 반환합니다.

(1 >= 2) && (3 == 4) 식을 보면, 1 >= 2는 거짓이고, 3 == 4도 거짓입니다. 이럴 경우에 && 연산은 결과값으로 거짓을 반환합니다.

또한 && 연산자는 다른 산술 연산자나 관계 연산자들보다 우선순위가 낮습니다. *보다 +가 나중에 계산되듯이, (1 < 2) && (3 == 3)라는 식에서, && 연산은 <== 연산보다 나중에 계산됩니다. 따라서1 < 2 && 3 == 3처럼 괄호를 풀어서 써도 괜찮습니다.

||

OR 연산의 결과값을 반환합니다.

OR 연산은 피연산자 둘 중에 하나라도 참이면 결과값이 참이 되고, 둘 다 거짓이면 결과값이 거짓이 되는 연산입니다.

a || b식의 결과값은 이렇게 나타납니다.

ab결과
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

위에서 했던 것처럼 임의로 식을 채워보겠습니다.

ab결과
1 < 2 (true)3 == 3 (true)true
1 < 2 (true)3 == 4 (false)false
1 >= 2 (false)3 == 3 (true)false
1 >= 2 (false)3 == 4 (false)false

그리고 a || b라는 식의 a, b에 각 식을 대입해보겠습니다.

(1 < 2) || (3 == 3) 식을 보면, 1 < 2는 참이고, 3 == 3도 참입니다. 이런 경우에 || 연산은 결과값으로 참을 반환합니다.

(1 < 2) || (3 == 4) 식을 보면, 1 < 2는 참이고, 3 == 4는 거짓입니다. 이런 경우에 || 연산은 결과값으로 참을 반환합니다.

(1 >= 2) || (3 == 3) 식을 보면, 1 >= 2는 거짓이고, 3 == 3은 참입니다. 이런 경우에 || 연산은 결과값으로 참을 반환합니다.

(1 >= 2) || (3 == 4) 식을 보면, 1 >= 2는 거짓이고, 3 == 4도 거짓입니다. 이럴 경우에만 || 연산은 결과값으로 거짓을 반환합니다.

|| 연산에서도 역시 1 < 2 || 3 == 3처럼 괄호를 풀어서 쓸 수 있습니다. <==보다 || 연산자를 더 먼저 계산하기 때문입니다.

!

NOT 연산의 결과값을 반환합니다.

NOT 연산은 현재 논리값이 참이면 거짓을, 거짓이면 참을 반환합니다.

예를 들어 !(3 < 5)에서, 3 < 5는 참이지만 앞에 ! 연산자가 붙었으므로 결과값은 거짓이 됩니다.

위 식에서 NOT 연산자 뒤에 있는 괄호는 풀면 안 됩니다. < 연산보다 ! 연산이 더 먼저 계산되기 때문입니다.

  1. 이번에는 점수가 60점 이상일 때 “통과”를 출력하고, 60점 미만일 때 “탈락”을 출력하는 코드를 작성한다고 합시다.

    위에서 배운 내용을 응용해서,

    if (score >= 60) { printf("통과"); } if (score < 60) { printf("탈락"); }

    처럼 작성할 수 있겠네요.

    하지만 이 문제의 조건문은 특별합니다. “60점 이상”과 “60점 미만"은 서로 배타적입니다. 언제나 “60점 이상"이거나 “60점 미만"이지요. 둘 다 아닌 경우는 존재하지 않습니다.

    이럴 경우에는 1. “60점 이상"인 경우2. “60점 이상이 아닌" 경우 로 생각해도 되겠죠? 그렇다면 다음과 같이 코딩할 수 있습니다.

    if (score >= 60) { printf("통과"); } else { printf("탈락"); }

    첫 번째 if문에서 60점 이상인 경우를 체크하고, 아래 else문에서 60점 이상이 아닌 경우를 체크했습니다.

    이렇게 if else문은 조건식 A에 해당하는 경우와 A에 해당하지 않는 경우 두 가지를 나누어서 코드가 실행되도록 해 줍니다.

  2. 마지막으로, 점수가 60점 이상일 때는 “통과”, 40 ~ 59점일 때는 “재시험”, 40점 미만일 때는 “탈락”이라고 출력해봅시다.

    if문만으로 표현한다면, 이렇게 표현할 수 있겠죠?

    if (60 <= score) { printf("통과"); } if (40 <= score && score < 60) { printf("재시험"); } if (40 <= score) { printf("탈락"); }

    40 <= score && score < 60라고 써서 score가 40점 이상이면서 60점 미만인 경우를 나타냈습니다.

    이를 else if와 else를 사용하면 더 간단하게 쓸 수 있습니다.

    if (60 <= score) { printf("통과"); } else if (40 <= score) { printf("재시험"); } else { printf("탈락"); }

    우선, 첫 번째 if 조건문에서 score가 60점 이상인지를 체크했습니다. 만약 score가 60점 이상이라면, 뒤의 else if나 else문 안의 코드는 실행되지 않습니다.

    60점 미만인 경우, 컴퓨터는 if문 안의 코드를 실행하지 않고 else if문의 조건 부분을 읽게 됩니다. 해당 조건문은 score가 40점 이상인지를 체크하는 코드입니다. 이 부분이 참이면 score는 자연스럽게 60점 미만이면서 40점 이상이 되겠죠?

    마지막은 위 두 경우 모두 아닌 경우입니다. 60점 이상도 아니고 60점 미만 40점 이상도 아니므로 40점 미만인 경우가 됩니다.

또한, 조건문 내부에 조건문을 사용할 수도 있습니다.

if (middleTermScore >= 60) { if (quizScore >= 50) { printf("A+"); } else { printf("A-"); } } else { printf("B"); }

이 코드에서는 중간고사 점수가 60점 미만인 경우에는 B를 출력하고, 60점 이상인 경우 중에서 퀴즈 점수가 50점 이상인 경우에 A+를, 퀴즈 점수가 50점 미만인 경우에 A-를 출력합니다.

이렇게 if문 안에 또 if문을 여러번 겹쳐서 쓸 수 있습니다.