본문 바로가기
Python/Python Basic

11. Python - 조건문(if, else, if-else)

by Rosmary 2019. 8. 26.
728x90
반응형

이전 포스팅에서는 반복문을 통해, 구구단을 출력하는 과정에 대해 알아보았다. 코드의 실행 결과, 2단의 경우, 2 x 1 부터 2 x 9까지 연산값이 출력되었다. 그런데, 여러분들이 어떤 이유로 인해 2 x 5와 2 x 7의 값은 제외한 값이 출력되도록 코드를 수정해야한다고 요구를 받았다.

 

지금까지의 내용을 토대로, 2 x 5와 2 x 7 값을 제외하고 2단의 내용을 출력하고자 한다면, for 문을 사용할 수 없다. 2 x n 연산의 n 값이 제외되어야 하는 뚜렷한 규칙이 존재하지 않기 때문이다. 하지만, 그렇다고 2단 연산을 print() 함수로 일일이 입력하는 것은 효율적이지도 않을 뿐더러, 귀찮은 작업이다. 그렇다면, for 문을 대대적으로 수정하지 않고, 요구 내용을 충족시킬 수 있는 방법은 없을까?

 

모든 프로그래밍 언어 내에는, 특정 조건에 따라 서로 다른 코드를 수행할 수 있는 문법이 존재하는데, 이를 조건문이라고 부른다. 조건문은 오솔길 끝에 난 갈림길과 비슷하다. 컴퓨터는 프로그래머가 작성한 코드를 순차적으로 수행하다가 이 조건문을 만나면, 조건문에 명시된 조건을 확인하게 된다. 만약 이 조건이 현재 컴퓨터가 처한 상황과 일치한다면, 해당 조건문 내에 명시된 코드를 실행하고, 그렇지 않다면 조건문을 건너 다른 코드를 수행하게 된다. 

 

조건문의 수행에 대해 간략하게 그림으로 나타내면 위의 그림과 같다. A 값은 조건문인 if 문을 만나기 전에, A=6 값을 가지므로, 조건문에 명시된 조건과 일치하게 되어, print(A, B)를 수행하게 된다. 더불어, 빨간 화살표 끝의 코드는 수행되지 않는다.

 

이러한 조건문의 특성을 이용하면, for문의 변경없이도, 2 x 5와 2 x 7을 제외한 2단 연산 내용을 출력할 수 있게 된다.

 

 

그럼, 이 문제를 해결하기 위한 코드를 작성하기 전에, 조건문을 사용하는 방법에 대해 알아보자.

 

 

1. 조건문 if

 

코드의 분기에 사용하는 조건문은 if다. if 문의 포맷은 아래와 같다.

 

=========================

if ( 특정 조건 명시 ) :

    조건 만족 시, 수행할 코드 작성

=========================

 

포맷은 반복문인 while 문과 매우 유사하다. while 이후 괄호 내에 특정 조건을 명시하고, 그 조건이 만족될 경우 수행할 코드를 이어서 작성하는 것처럼, if 문도 비슷한 방법으로 사용하면 된다.

 

다음의 예로 조건문의 결과를 살펴보자. 필자는 list형 변수를 선언한 뒤, Alex와 Bretta의 인적 정보를 각각의 변수에 넣어, 성별에 따른 코드 수행을 달리 진행해보려고 한다. 만약, 인적사항의 성별이 남성이라면 Gentleman을, 여자라면 Lady를 출력한다.

 

 

2명의 인적사항은, 하나의 Tuple로 만든 뒤, for 문에 사용했다. for 문 수행은 첫 번째  인자로 people1이 사용되며, people1 List의 두 번째 값이 "male"이므로, if 조건 중 people[1] == "male"을 만족한다. 따라서 people1 인자는 Gentleman을 출력하는 코드를 수행하도록 유도된다.

 

두 번째 인자인 people2는 성별이 "female"이므로, 첫 if 조건인 people[1]=="male"을 만족하지 못한다. 따라서 Gentleman을 수행하지 않고, 다음 코드로 넘어간다. 두 번째 if 조건은 첫 조건과 달리 people[1]=="female"이며, people2의 성별은 이 조건을 만족하므로, Lady를 출력하는 코드가 수행된다.

 

위의 예시처럼 조건문을 이용하여, 조건에 따라 서로 다른 결과가 수행되도록 코드를 작성할 수 있다.

 

 

2. if ~ else ~ 

 

그런데, 위의 예시처럼, 남자와 여자로 조건이 단 두 가지만 존재하는 경우, if 문 내에 일일이 조건을 작성하는 것이 여간 귀찮은 일이 아니다. 만약 첫 조건을 "남자일 경우"라고 명시했을 때, 그 뒤의 조건은 "그렇지 않을 때"라고 저절로 컴퓨터가 인식할 수 있게 한다면, 훨씬 더 코드를 빠르고 효율적으로 작성할 수 있을 것이다. 

 

이러한 목적으로 만들어진 것이 if ~ else 문이다. if ~ else문의 포맷은 다음과 같다.

 

==============================

if ( 특정 조건 ):

    조건과 일치할 경우, 수행할 코드

else :

    조건과 일치하지 않는 경우, 수행할 코드

===============================

 

if 문에 "특정 조건"이 존재한다면, else는 if문의 조건과 반대되는 조건을 자동으로 인식하여 else 아래의 코드를 수행하게 된다. 즉, else 뒤에는 조건이 명시되어 있지 않지만, 컴퓨터는 else문의 조건을 "특정 조건이 아닌 경우"로 인식한다. 이는 참 / 거짓 조건을 이용한다고도 말할 수 있는데, 그렇기 때문에 조건이 3개 이상 존재하는 경우, if, else 문 만으로 코드를 작성하기가 까다롭다(까다로울 뿐이지, 불가능한 것은 아니다).

 

if 문만으로 작성했던 Gentleman/Lady 코드는, 다음과 같이 if else문으로 변경할 수 있다. 

 

 

 

3. elif 문

 

이제, 조금 더 특수한 상황에 대해 살펴보자. 감수분열을 하는 모든 동물은 암수의 성별을 지닌다. 하지만, 매우 드문 경우지만, 유전자 이상으로 인해, 암수를 특정짓기 어려운 개체가 나타나기도 하며, 사람도 예외는 아니다(고등학교 생물시간에 배운 클라인펠터 증후군이나 터너 증후군을 그 예로 들 수 있겠다). 그렇다면, 남녀를 특정지을 수 없는 사람까지 조건에 포함시켜야한다면, 조건문을 어떻게 표현해야 할까? 남녀를 특정지을 수 없는 사람의 성별은 중성(androgyny)으로 나타낸다고 하자.

 

 

기존의 if, else문을 사용하면, Charley의 성별인 중성은 첫 조건에 부합하지 않아, else 문 코드를 수행하도록 유도된다. 따라서 Charley가 Lady라는 출력물이 나타나게 된다. 즉, 조건이 3개 이상이므로 if ~else 문으로는 모든 조건을 만족할 만한 코드를 작성할 수 없다. 조건이 3개 이상일 경우, 모든 조건을 if 문을 표현하여 나타내는 것도 하나의 방법이긴 하지만, 이 방법은 조건의 수가 많아지면 많아질수록, 컴퓨터가 수행하는 연산량이 늘어나므로 좋은 방법이 아니다.

 

조건이 3개 이상일 경우, 조건에 따른 분기점을 만들기 위해 사용하는 프로그래밍 문법은 if ~ elif ~ else문이다. elif는 else if의 줄임말이다. 즉, 첫 조건을 만족하지 않다면, 다음 elif문에서 첫 조건에 만족하지 않는 조건 중, elif 조건과 부합하는지 확인하고, 이 조건을 만족한다면 elif 문 아래의 코드를 수행하게 된다. 만약 elif 문의 조건마저도 부합하지 않는다면, else 문에서 첫 조건과 두 번째 조건을 만족하지 않는지 확인한 뒤, 만족한다면 else 문 아래의 코드를 수행하게 된다. 다음의 코드를 보자.

 

 

사실, 위의 코드는 if 문으로만 작성하더라도 결과는 차이가 없다. 그럼에도 불구하고 elif 문을 사용하는 이유는, 앞서 언급했듯이 컴퓨터의 연산 처리와 관련이 있다. 

 

코드 내에서 분기점이 많아지면, 컴퓨터의 연산 수행에 부담이 가중된다.

 

따라서 , if ~ elif ~ else 문을 사용하면 컴퓨터 연산에 큰 영향을 주지 않고, 3개 이상의 조건에 대해 코드 분기점을 형성할 수 있게 된다.

 

 

 

4. 조건의 작성 

 

마지막으로, 조건문의 괄호 안에 명시되는 조건의 작성 과정에 대해 살펴보자. 컴퓨터가 사람의 언어인 "A가 3보다 크다면"이라는 문구를 이해할 수 없기 때문에, "A > 3"이라는 비교 연산자를 사용하여, 컴퓨터에게 명령을 내린다는 것을 이전 포스팅에서 언급했다. 그렇다면 비교 연산자 외에, 컴퓨터가 이해할 수 있는 조건 연산에는 어떤 것이 있는지 확인해보자.

 

 

(1) 비교 연산자 ( ==, !=, <, >, <=, >=, True, False )

 

지난 포스팅에서 언급한 내용이므로 넘어간다.

 

 

(2) 논리 연산자 and

 

and 연산자는 특정 두 가지 조건이 동시에 만족하는지 확인하는 연산자다. 만약, a라는 변수와 b라는 변수가 각각 10, 15라는 값을 가지고 있고, 특정 코드를 수행하기 위해서, a==10과 b==15의 조건을 만족해야한다고 가정해보자. 조건문에 a, b 변수값이 10과 15로 동시에 일치하는지 확인하기 위해서, 다음과 같이 and 연산을 사용하면 된다.

 

 

만약, 변수 a와 b  중 하나라도 일치하지 않는다면, 아래와 같이 코드가 수행되지 않는다.

 

 

(3) 논리 연산자 or

 

이제, 변수 a와 b 값 중, a==10 과 b==15 조건 중 하나만 만족하는 경우에, 특정 코드가 실행되도록 만들어보자. 이 때 사용하는 논리 연산자는 or 다. 즉, 조건1을 만족하거나, 조건 2를 만족하는 경우에 코드가 수행된다.

 

 

or 연산자를 이용한 조건문은, 조건들 중 하나만 일치하더라도 if 문 아래의 코드를 수행한다. 즉, "조건1 or 조건2"일 경우, 조건1과 조건2 중 하나만 일치하는 경우는 물론, 둘 다 일치하는 경우에도 코드가 수행된다.

 

 

(3) not

 

not은 의미 그대로, 조건을 부정할 때 사용하는 예약어다. 즉, 특정 조건에 부합하지 않는 조건을 조건문에서 사용하고자 할 때 사용하며, 조건 앞에 "not"을 명시해주면 된다.

 

위의 예시에서, not의 사용법을 알 수 있다. 조건문의 a == 9 앞에 not을 입력함으로써, 조건문의 조건은 "a !=9"라는 의미를 가지게 된다. 변수 a는 10으로 선언되었기 때문에, 해당 조건을 만족하며, 따라서 print(a)가 실행되게 된다.

 

 

위의 그림처럼, not은 한 개 이상의 조건을 and나 or 연산자로 묶은 결과를 부정할 수도 있다. 

 


 

지금까지 언급한 논리연산자와 조건문(if, if else, if elif else)을 for문 내에 추가함으로써, 2 x 5 및 2 x 7의 결과를 제외한 2단을 출력하는 것이 가능하다. 방법은 일일히 열거할 수 없을 정도로 매우 많다. 직접 코드를 작성해보자.

 

FIN.

반응형

댓글