6.1.1 선택이란?

선택이란 여러 가능성 중 다른 것을 배제하고 하나를 고르는 것이다. 모든 사람은 선택을 하며 살아간다. 다음은 주말에 무엇을 할지를 나열한 선택지들이다.

  1. 연인과 데이트를 하자.
  2. 도서관에 가서 책을 읽자.

둘 다 괜찮은 선택지처럼 보인다. 그런데 이 선택지들은 그저 희망사항의 나열일 뿐이고 의사결정에 활용하기에는 부족하다. 여러 가능성 중 하나를 선택하기 위한 판단 기준인 ‘조건’이 빠져있기 때문이다. 이 선택지에 조건을 추가해 보자.

  1. 연인이 있다면, 연인과 데이트를 하자.
  2. 연인이 없다면, 도서관에 가서 책을 읽자.

‘연인이 있다면’과, ‘연인이 없다면’ 이라는 조건을 추가함으로써 주말에 할 일을 명확히 선택할 수 있게 되었다. 주말이 되기 전에는 그 때 연인이 있을지 없을지 장담할 수 없으므로 두 선택지 모두 선택될 수 있는 가능성을 품고 있다. 하지만 선택을 해야하는 시점에는 다른 가능성을 배제하고 하나의 선택지만이 선택될 것이다.

프로그래밍에서의 선택이란, 프로그램에 가능한 여러 조건과 선택지를 작성해 두어, 컴퓨터가 프로그램을 실행할 때 조건에 합치되는 코드만을 수행하도록 하는 것이다. 지금까지 만든 프로그램은 ‘조건’을 판단하지 않고 항상 곧이곧대로 실행될 뿐이었다. 우리가 ‘선택’을 제공하지 않았기 때문이다. 선택이 있어야만 컴퓨터는 다양한 상황에 반응할 수 있다.

6.1.2 if 문

파이썬에서 조건과 선택지를 나타내기 위해서는 if 문을 사용한다. if 문은 조건을 검사하여 조건이 참이면 본문의 코드(선택지)를 실행하고, 조건이 거짓이면 본문의 코드를 실행하지 않는다. if 문을 작성하는 양식은 다음과 같다.

if 조건:
    본문 (조건이 참일 때 실행할 코드)

if 문은 함수를 정의할 때 사용하는 def 문과 형태가 비슷하다. if 문의 첫 행에는 상황을 판단하기 위한 조건이 들어가고 콜론(:)으로 끝난다. 그 다음 행부터는 조건이 참일 때 실행할 코드를 네 칸씩 들여쓰기 하여 작성한다. 실행할 코드는 여러 행에 걸쳐 작성할 수도 있다.

if 문의 조건으로는 1 + 2 == 3, 10 < 5 or 3 < 5와 같이 참/거짓으로 가려낼 수 있는 식이 주로 사용된다. 하지만 불리언이 아닌 데이터도 참 또는 거짓으로 평가될 수 있으므로(예를 들면 0은 거짓으로, 1은 참으로 평가된다.), 이들도 if 문의 조건으로 쓰일 수 있다. (4.4 참과 거짓에서 알아 본 내용이다. 기억이 안 난다면 다시 읽어보자.)

if 문을 실제 코드로 작성한 예를 들어 보자.

코드 6-1 if 문의 예

if 연령 < 18:
    print('출입 불가')

위 코드의 if 문은 연령 < 18 이라는 조건과, 조건이 참일 때 실행할 코드 본문(print('출입 불가'))으로 구성되어 있다. if는 ‘만약 … 이라면’이라는 뜻의 영어 단어다. 이 코드를 사람의 말로 옮긴다면, “연령이 18 미만이면, 화면에 ‘출입 불가’를 출력하시오”가 된다.

if 문 실행해 보기

if 문을 사용한 프로그램을 실제로 작성하여 실행해 보자. 만들어 볼 프로그램은 이 절의 초반부에 제시한 주말에 할 일 선택이다. 파이참에서 if.py 파일을 새로 만들고 다음 코드를 입력해 실행해 보자.

코드 6-2 주말에 할 일 선택 (if.py)

print('연인이 있습니까? (예, 아니오로 답해주세요.)')
연인이_있다 = input()           # 사용자로부터 입력 받음

if 연인이_있다 == '예':         # 첫 번째 if 문
    print('연인과 데이트를 하자')

if 연인이_있다 == '아니오':     # 두 번째 if 문
    print('도서관에 가서 책을 읽자.')

이 프로그램은 사용자의 입력을 받아 연인이_있다 변수에 대입한 후, 그 값이 '예'일 때와 '아니오'일 때 각각 알맞는 메시지를 출력한다. 사용자가 어떤 텍스트를 입력할지는 미리 알 수 없으므로, 이 프로그램의 실행 결과는 실행될 때마다 달라질 가능성이 있다.

다음은 이 프로그램을 실행한 모습이다. 사용자는 '아니오'를 입력했다.

연인이 있습니까? (예, 아니오로 답해주세요.)
아니오
도서관에 가서 책을 읽자.

실행 과정을 생각해 보자. 사용자의 입력에 의해 연인이_있다 변수에 '아니오'가 대입되었으므로 이후 이 변수는 '아니오'로 평가된다. 이에 따라, 첫 번째 if 문의 조건은 '아니오' == '예' 이므로 거짓이다. 조건이 거짓으로 평가되었으므로 첫 번째 if 문의 본문은 실행되지 않았다. 반면에 두 번째 if 문의 조건은 '예' == '예'가 되어 참이다. 조건이 참으로 평가되었으므로 두 번째 if 문의 본문은 실행되었다. 그 결과, 화면에 연인과 데이트를 하자는 출력되지 않았고, 도서관에 가서 책을 읽자.만 출력되었다.

선택은 여러 가능성이 있을 때만 의미가 있다

선택은 여러 가능성이 있을 때만 의미가 있다. 다음은 가능성이 하나 뿐이어서 선택이 의미가 없는 경우다.

  1. 조건이 항상 참일 때: 이 코드는 항상 실행된다. if 문을 작성하지 말고 그냥 코드 본문만 작성하면 된다.
  2. 조건이 항상 거짓일 때: 이 코드는 절대 실행되지 않는다. 코드를 작성할 필요가 없다.
  3. 선택지가 하나뿐일 때: 선택지가 하나 뿐이라면 무조건 실행해야 하는 코드다. if 문 필요 없이 그냥 코드 본문만 작성하면 된다.

1 또는 2의 경우에 if 문을 작성하는 사람이 있을까? 있다. 초보 프로그래머는 항상 참인 조건과 항상 거짓인 조건을 작성하는 실수를 종종 저지른다. 예를 들어, 10 < x and x < 5 같은 조건은 언뜻 보기에는 올바른 표현 같지만 실제로는 변수 x에 어떤 값이 대입되든지 항상 거짓이 되는 조건이다. if 문에 이런 조건을 넣으면 본문이 어떤 경우에도 실행되지 않으므로 잘못된 코드다.

6.1.3 함수 안에서 if 문 활용하기

함수는 매개변수를 통해 데이터를 입력받는다. 무언가를 입력받는다는 것은 다양한 가능성이 존재한다는 뜻이다. 매개변수에 무엇이 전달될지는 함수가 호출되기 전에는 알 수 없다. 함수 중에는 매개변수에 전달된 값에 따라 실행 과정이 달라져야 하는 것도 있다. 이럴 때, 함수 안에서 if 문을 사용하면 된다.

어떤 수를 입력받아 그 수의 절대값을 반환하는 abs() 함수를 기억할 것이다. if 문을 사용하면 이것과 똑같은 일을 하는 함수를 직접 정의할 수 있다.

절대값을 어떻게 구하는지부터 생각해 보자. 어떤 수 N의 절대값은 다음과 같이 구할 수 있다.

  • N이 0 이상이면 절대값은 N이다.
  • N이 0 미만이면 절대값은 -N이다.

위의 계산법에는 ‘N이 0 이상이다’라는 조건과 ‘N이 0 미만이다’라는 두 조건과 그 조건에 따라 절대값을 구하는 방법이 나와 있다. 조건에 따라 계산법이 다르므로 if 문으로 나타내어야 한다. 다음은 이 계산법을 파이썬 함수로 정의한 것이다.

코드 6-3 if를 이용한 절대값 계산 함수 정의

def 절대값(n):
    """수 n을 입력받아, 절대값을 반환한다."""
    if n >= 0:       # n이 0 이상이면 n을 반환한다
        return n
    if n < 0:        # n이 0 미만이면 -n을 반환한다
        return -n

위 코드에서 정의한 절대값() 함수는 abs()와 동일한 결과를 반환한다. 앞으로 절대값을 계산해야 할 때마다 abs() 대신 직접 정의한 함수를 사용할 수도 있다! (단, 동일한 기능을 제공하는 기본 함수가 있다면, 직접 함수를 정의하지 말고 그것을 쓰는 게 더 바람직하다.)

들여쓰기는 중첩된다

코드 6-3에는 함수를 정의하는 def 문의 본문 안에 if 문이 포함되어 있다. 이 때 if 문의 본문은 def 문으로 인한 들여쓰기에서 한 단계 더 들여쓰기되어, 여덟 개의 공백으로 들여쓰기 되었다. 이처럼 본문의 코드 블록을 들여쓰기하는 구문이 중첩될 경우에는 들여쓰기도 그만큼 여러 단계로 중첩된다.

6.1.4 else: 그렇지 않다면

if 문은 조건이 참일 때만 본문의 내용을 실행하고, 조건이 거짓이라면 본문의 내용을 실행하지 않는다. if 문에 else 절을 추가하면 조건이 거짓일 때 실행할 코드를 지정할 수 있다. else 절을 포함하면 if 문의 양식은 다음과 같이 확장된다.

if 조건:
    본문 1 (조건이 참일 때 실행할 코드)
else:
    본문 2 (조건이 거짓일 때 실행할 코드)

‘else’는 영어 표현 ‘그렇지 않다면(or else)’에서 딴 것이다. 따라서 if … else … 문을 사람의 말로 옮긴다면 “조건이 참이라면 본문 1을 실행하고, 그렇지 않다면 본문 2를 실행하라”라는 뜻으로 풀이할 수 있다.

코드 6-4 else 절이 함께 사용된 if 문의 예

if 연령 < 18:
    print('출입 불가')
else:
    print('출입 가능')

위 코드는 연령이 18 미만일 때 ‘출입 불가’를 출력하도록 했던 코드 6-1에 else 절을 추가한 것이다. else 절이 없을 때는 연령이 18 미만이 아닌 경우에 아무 것도 실행되지 않았지만, 코드 6-4에서는 else 절에 의해 ‘출입 가능’을 출력하는 코드가 실행된다.

서로 모순인 조건

‘애인이 있다’와 ‘애인이 없다’라는 두 조건은 서로 모순이다. 두 조건이 서로 모순인 경우, 한 조건이 참일 때 다른 한 조건은 거짓이고, 한 조건이 거짓일 때 다른 한 조건은 참이다. 두 조건이 동시에 참이거나 동시에 거짓일 수는 없다.

코드 6-3에서 만든 절대값 함수는 ‘N이 0 이상이다’라는 조건과 ‘N이 0 미만이다’라는 두 가지 조건을 검사했다. 그런데 이 두 조건은 서로 모순 관계다. 그러므로 다음과 같이 수정할 수 있다.

  • N이 0 이상이면 절대값은 N이다. -> N이 0 이상이면 절대값은 N이다. (그대로 유지)
  • N이 0 미만이면 절대값은 -N이다. -> ‘그렇지 않다면’ 절대값은 -N이다. (첫 번째 조건의 부정)

조건 두 개를 각각 검사하는 것보다는 조건 하나가 참인지 거짓인지 검사하는 것이 더 쉽다. 수정한 조건에 따라 절대값 함수를 새로 정의해 보자. ‘그렇지 않다면’을 나타내기 위해 else를 사용한다.

코드 6-5 if … else … 문을 이용한 절대값 계산 함수 정의

def 절대값(n):
    """수 n을 입력받아, 절대값을 반환한다."""
    if n >= 0:       # n이 0 이상이면 n을 반환한다
        return n
    else:            # 그렇지 않다면 -n을 반환한다
        return -n

수정한 함수는 컴퓨터의 입장에서 환영이다. 원래 함수는 조건을 두 개 검사해야 하지만, 수정한 함수는 조건을 한 번만 검사하면 되기 때문이다. 사람의 입장에서도 두 조건을 따로따로 생각할 필요 없다는 점에서 장점이 있다.

단, else를 이용해 두 번째 조건을 대체할 수 있는 경우는 두 조건이 서로 모순일 때 뿐이다. 논리 계산은 헷갈리기 쉽다. if 문을 작성할 때는 조건을 잘못 정의하지 않도록 주의하자.

조건의 관계를 파악하기가 어렵다면

이번 항목에서 다룬 내용이 어려웠다면 논리에 관한 지식이 부족한 것일 수 있다. 프로그래밍을 하다보면 논리 감각은 저절로 체득되므로 너무 걱정하지 않아도 된다. 논리 감각이 발달하는 동안 경험하게 될 실수를 줄이고 싶다면 수학 도서의 집합, 명제, 수직선 같은 단원을 찾아 읽어보면 좋다.

조건이 거짓일 때 실행되어야 하는 코드 나타내기

조건이 거짓일 때만 실행되어야 하는 코드는 else 절로 표현하지 말고 조건을 부정하여 표현하는 것이 좋다. 말이 어려울 테니 예를 들어 보자.

코드 6-6 조건이 거짓일 때만 실행되는 코드 1

if 조건:
    pass  # pass 문은 본문을 비워두고 싶을 때(생략할 때) 사용하는 구문이다
else:
    print('출입 불가')

위 코드는 ‘조건’이 거짓일 때 ‘출입 불가’를 출력하는 프로그램이다. 조건이 참일 때 실행할 코드는 pass 문을 이용해 비워 두고, else 절에만 코드를 넣어 두었다. 하지만 조건이 참일 때 실행할 코드를 나중에 채워 넣을 계획이 아니라면 이런 코드는 바람직하지 않다. 이런 코드는 코드 6-7과 같이 개선할 수 있다.

if not 조건: **코드 6-7** 조건이 거짓일 때만 실행되는 코드 2

    print('출입 불가')

코드 6-7은 not 연산(4.4.2 불리언 연산을 참고)을 이용해 조건을 부정했다. 조건이 반대로 뒤집혔기 때문에 ‘출입 불가’를 출력하는 코드는 조건이 참일 때 실행될 위치로 옮겨왔다. else 절은 실행될 내용이 없으므로 생략하였다. 코드 6-6에 비해 코드 행 수가 절반으로 줄어들었고 이해하기도 쉽다.

조건을 부정할 때는 not 조건 과 같이 not 연산을 사용하는 경우가 많다. 그런데 부정 연산을 프로그래머가 직접 수행해 프로그래밍하는 경우도 있다. 예를 들면, 연령 < 18 이라는 조건의 부정은 not (연령 < 18) 으로 나타낼 수도 있고, 연령 >= 18과 같이 직접 부정 계산을 해서 나타낼 수도 있다. 부등식의 부정 연산 방법은 다루지 않는다. 잘 모른다면 수학 책을 참고하자.

pass 문

pass 문은 def 문이나 if 문처럼 코드 블록을 본문으로 갖는 표현에서 본문을 비워 둘 때 사용한다. 본문을 비워 두기 위해 정말로 아무 것도 적어두지 않으면 문법 오류가 발생하므로, pass 문이 필요하다.

본문을 비워두는 것이 왜 필요할까? 프로그램 작성 초기에는 프로그램 구석구석의 세부 사항에 신경쓰기보다는 전체 얼개부터 구성하는 것이 유리하다. 여러 함수로 구성된 프로그램을 작성할 때, 함수 하나하나를 본문까지 다 완벽하게 작성하기보다는 여러 함수의 이름과 매개변수 정도만 미리 정의해 두고 본문은 나중에 작성하는 것이다. 이 때, 함수의 본문을 비워두기 위해 pass 문을 활용할 수 있다. pass 문이 사용되는 용도가 이러하므로 pass 문은 나중에 실제 코드 블록으로 대체될 것이라는 의미를 넌지시 드러낸다.

pass 문은 빈 코드 블록을 나타내기 위한 것일 뿐이며, 실행되거나 어떤 값으로 평가되는 표현이 아니다. 따라서 x = pass와 같은 표현은 명백히 잘못된 명령이고 오류를 발생시킨다.

6.1.5 elif: 선택지가 여러 개일 때

선택지가 두 개가 아니라 더 많을 때는 어떻게 해야 할까? if 문에 elif 절을 추가하면 앞에서 검토한 선택지의 조건이 거짓일 때, 그 다음 선택지의 조건을 검토하도록 할 수 있다. 이렇게 함으로써 여러 개의 선택지를 하나의 if 문에서 묶어서 검토하도록 할 수 있다.

elif 절을 포함하면 if 문의 양식은 다음과 같이 확장된다.

if 조건 1:
    본문 1 (조건 1이 참일 때 실행할 코드)
elif 조건 2:
    본문 2 (조건 2가 참일 때 실행할 코드)

...

elif 조건 N:
    본문 N (조건 N이 참일 때 실행할 코드)
else:
    본문 N+1 (모든 조건이 거짓일 때 실행할 코드)

‘elif’는 영어 표현 ‘그렇지 않고 만약 … 이라면(else if …)’을 줄인 것이다. elif 절은 선택지의 개수 만큼 몇 개라도 추가할 수 있다. 다음은 elif 절이 포함된 if 문의 예다.

코드 6-8 elif 절이 함께 사용된 if 문의 예

if 90 <= 점수:
    print('참! 잘했어요')
elif 80 <= 점수:
    print('잘했어요')
elif 70 <= 점수:
    print('좀 더 열심히')
else:
    print('어머니 도와주세요')

위 코드는 점수에 따라 평가 메시지를 출력한다. 점수가 90점 이상이라면 ‘참! 잘했어요’를 출력한다. 80점 이상은 그냥 ‘잘했어요’다. if 문은 앞에서 검사한 조건이 참이면 뒤이어 나오는 선택지들은 검토하지 않는다. 그러므로 점수가 90점 이상이어서 첫 번째 조건이 참이 될 때는 두 번째, 세 번째 조건은 검사하지 않고 건너뛴다. 마찬가지로 점수가 80점 이상일 때는 첫 번째와 두 번째 조건만 차례대로 검사하고, 세 번째 조건은 검사하지 않는다.

만일 elif를 사용하지 않고 if 문을 여러 번 사용해 선택지를 나타내었다면 어떻게 될까?

코드 6-9 elif 를 사용하지 않고 if 문으로만 선택지를 나타냈을 때

if 90 <= 점수:
    print('참! 잘했어요')
if 80 <= 점수:
    print('잘했어요')
if 70 <= 점수:
    print('좀 더 열심히')
else:
    print('어머니 도와주세요')

위 코드를 실행하면 점수가 90점 이상일 때 ‘참! 잘했어요!’ 외에도 ‘잘했어요’, ‘좀 더 열심히’가 함께 출력된다. 점수가 90점 이상이면, 80점 이상이기도 하고, 70점 이상이기도 하기 때문이다. 원래는 ‘참! 잘했어요’를 한 번만 출력해야 하므로 이것은 잘못된 프로그램이다.

코드 6-8은 모든 선택지가 모여 있는 하나의 if 문을 나타낸 것이고, 코드 6-9는 서로 독립적인 세 개의 if 문을 나타낸 것이다. 코드 6-9와 같이 elif를 사용하지 않고 if 문을 여러 번 사용하면 ‘여러 선택지가 있는 한 번의 선택’이 아니라, 단순히 ‘여러 번의 선택’을 나타내는 셈이 된다. 선택은 여러 선택지 가운데 다른 것을 배제하고 하나만 고르는 것이라는 점을 유의하자.

6.1.6 여러 조건 결합하기

if 문에서 여러 조건을 결합하고 싶을 때가 있다. 4.4.2 불리언 연산에서 알아 본 and 연산과 or 연산을 사용하면 여러 조건을 결합해 하나의 조건으로 나타낼 수 있다. 불리언 연산은 이미 배운 것이므로 if 문에서 어떻게 활용되는지만 간단히 살펴보자.

and: 여러 조건이 모두 참

and 연산은 여러 조건이 모두 참인 경우를 나타낼 때 사용된다. 언어 점수와 수학 점수가 모두 90점 이상일 때를 가려내고 싶다면, 다음과 같이 조건을 작성한다.

코드 6-10 여러 조건이 모두 참일 때 (and 연산)

if (90 <= 언어_점수) and (90 <= 수학_점수):
    print('참! 잘했어요')

이와 똑같은 조건을 and 연산을 사용하지 않고 나타내려면, 다음과 같이 if 문을 중첩하여야 한다.

코드 6-11 여러 조건이 모두 참일 때 (if 문 중첩)

if 90 <= 언어_점수:
    if 90 <= 수학_점수:
        print('참! 잘했어요')

or: 여러 조건 중 하나만이라도 참

or 연산은 여러 조건 중 하나만이라도 참이면 되는 경우를 나타낼 때 사용된다. 언어 점수 또는 수학 점수가 90점 이상일 때를 가려내고 싶다면, 다음과 같이 조건을 작성한다.

코드 6-12 여러 조건 중 하나만이라도 참일 때 (or 연산)

if (90 <= 언어_점수) or (90 <= 수학_점수):
    print('참! 잘했어요')

이와 똑같은 조건을 or 연산을 사용하지 않고 나타내려면, 다음과 같이 if 문을 중첩하여야 한다.

코드 6-13 여러 조건 중 하나만이라도 참일 때 (if 문 중첩)

if 90 <= 언어_점수:
    print('참! 잘했어요')
else:
    if 90 <= 수학_점수:
        print('참! 잘했어요')

조건을 결합할 때 주의할 점

or 연산을 이용해 조건을 결합할 때 초보 프로그래머가 저지르기 쉬운 실수가 있다. ‘계절이 봄 또는 가을이다’ 라는 조건을 나타낼 때, 다음 중 어느 것이 올바른 표현인지 생각해 보자.

  1. 계절 == '봄' or '가을'
  2. 계절 == '봄' or 계절 == '가을'

1번 조건은 잘못되었고, 2번 조건이 올바르다. 1번 조건을 풀어 보면, 계절 == '봄' 이라는 비교식과 '가을' 이라는 문자열을 or 연산한 것이다. '가을'이라는 문자열은 항상 참으로 평가된다. 그래서 1번 조건은 원래 의도와는 다르게 계절 변수의 값에 관계없이 항상 참으로 평가되는 조건이다.

이런 실수를 하기 쉬운 이유는 사람의 말에서 주어가 반복될 때 주어를 생략하는 경우가 많기 때문이다. ‘계절이 봄 또는 가을이다’라는 표현을 프로그래밍 언어로 작성할 때는 ‘계절이 봄이다 또는 계절이 가을이다’라는 방식으로 or 연산의 양쪽에 완전한 비교 표현을 해 주도록 한다. (계절 == '봄') or (계절 == '가을')와 같이 or 양변의 비교식을 괄호로 둘러싸 표현하면 헷갈리는 일을 줄일 수 있다.

6.1.7 한 행 짜리 if 문

간단한 조건에 의해 달라지는 값을 나타내고자 할 때, 한 행으로 이루어진 if 문을 사용할 수 있다. 한 행 짜리 if 문의 양식은 다음과 같다.

참값 if 조건 else 거짓값

한 행 짜리 if 문은 조건이 참일 때 참값으로, 조건이 거짓일 때 거짓값으로 평가된다. 다음 코드의 print() 함수에 전달되는 값이 무엇일지 생각해 보자.

코드 6-14 연령 검사를 한 행으로

print('출입 불가' if 연령 < 17 else '출입 가능')

위 코드는 연령 < 18 이라는 조건을 검사해 조건이 참이면 '출입 불가'로, 조건이 거짓이면 '출입 가능'으로 평가된다. 평가된 값은 print() 함수로 전달되어 화면에 출력될 것이다. 이것과 똑같은 기능을 하는 프로그램인 코드 6-4는 네 개의 행으로 이뤄진 것에 반해 코드 6-14는 한 행으로 이뤄져 더 간결하다.

앞서 만들어 본 절대값 계산 함수도 다음과 같이 한 행 짜리 if 문을 사용해 더 간결하게 나타낼 수 있다.

코드 6-15 한 행 짜리 if 문으로 작성한 절대값 계산 함수

def 절대값(n):
    """수 n을 입력받아, 절대값을 반환한다."""
    return n if n >= 0 else -n

이처럼, 간단한 조건에 따라 달라지는 값을 표현할 때는 한 행 짜리 if 문을 사용하면 코드가 간결해지는 장점이 있다. 자주 사용되는 표현이므로 눈에 익혀두는 것이 좋다.

한 행 짜리 if 문은 조건에 따라 여러 행에 걸친 코드를 실행해야 하는 경우에는 적합하지 않다. 이 경우에는 일반적인 if 문을 사용해야 한다.

연습문제

연습문제 6-1 할인된 가격 계산

어떤 상점에서는 상품을 한꺼번에 많이 구매하면 다음과 같이 상품 가격을 할인해 준다.

  • 10개 미만: 상품 하나에 100원
  • 10개 이상 30개 미만: 상품 하나에 95원
  • 30개 이상 100개 미만: 상품 하나에 90원
  • 100개 이상: 상품 하나에 85원

이 쇼핑몰에서 구매할 상품 개수를 입력받아, 총 지불해야 할 가격을 계산하는 함수 price()를 정의하라.

함수를 정의한 후에는 이 함수에 여러 상품 개수를 입력하여 결과가 올바른지 확인해 보아라.

연습문제 6-2 윤년 계산

연을 매개변수로 입력받아 그 해가 윤년인지 아닌지를 True 또는 False로 반환하는 함수 is_leap_year()를 정의하라.

윤년이란 1년이 365일이 아니라 366일로 이뤄진 해다. 윤년에는 2월이 28일까지가 아니라 29일까지 있다. 어떤 해가 윤년인지 아닌지를 판단하는 규칙은 다음과 같다.

  • 그 해의 수가 4로 나누어 떨어지면 윤년이다. (예: 1996년은 윤년이다)
  • 단, 그 해의 수가 100로 나누어 떨어지면 윤년이 아니다. (예: 1900년은 윤년이 아니다.)
  • 단, 그 해의 수가 400으로 나누어 떨어지면 윤년이다. (예: 2000년은 윤년이다.)

연습문제 6-3 한 달의 길이

연과 월을 매개변수로 입력받아, 그 달이 며칠까지 있는지 반환하는 함수 days_in_month()를 작성하라. 이 때, 2월의 길이는 윤년인지 아닌지에 따라 다르다. 윤년 계산을 위해 연습문제 6-2에서 만든 함수를 활용하라.

연습문제 6-4 비만도 검사

사용자로부터 키와 몸무게를 입력받아 비만 정도를 알려주는 프로그램을 작성하라.

비만도를 측정하는 방법:

  1. 체질량 지수를 구한다. 키가 t 미터, 체중이 w 킬로그램일 때, 체질량 지수는 w / (t * t) 다.
  2. 1예서 구한 체질량 지수가 18.5 미만이면 저체중, 18.5 이상 23 미만이면 정상, 23 이상 25 미만이면 과체중, 25 이상이면 비만이다.

실행 예:

키를 입력하세요(m): 1.75
몸무게를 입력하세요(kg): 65
정상입니다.

힌트: 문제를 필요한 만큼 여러 단계로 나누어, 여러 개의 함수를 정의하여 해결하자.

연습문제 6-5 아빠가 더 좋아, 엄마가 더 좋아?

아빠 < 엄마 라는 조건을 검사하여, 조건이 참이면 '엄마가 더 좋아'로, 조건이 거짓이면 '아빠가 더 좋아'로 평가되는 한 행 짜리 if 문을 작성해 보아라.