우리는 일상 속에서 어떤 조건에 따라 두 개 또는 여러 개의 선택을 한다. 예를 들어 비가 오면 우산을 챙기고 그렇지 않다면 챙기지 않는 것이 있다. 프로그램 또한 들어오는 정보에 따라서 많은 선택을 하게 된다. 이런 식으로 조건에 따라 결정을 내리는 문장을 조건문이라고 한다.
if - else 문은 조건에 따라서 2개 중에서 하나를 선택해야 하는 경우에 사용되는 문장이다. 예를 들어 성적이 60점수 이상의 유무에 따라 합격, 불합격으로 나뉘는 것이 있다.
if score >= 60:
print("합격")
else :
print("불합격")
if - else 문에서 조건을 수식으로 표현하는데 이를 '조건식'이라 하며, 무조건 참과 거짓으로 나뉜다.
조건식 뒤에 콜론(:)이 있다. 콜론(:)은 인터프리터에게 "아직 문장이 끝나지 않았으니 잠시 해석을 미뤄달라" 라고 요청하는 기호라고 볼 수 있다. if - else문은 주어진 조건식을 계산하여 조건식이 참(True)이면 if 아래의 문장을, 거짓이면 else 아래의 문장을 실행한다.
아울러 때에 따라 else문은 생략이 가능하다.
like_number = 7
if like_number == 7:
print("난 7이 좋앙!")
결과: "난 7이 좋앙!"
비교(관계)연산자는 두 개의 피연산자를 비교하는데 사용된다. 예를 들면 "변수 x가 변수 y보다 큰가?"와 같이 사용된다. 관계 연산자의 결과는 참(True)아니면 거짓(False)으로 계산된다.
연산 | 의미 |
---|---|
x == y | x와 y는 같은가? |
x != y | x와 y는 다른가? |
x > y | x는 y보다 큰가? |
x < y | x는 y보다 작은가? |
x >= y | x는 y보다 크거나 같은가? |
x <= y | x는 y보다 작거나 같은가? |
예를 들어 50!=10 은 참(True)을, 21 <= 10 은 거짓(False)를 생성한다.
조건식에는 변수를 사용할 수 있다. 즉 (x > y)와 같은 수식이 가능하다는 것이다. 변수 x가 변수 y보다 크면 이 수식의 값은 1이 된다. 반대로 변수 x의 값이 y보다 작다면 0이 된다. 통상 프로그래밍 언어에서는 0은 False를 의미하면 0이외의 양수는 true로 본다. 하여 양수의 대표값인 1이 true가 되는 것이다.
참고로 음수의 대표적인 값은 -1, 양수의 대표적인 값은 1 이다.
>>> age=10
>>> age > 5
True
>>> age != 10
False
조건식에서는 항상 참(True) 혹은 거짓(False)이다. 파이썬에서는 참과 거짓을 저장하는 변수를 만들 수 있는데 이를 부울 변수라고 칭한다. 정수, 실수, 문자열 변수는 많은 값을 가지지만, 부울 변수는 오직 True, False 값만을 가진다. 이 부울 변수는 프로그래밍에서 플래그(flag)변수로 많이 사용된다. 다른 변수 처럼 부울값은 수식에서 사용될 수 있으며 변수 안에 저장될 수 있다.
깃발을 영어로 하면 flag이다. 보통 깃발을 세우면 참, 눕히면 거짓을 뜻하는데 이를 참고했다.
>>>flag = True
>>>flag
True
다른언어에서는 참과 거짓을 소문자로 true, false 시작하지만 파이썬에서는 True, False와 같이 대문자로 시작한다.
만일 True인 flag의 값을 바꾸고 싶다면 not연산자를 사용하면 된다. 즉 다음과 같이 사용하면 된다.
flag = not flag
참고로 '부울형' 이란 19세기 영국의 수학자였던 George Boole을 기리기 위하여 만들어졌다. 부울은 0과 1(또는 참과 거짓)만을 사용하는 논리 시스템을 고안하였다. 이것이 결국은 현재 PC의 초석이 되었다. 컴퓨터는 결정을 내리기 위해서는 부울형의 수식을 사용한다. 즉 실행경로 중에서 하나를 선택할 때는 부울형의 값에 따르는 것이다.
순서도는 프로그램을 작성하기 전에 그림으로 한번 그려보는 것을 말한다. 물론 현재의 객체지향 프로그램에 있어서는 좀 퇴색이 되는 경향이 없지 않아 있지만 프로그램의 초창기 절차지향적 프로그래밍을 할 때는 많이 사용되었다. 하지만 아직까지도 컴퓨터 구조론에 나오고 자격증 시험에도 나오기 때문에 알아두면 좋다.
다음은 순서도의 기호와 예시이다.
눈이 올 때 어떻게 대처할 것인지를 순서도로 그려보라. 눈이 오지 않으면 외출한다.
눈이 오면 우산을 가지고 있는지 검사한다. 우산을 가지고 있다면 외출한다. 우산을
가지고 있지 않다면 무한정 눈이 그칠 때까지 기다린다.
만약 조건이 참인 경우 여러 문장을 실행해야 할때는 블록을 만들어야 한다.
예를 들어 성적이 90점 이상이라 합격과 동시에 장학금을 받을 수 있다고 하자. 이는 2개의 출력함수를 이용해 적어도 2줄이상이 작성되어야 한다.
이 때 주의 해야할 것은 공백이다. if문 아래에는 동일한 개수의 공백을 가지고 있어야 한다. 그래야 이들이 한 블록에 속해있다는 것을 인식한다. C언어는 ;를 통해 문장의 끝을 알 수 있지만 파이썬은 그렇지 않기에 공백을 잘 맞춰야 한다.
파이참의 경우 알아서 블록 형태를 만들어 주지만 알고는 있어야 한다.
if score >= 90:
print(“합격입니다.)
print(“장학금도 받을 수 있습니다“)
결과: IndentationError: unindent does not match any outer indentation level
블록 안에 새로운 블록을 만드는 것이 가능하다.
이 때 소스의 가독성을 높이려면 들여쓰기를 할 때 일관된 방법을 사용하는 것이 좋다. 즉 TAB 키를 사용하였다면 프로그램의 나머지 부분에서 TAB키를 사용하여서 블록의 공간을 똑같이 해주는 것이 편리하다는 것이다.
논리 연산자(logical operator)는 여러 개의 조건을 조합하여 참인지 거짓인지를 따질 때 사용한다.
논리 연산자는 다음과 같다.
연산 | 의미 |
---|---|
x and y | AND연산(논리곱): x와 y가 모두 참이면 참이 출력되고 그렇지 않으면 거짓이다. |
x or y | OR연산(논리합): x나 y 둘 중 하나라도 참이면 참이 출력되고 그렇지 않으면 거짓이다. |
not x | NOT연산(논리부정): x가 참이면 거짓이, 거짓이면 참이 출력된다. |
>>> age = 20
>>> height = 180
>>> if( (age>=10) and (height>=165)) :
print("놀이 기구를 탈 수 있습니다.")
else :
print("놀이 기구를 탈 수 없습니다.")
결과 -> 놀이 기구를 탈 수 있습니다.
if 의 조건식에 and 연산자를 사용할 때 주의 해야할 점이 있다.
and연산자의 경우 여러 조건 중에서 한 조건이 거짓이면 뒤의 조건은 전부 검사조차 하지 않고 무시한다. 이러한 계산을 단축 계산이라고도 한다. 프로그램의 성능을 높이기 위해 한 조건이 어처피 거짓이니 나머지 조건들은 계산하지 않아도 and연산자 조건식은 거짓으로 판단하는 것이다.
예를 들어 if ((2>22) and (10>2)): ... 에서 첫 번째 조건이 거짓이므로 뒤의 조건은 검사를 안하는 것이다.
논리 부정 연산자
논리 부정을 나타내는 not연산자는 조건이 참이면 전체 수식을 거짓으로 만들고, 조건이 거짓이면 전체 수직을 참으로 만들어준다.
예를 들면 not(1==0)는 참이 된다. (1==0)는 원래 거짓이지만 not가 참으로 만들어 주는 것이다.
프로그램은 조건에 따라 다중으로 분기되는 결정을 내릴 수 있다.
물론 if문 여러 개로 비슷한 결과를 출력할 수 있지만 CPU의 성능에 효율적이지 못하기에 if~ elif문을 쓰는 것이 좋다.
if와 if elif문의 옆에는 조건이 있어야한다. 반대로 else문은 조건이 없어야 한다.
예를 들어 대학교 성적이 있다. 성적의 조건에 따라 A,B,C 등으로 나뉘는 것이다.
score = int(input("성적을 입력하시오: "))
if score >= 90 :
print("학점 A")
elif score >= 80 :
print("학점 B")
elif score >= 70 :
print("학점 C")
elif score >= 60 :
print("학점 D")
else :
print("학점 F");
결과:
성적을 입력하시오: 74
학점 C
기억해야 할 점은 if ~ elif 구문에서는 다중 조건 중 하나만 만족하게 된다면 그 이후는 실행되지 않는다 라는 점이다. 즉 위에서 읽어 내려오다가 한 조건이 충족되면 나머지들은 검사를 하지 않고 넘어간다.
위의 예의 경우는 다음과 같다.
조건문은 중첩해서 사용이 가능하다. if~else 구문 안에 여러 개의 if~else 기입이 가능하다. 이는 들여쓰기를 통해 중첩의 수준을 파악할 수 있다.
하지만 이러한 중첩은 자칫 프로그램의 가독성이 떨어질수 있으니 많이 쓰지 않는 것이 바람직하며 통상 2개 정도만 써도 어느정도의 문제는 다 해결된다.
appleQuality = input("사과의 상태를 입력하시오: ")
applePrice = int(input("사과 1개의 가격을 입력하시오: "))
if appleQuality == "신선":
if applePrice < 1000:
print("10개를 산다")
else:
print("5개를 산다")
else:
print("사과를 사지 않는다.")
숫자 100과 문자열 "100"은 컴퓨터에서 다르게 처리한다.
문자열의 저장은 3개의 공간에 각각 1, 0, 0이 들어가는 형태이며, 숫자의 저장은 한 개의 공간에 2진법으로 01100100으로 저장된다.
if문의 조건식에서도 문자열과 숫자를 구분한다.
>>>s="100"
>>>number=int(s)
>>>if number == 100
print("정수 100입니다.")
else
print("정수 100이 아닙니다.")
결과:
정수 100입니다.