티스토리 뷰

첫번째 글에서는 컴퓨터 언어를 읽는 방법에 대해서, 컴퓨터가 사람의 말을 이해하는 방식을 배워보았고,

 

두번째 글에서는 컴퓨터에게 일을 시키기위해 갖춰야할 코드의 양식과 도구들을 알아보았다.


우리는 이제 프로그램을 짤 준비가 다 된 것이다.


그런데 또 배워? 우리는 아직 많이 배워야한다. 왜냐하면 더 좋은 코드와 더 복잡한 프로그램을 짜기 위해서는 알아야 할 것이 앞으로 많이 남아있으니 부지런히 공부하자.


오늘은 선택문에 대해 배워볼 것이다. 또는 조건문이라고도 한다.


선택문이란?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main() {
    double radius;
    cout << "Enter a radius: ";
    cin >> radius;
 
    if (radius < 0) {
        cout << "Incorrect input" << endl;
    }
    else {
        double area = radius * radius * 3.14159;
        cout << "the area is " << area << endl;
        return 0;
    }
}
cs

선택문은 말 그대로 컴퓨터에게 선택할 옵션을 주는 것이다. 이거 아니면 저거. 그게 선택문이다.


위 예제를 보면 선택문을 9행과 12행에서 확인할수있다.


그런데 선택문을 쓰기 위해서는 알아야할 데이터 타입이 있다. 지난시간에는 "수"에 대한 데이터 타입만 배웠는데 오늘은 새로운 타입을 배울것이다.



bool 데이터 타입


 bool 데이터 타입은 값이 참과 거짓, 1과 0 만 있는 데이터 유형이다. int는 32비트의 음수를 포함한 정수값이니, int형으로 표현가능한 값의 개수는 2의 32승개인 셈이다.


그러나 bool(부울)타입은 2개다. 참, 그리고 거짓. 참고로 참은 1, 거짓은 0으로 정수표현이 가능하다. 물론 변수가 bool타입일 때!


9행을 보자 

1
if (radius < 0)
cs

해석하면 "만약 (소괄호)안의 식이 참이라면~" 이란 뜻이다. 소괄호 안의 내용을 부울 식이라고 할것이다.
이 부울-식을 작성하려면 알아야할 도구들이 있다. 바로 관계 연산자이다.

1
2
3
4
5
6
< // 미만
<= // 이하
> // 초과
>= // 이상
== // 같다
!= // 다르다
cs


ex. radius가 0보다 작다. radius < 0, 크다는 radius > 0, 처럼 왼쪽이 오른쪽보다 ~하다 라고 쓴다.


예제 9행에서는 변수 radius의 값이 0보다 작을때 즉, 미만일때~ 라고 말하는 것이다.


우리는 이 관계연산자를 가지고 부울 식을 작성하여 선택문이 원하는대로 동작하게끔 만들 수 있다.


특정 조건을 만들어주고, 이 조건이 충족하면 그 코드를 실행하는것이 바로 선택문이다.


부울변수


1
bool lightsOn = true;
cs


부울 값을 갖는 변수를 부울 변수라고 한다. 부울 변수에 대입할 수 있는 값은 오로지 true 아니면 false다.


위 예제처럼 사용한다.


단순 if문


단순 if문은 조건이 참일때만 실행한다. 구문은 이렇게 생겼다.


1
2
3
4
if (부울 식)
{
    실행할 문장;
}
cs


if 문을 만나 부울 식의 조건을 충족하면 블록안의 문장을 실행한다. 이게 다임.


예제를 보자.


1
2
3
4
5
if (radius >= 0)
{
    area = radius * radius * PI;
    cout << "the area for the circle of " << " radius " << radius << " is " << area;
}
cs


1행에서 if문을 만났고 괄호안의 부울 식이 참인지 거짓인지 판별한다. 


참이면 아래 블록의 문장을 실행한다. area를 계산하고, 계산한 값을 출력한다.


만약 부울 식의 값이 거짓이라면(예제에서는 radius의 값이 0보다 작다면), 블록을 실행하지 않고 다음으로 넘어간다.


단순 if문을 사용할때 몇가지 규칙이 있다.


1. 조건은 (소괄호) 안에 작성

2. 참일때 실행되는 문장이 하나면 {블록} 생략가능


2번 규칙은 예제로 첨부하겠다.

1
2
3
4
5
6
7
if (i > 0)
{
    cout << "i is positive" << endl;
}
// 위 문장을 아래처럼 바꿀수있다. 같은 표현임.
if (i > 0)
    cout << "i is positive" << endl;
cs


이중 if-else문 


다음으로 if-else문을 배워보겠다. if-else문은 참일때 실행하는 문장과 거짓일 때 실행되는 문장이 다를 때 사용한다.


맨 위의 선택문 예제가 이 if-else문이다. 다시 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main() {
    double radius;
    cout << "Enter a radius: ";
    cin >> radius;
 
    if (radius < 0) {
        cout << "Incorrect input" << endl;
    }
    else {
        double area = radius * radius * 3.14159;
        cout << "the area is " << area << endl;
 
        return 0;
    }
}
cs


9행에서 if문을 만났다. 만약 radius값이 음수로 입력이 되었다면 아래 블록의 문자열을 출력한다.

하지만 양수로 입력이 되었다면 계산하고 계산한 값을 출력한다. 그리고 return 값을 만나 프로그램이 종료된다.

별거없다. 


if-else문을 작성할때는 이렇게 작성한다.


1
2
3
4
5
6
7
8
if (부울 식) // if의 부울식의 값이 참일때
{
    참인경우 실행될 문장;
}
else // 부울 식의 값이 거짓일때
{
    거짓일때 실행될 문장;
}
cs


중첩 if문, 다중 if-else문 


if문을 여러개 쓰는 경우에 대한 내용이다.


중첩이란 if문안에 if문을 또 쓰는 것이다. 깊이에 제한은 없다 다음 예제를 보자


1
2
3
4
5
6
7
if (i > k)
{
    if (j > k)
        cout << "i and j are greater than k" << endl// 실행문장이 하나면 블록 생략.
}
else
    cout << "i is less than or equal to k" << endl;
cs


위 예제는 if문을 여러개 중첩시킨 모양이다. 이런식으로 중첩하고 중첩하고... 깊이에 제한은 없다. 당신이 머릿속에서 계산이 된다면 


다중 if-else문은 직접 예제로 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
if (score >= 90.0)
    cout << "Grade is A";
else
    if (score >= 80.0)
        cout << "Grade is B";
    else
        if (score >= 70.0)
            cout << "Grade is C";
        else
            if (score >= 60.0)
                cout << "Grade is D";
            else
                cout << "Grade is F";
cs

1
2
3
4
5
6
7
8
9
10
if (score >= 90.0)
    cout << "Grade is A";
else if (score >= 80.0)
    cout << "Grade is B";
else if (score >= 70.0)
    cout << "Grade is C";
else if (score >= 60.0)
    cout << "Grade is D";
else
    cout << "Grade is F";
cs


위 예제보다 아래예제가 훨씬 깔끔하고 보기가 편하다. 위 예제가 틀린것도 아니고 두 예제가 다른 의미도 아니지만 아래 예제가 훨씬 좋은 코딩이다.


이것이 다중 if-else문의 활용이다.


사용시 주의점 


다음은 선택문을 쓸때 주의해야하는 오류와 위험요소이다. 빌드오류나면 다음에 내가 알려주는 사항에 해당할 가능성이 높으니 참고하도록 하자.


1. 필요한 괄호의 생략

부울 식을 넣을 때 소괄호를 생략한다거나 실행할 문장이 한줄이 아닌데 블록을 생략하는 경우가 있다. 구문오류이다. 잘 지키도록 하자


2. 잘못된 세미콜론; 사용

내가 세미콜론 문장 끝날때마다 붙이라고 했다고 부울식) ; 이렇게 찍으면 안된다. 부울식에 세미콜론 찍으면

1
if (부울 식) { 빈 블록 /*아무내용없음*/ };
cs

이거랑 똑같은 코드가 된다. 주의하자


3. == 대신 = 사용

뜻이 다르다. "전자는 왼쪽과 오른쪽이 같다"는 뜻이고 "후자는 왼쪽에 오른쪽을 대입한다"는 뜻이다. 주의하자


4. 부울 값의 중복 검사

이건 개꿀팁이다. 

1
2
3
if (even == true
            //두 표현은 같은 표현
if (even)
cs

1행 문장이 틀린표현은 아닌데 항상 말하지만 간결하고 가독성이 좋은 코드가 잘 쓴 코드다.


5. 불명료한 else 결합

else문은 같은 블록 안에서 항상 제일 마지막에 쓰인 if문과 결합한다.

이 말을 잘 기억하고 다음 예제를 보자

1
2
3
4
5
6
7
int i = 1, j = 2, k = 3;
 
if (i > j)
    if (i > k)
        cout << "A";
else // 이 else문은 바로 위 if (i > k)와 결합하는 else문이다.
    cout << "B"
cs

오류는 발생하지 않지만 본인이 프로그래밍하다가 헷갈려서 꼬일수가 있으니 들여쓰기와 공백은 잘 쓰자.


6. 두 실수의 동일성 검사

mistake가 아니라 real number의 실수다.

우리가 알아야할 사실이 하나 있는데 컴퓨터는 쓸데없이 정확하다. 그래서 다음과 같은 현상이 발생한다.

1
2
3
4
5
6
double x = 1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1;
 
if (x == 0.5)
    cout << "x is 0.5" << endl;
else 
    cout << "x is not 0.5" << endl;
cs

이 코드의 결과는 else문의 "x is not 0.5"만 항상 출력된다. 

일반적으로 사람인 우리가 계산하면 1.0에 0.1을 5번 빼주면 0.5가 맞다. 그러나 컴퓨터의 계산은 0아니면1로 이루어진 이진법 계산을 하기 때문에 매번 다른 근삿값의 0.5를 도출한다는 것이다.

그러니 컴퓨터가 보기에는 0.5 와 0.0000000.....12는 다른거지. 안똑같은거임.

그래서 두 실수가 똑같냐고 물어보는 부울 식은 불가능하다. 쓸수가 없어. 


그러니 실수를 비교할땐 똑같냐고 물어보지 말고 뭐가 더 큰지 물어보자.


오늘 내용만 잘 숙지해도 선택문을 쓰는데 전혀 지장이 없다. 

그러나 다음 선택문 2편에서는 조금 더 고급 내용을 다루어볼 예정이다. 2편에서 배울 내용까지 배우면 선택문은 끝이다. 완전 마스터하는거임.


오늘 내용은 여기까지 쓰도록 하겠다

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
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
글 보관함