Development language/Python

Python-7. Conditional Statement(조건문) / Boolean application

DOT-ICD 2021. 11. 11. 23:42
728x90

Q. Conditional Statement?

한글로 표현하면 조건문이다. 조건문이란 조건의 상태(참/거짓)에 따라 그 조건문의 아래에 있는 코드를 실행할지 실행하지 않을지를 결정하는 수행문이다. 이제 Python에서 어떻게 구현할 수 있는지 알아보자.

 


Indentation

Python에서는 어떤 수행문 아래의 블럭을 표시할 때 C언어처럼 괄호를 통해 표시하는 것이 아니라 들여쓰기를 통해 표시한다. 일반적으로 다음과 같다. 이는 Loop, 모듈 등을 다룰 때에도 동일하게 적용된다! 

if <<condition>>:
    <<block>>
    <<block>>
    <<block>>

Python을 지원하는 코드에디터 및 종합개발환경의 경우 콜론 이후 엔터를 치면 자동으로 들여쓰기를 해준다.


if statement

if <<condition>>:
    <<block>>
    <<block>>
    <<block>>

if문의 형태는 위와 같다. 이때 condition(조건)은 결과가 Boolean (True or False)인 조건식 또는 Boolean 자료형 객체이다.

조건이 True라면 들여쓰기된 코드블럭을 실행하고, False라면 코드블럭을 실행하지 않는다.


if문은 당연하게도 하나의 프로그램에서 여러개를 병렬로 쌓아서 사용할 수도 있고, 직렬로 쌓아서 사용할 수 있다.

Case1. 병렬로 쌓기

아래의 예시를 보자.

age = int(input("나이를 숫자만으로 입력하세요")
sex = input("성별을 male 또는 female로 입력하세요")

if age > 20 :
     print("성인입니다.")

if sex == "male" :
    print("남성입니다")

if문은 서로 영향을 주지 않고 각각 사용되었다.

첫번째 if문에서 입력받은 나이가 20 이상이라면 '성인입니다.' 라는 문구가 출력된다.

두번째 if문에서 입력받은 성별이 'male' 이라면 '남성입니다.' 라는 문구가 출력된다.

첫번째 if문의 작동 여부는 두번째 if문의 작동 여부에 영향을 주지 않는다.

이러한 방식으로 여러개의 if문을 하나의 프로그램에서 여러번 사용할 수 있다.


Case2. 직렬로 쌓기

if-elif-else의 형태로 조건문은 직렬로 쌓을 수 있다. 

age = int(input("나이를 숫자만으로 입력하세요")

if age > 20 :
     print("성인입니다.")
else :
    print("미성년자입니다.")

Case1의 경우와 상당히 다른 모습이다.

else의 경우 직전의 if문 또는 elif의 조건식의 값이 False인경우 실행된다.

단, else직전의 if문의 조건식이 True여서 if문 아래의 코드블럭이 실행되었다면 이후의 else문 아래의 코드블럭 안의 내용은 어떠한 작업도 거치지 않은채로 무시한다.

 

즉, 입력받은 나이의 값이 20이하 예를 들어 18 이라면 else 직전의 if문의 조건식 age > 20 의 결과값은 False이고, 이에 따라 print("성인입니다.")라는 코드블럭은 실행되지 않는다. 대신, 그 뒤의 else 아래의 코드블럭인 print("미성년자입니다.")가 실행된다.

age = int(input("나이를 숫자만으로 입력하세요")

if age > 20 :
     print("성인입니다.")
elif age > 13 :
    print("청소년입니다.")
else :
    print("어린이입니다.")

elif의 경우 직전의 if 또는 elif의 조건식의 값이 False인 경우, 자신의 조건식이 True라면 자신의 아래의 코드블럭을 실행한다. (elif가 else if의 줄임말임을 생각해보면 당연하다는 것을 알 수 있다.)

단, elif/else직전의 if/elif문의 조건식이 True여서 if문 아래의 코드블럭이 실행되었다면 이후의 elif/else문 아래의 코드블럭 안의 내용은 어떠한 작업도 거치지 않은채로 무시한다.

 

즉, 입력받은 나이의 값이 18이라면 첫번째 if문의 조건식 age > 20의 값이 False이기 때문에 print("성인입니다")는 실행되지 않는다. 이후 elif의 조건식인 age > 13 의 값이 True이기 때문에 print("청소년입니다")가 실행된다. else:아래의 코드블럭은 직전 elif의 조건식의 값이 True였기 때문에 실행되지 않는다.


*직렬로 쌓은 if-elif-~~-else조건문 여러개를 병렬로 쌓는 것은 당연히 가능하다. 아래의 중첩if문을 참조하자.

*elif문의 개수는 조건식을 설정하는 것에 있어서 논리오류만 없다면 몇개를 사용하든 제한이 존재하지 않는다.

*어떤 elif문의 조건식을 설정할 때, 앞의 if/elif문의 조건식에 포함되는(충분조건 또는 필요충분조건인) 조건식을 작성한다면 그 elif문은 논리오류를 발생시킬 것이다.

*병렬로 쌓은 조건문을 통해 직렬로 쌓은 조건문처럼 동작하도록 구현할 수 있다. 그러나, 직렬로 쌓았다면 하지 않았을 비교연산을 병렬로 쌓는다면 수행할 것이다. 이 경우 컴퓨터의 자원을 쓸데없이 사용하는 것이므로, 조건문을 직렬로 쌓을 수 있다면 그렇게 하는 것이 컴퓨터의 자원을 아끼는 방법이다.

 

결론적으로 직렬로 쌓은 조건문들은 서로의 실행여부가 서로에게 영향을 준다!


Nested if statements-중첩if문

앞에서 배운 if/elif/else를 활용해보자.

 

아래의 동작을 수행하는 프로그램을 작성해보자.

우선 나이와 성별을 입력받는다. 이후 나이가 21세 이상이면 성인입니다를 출력하고 성별을 출력한다. 나이가 14~20세 이면 청소년입니다를 출력하고 성별을 출력한다. 나이가 13세 이하라면 어린이입니다를 출력하고 성별을 출력한다. 

 

이 프로그램을 코드로 표현하면 다음과 같다.

age = int(input("나이를 숫자로 입력하세요."))
sex = input("성별을 male 또는 female로 입력하세요")

if age > 20 :
    print("성인입니다.")
    
    if sex == "male":
        print("남성입니다.")
    elif sex == "female":
        print("여성입니다.")
    else :
        print("성별을 잘못 입력하였습니다.")

elif age > 13 :
    print("청소년입니다.")
    
    if sex == "male":
        print("남성입니다.")
    elif sex == "female":
        print("여성입니다.")
    else :
        print("성별을 잘못 입력하였습니다.")
        
else :
    print("어린이입니다.")
    
    if sex == "male":
        print("남성입니다.")
    elif sex == "female":
        print("여성입니다.")
    else :
        print("성별을 잘못 입력하였습니다.")

이처럼 if문은 여러번 중첩해서 사용할 수도 있다. 중첩해서 사용하는 경우에도 병렬로 쌓을 수 있고, 직렬로 쌓을 수 있다.


Boolean variable Application

읽기 쉬운 코드를 만드는 방법은 간단하다. 우리가 일상적으로 사용하는 언어 표현의 방식에 가깝게 코드를 작성하면 된다. 이를 위해 우리는 if문에 직접 복잡한 조건식(비교연산자와 Boolean연산자 등을 사용한)대신 이 결과를 담아놓은 Boolean형 변수를 사용한다면 더욱 가독성이 좋은 코드를 만들 수 있다.

 

아래의 코드를 보자

age = int(input("나이를 숫자로 입력하세요"))

child = age <= 13
teen = age > 13 and age <= 20
adult = age > 20

if adult :
    print("성인입니다.")
elif teen :
    print("청소년입니다.")
elif child :
    print("어린이입니다.")

위의 코드에서는 if/elif의 조건식의 결과를 미리 child/teen/adult라는 Boolean type의 객체에 담아 사용했다. 프로그램의 작동 방식은 앞의 예제들과 거의 같다. 하지만 훨씬 코드의 의미를 파악하기 쉬워졌다는 점을 알 수 있다. 

 

따라서 Boolean type의 객체에 적절한 이름을 붙여 조건식의 결과를 미리 저장하고 사용한다면 가독성이 좋은 코드를 작성하는 것에 있어서 도움이 된다!

728x90