파이썬프로그래밍기초 5강 - 선택 구조와 논리 연산자
프로그램이 조건에 따라 서로 다른 명령을 실행하도록 만드는 선택 구조를 학습한다. 불리언식과 비교·논리 연산자, 단락 평가를 이해하고 단순·이분·다분·중첩 선택 구조를 실제 문제에 적용한다.
제1장 선택 구조의 이해
1. 선택 구조의 정의
선택 구조는 특정 영역에 있는 명령문의 실행 여부를 프로그램의 실행 과정 중 조건에 따라 결정하는 구조이다. 순차 구조가 작성된 명령을 차례대로 실행한다면, 선택 구조는 현재 상황을 검사한 뒤 필요한 명령만 실행한다. 동일한 입력에 언제나 똑같이 반응하는 것이 아니라 상황에 따라 다르게 행동하게 하므로 프로그램이 지능적으로 동작하는 출발점이 된다.
예를 들어 배송 과정에서 상품이 정상이라는 검사 결과가 나오면 배송하고, 불량이면 재생이나 오류 처리 과정으로 보낼 수 있다. 이처럼 선택 구조는 정상 처리뿐 아니라 예외 상황에 대응하여 프로그램의 안정성을 높이는 데에도 사용된다.
2. 단순 선택 구조의 구문
파이썬의 단순 선택 구조는 if 키워드와 불리언식, 콜론으로 시작한다. 조건이 참일 때 실행할 명령문 집합은 같은 깊이로 들여쓴다.
if 불리언식:
명령문1
명령문2
들여쓰기가 같은 명령문들은 하나의 코드 블록을 이룬다. 코드 블록은 특정 동작을 수행하는 한 줄 이상의 명령문 집합이며, 파이썬은 중괄호가 아니라 들여쓰기로 블록의 범위를 표현한다. 강의록은 PEP 8에 따라 스페이스 4칸 들여쓰기를 권장한다.
제어 흐름
불리언식이 True이면 들여쓴 명령문 집합을 실행한 뒤 다음 문장으로 이동한다. False이면 블록 전체를 건너뛰고 선택 구조 다음 문장으로 이동한다.
3. 불리언식과 비교 연산자
비교 연산자를 사용하여 결과가 불리언(Boolean) 타입으로 생성되는 표현식을 불리언식이라고 한다. 불리언 타입은 논리값인 참(True)과 거짓(False)만 표현하며, 파이썬에서는 첫 글자를 대문자로 쓴 예약어로 나타낸다. 비교 연산자의 결과나 선택·반복문의 조건 평가에 사용된다.
| 연산자 | 수학적 표현 | 의미 |
|---|---|---|
< | < | 작다 |
<= | ≤ | 작거나 같다 |
> | > | 크다 |
>= | ≥ | 크거나 같다 |
== | = | 같다 |
!= | ≠ | 같지 않다 |
대입과 비교를 구분한다
=는 오른쪽 값을 왼쪽 변수에 저장하는 할당 연산자이고, ==는 두 값이 같은지 비교하는 연산자이다. 조건식에서 둘을 혼동하지 않아야 한다.
제2장 연산자 우선순위와 조건 적용
1. 비교 연산자를 포함한 우선순위
한 표현식에 여러 연산자가 있으면 파이썬은 정해진 우선순위에 따라 계산한다. 강의록의 첫 번째 확장 순서는 괄호 내부의 수식, 거듭제곱(**), 곱셈·실수 나눗셈·정수 나눗셈·모듈로, 덧셈·뺄셈, 비교 연산자, 할당 연산자 순이다. 같은 우선순위의 산술 연산자는 일반적으로 왼쪽에서 오른쪽으로 적용하지만 거듭제곱은 오른쪽에서 왼쪽으로 결합한다.
예를 들어 rad > 0은 변수 rad의 값이 0보다 큰지를 검사하여 True 또는 False를 만든다. 3 > 6, suf == vol, light_on = 3 > 6, isStop = suf == vol처럼 비교 결과를 직접 사용하거나 변수에 저장할 수 있다.
2. 원뿔 계산 프로그램의 입력 검사
원뿔의 모선, 부피와 겉넓이를 계산하려면 반지름과 높이가 계산 가능한 값인지 먼저 확인할 수 있다. 강의록의 초기 프로그램은 두 값을 입력받은 뒤 바로 계산하므로 사용자가 음수를 입력해도 결과를 출력한다. 선택 구조를 추가하면 올바른 범위의 입력일 때만 계산하도록 제한할 수 있다.
rad = int(input("반지름을 입력하세요: "))
hei = int(input("높이를 입력하세요: "))
if rad >= 0:
sla = pow(rad ** 2 + hei ** 2, 0.5)
vol = 1 / 3 * 3.14 * rad ** 2 * hei
suf = 3.14 * rad ** 2 + 3.14 * rad * sla
print("원뿔의 부피는", str(vol) + "입니다.")
print("원뿔의 겉넓이는", str(suf) + "입니다.")
이 코드는 반지름만 검사하므로 높이가 음수인 경우를 막지 못한다. 두 값이 모두 유효해야 계산한다는 요구를 정확히 표현하려면 논리 연산자가 필요하다.
제3장 논리 연산자
1. 논리 연산자의 정의
명제는 참과 거짓 중 하나의 진리값만 갖는 서술문이다. 논리 연산자는 참과 거짓을 구별할 수 있는 명제를 대상으로 명제의 진리값을 계산한다. 프로그래밍에서는 불리언식에 적용해 또 하나의 불리언 값을 산출한다. 두 논리값을 결합하는 이항 연산자로 and와 or가 있고, 하나의 논리값을 반전하는 단항 연산자로 not이 있다.
| b1 | b2 | b1 and b2 | b1 or b2 |
|---|---|---|---|
| False | False | False | False |
| False | True | False | True |
| True | False | False | True |
| True | True | True | True |
and는 두 논리값이 모두 참일 때만 참이다. 따라서 rad > 0 and hei > 0은 반지름과 높이가 모두 양수인지 확인한다. or는 두 논리값 중 하나라도 참이면 참이며, 두 값이 모두 거짓일 때만 거짓이다. not은 True를 False로, False를 True로 반전한다.
2. 논리 연산자를 포함한 우선순위
논리 연산자를 포함하면 우선순위는 괄호, 거듭제곱, 곱셈 계열, 덧셈·뺄셈, 비교 연산자, not, and, or, 할당 연산자 순으로 확장된다. 따라서 not temp >= 27 or season == "summer"에서는 비교가 먼저 수행되고 그 결과에 not이 적용된 뒤 or가 계산된다. 의도를 명확히 보이려면 필요한 곳에 괄호를 쓰는 것이 좋다.
3. 단락 평가
단락 평가(short-circuit evaluation)는 불리언식의 결과가 이미 결정되면 전체 결과를 얻기 전에 나머지 피연산자를 평가하지 않는 기법이다. A and B에서 A가 거짓이면 전체가 반드시 거짓이므로 B를 평가하지 않는다. 반대로 A or B에서 A가 참이면 전체가 반드시 참이므로 B를 평가하지 않는다.
temp >= 27 and season == "summer"
temp >= 27 or season == "summer"
단락 평가는 불필요한 계산을 줄일 뿐 아니라, 앞 조건이 만족될 때만 안전하게 뒤 표현식을 평가하도록 만들 수 있다. 다만 뒤 표현식의 평가가 생략될 수 있다는 사실을 알고 조건의 순서를 설계해야 한다.
제4장 선택 구조의 확장
1. 이분 선택 구조
이분 선택 구조는 조건이 참일 때와 거짓일 때 실행할 명령문 집합을 각각 지정한다. if의 조건이 참이면 첫 번째 블록을 실행하고, 거짓이면 else 블록을 실행한다. 두 블록 중 정확히 하나만 실행된 뒤 공통된 다음 문장으로 흐름이 합쳐진다.
if 불리언식:
명령문 집합1
else:
명령문 집합2
2. 다분 선택 구조
가능한 경우가 셋 이상이면 elif를 사용한 다분 선택 구조가 적합하다. 조건을 위에서부터 차례로 검사하고, 처음으로 참이 된 조건의 블록 하나만 실행한다. 앞선 조건이 참이었다면 뒤의 elif 조건은 검사하지 않는다. 어떤 조건도 참이 아니면 마지막 else 블록이 실행된다.
if 불리언식1:
명령문 집합1
elif 불리언식2:
명령문 집합2
elif 불리언식3:
명령문 집합3
else:
명령문 집합4
조건의 순서가 결과를 바꾼다
다분 선택에서는 범위가 겹치는 조건을 위에서부터 검사하므로 더 구체적이거나 우선해야 하는 조건을 먼저 배치해야 한다. 한 블록이 실행되면 나머지 후보는 건너뛴다.
3. 가장 큰 수를 찾는 문제
세 수 A, B, C 중 가장 큰 수를 찾을 때 A와 B만 비교한 뒤, A가 작다는 이유로 바로 B를 출력하면 C와의 비교가 빠진다. 각 후보가 나머지 값보다 큰지를 논리 연산자로 확인하거나, 필요한 비교를 단계적으로 구성해야 한다. 예를 들어 A > B and A > C, B > A and B > C와 같은 조건을 사용하고 남은 경우에 C를 선택할 수 있다.
4. 중첩 선택 구조
중첩 선택 구조는 if 또는 else 블록 안에 다시 선택 구조를 넣은 형태이다. 먼저 바깥 조건으로 큰 범주를 결정한 다음, 해당 범주 안에서 안쪽 조건을 검사할 때 유용하다. 안쪽 블록은 바깥 블록보다 한 단계 더 들여써야 하며, 각 else가 어느 if에 대응하는지 들여쓰기로 분명하게 나타난다.
if 바깥조건:
if 안쪽조건:
명령문 집합1
else:
명령문 집합2
else:
if 다른조건:
명령문 집합3
중첩 구조는 계층적인 판단을 자연스럽게 표현하지만 깊이가 지나치게 늘어나면 읽기 어려워진다. 서로 배타적인 여러 후보를 같은 수준에서 검사하는 문제라면 if-elif-else가 더 명확할 수 있다.
제5장 입력 오류를 처리하는 원뿔 계산 프로그램
강의록의 최종 원뿔 계산 프로그램은 반지름과 높이를 입력받아 두 값이 모두 0 이상일 때만 모선, 부피와 겉넓이를 계산한다. 하나라도 음수이면 계산식을 실행하지 않고 입력값에 문제가 있음을 안내할 수 있다. 앞서 배운 비교 연산자, and, 이분 선택 구조가 하나의 프로그램 안에서 결합되는 사례이다.
rad = int(input("반지름을 입력하세요: "))
hei = int(input("높이를 입력하세요: "))
if rad >= 0 and hei >= 0:
sla = pow(rad ** 2 + hei ** 2, 0.5)
vol = 1 / 3 * 3.14 * rad ** 2 * hei
suf = 3.14 * rad ** 2 + 3.14 * rad * sla
print("원뿔의 부피는", str(vol) + "입니다.")
print("원뿔의 겉넓이는", str(suf) + "입니다.")
else:
print("반지름과 높이는 음수가 될 수 없습니다.")
이 예제에서 and를 사용하는 이유는 반지름과 높이라는 두 조건이 모두 만족되어야 계산이 의미 있기 때문이다. or를 사용하면 둘 중 하나만 유효해도 계산 블록이 실행되어 음수 입력을 완전히 차단하지 못한다. 선택 구조는 계산 기능과 오류 처리를 분리하여 프로그램의 안정성을 높인다.
핵심 개념 정리
선택 구조: 불리언식의 결과에 따라 특정 명령문 집합의 실행 여부나 실행할 경로를 결정한다.
불리언식: 비교 연산자 등으로 만들어지며 결과는 True 또는 False이다.
논리 연산자: and는 모두 참, or는 하나 이상 참, not은 논리값 반전을 뜻한다.
단락 평가: and와 or의 결과가 이미 결정되면 나머지 피연산자를 평가하지 않는다.
선택의 확장: 단순 선택은 참인 경우만, 이분 선택은 참과 거짓 두 경로를, 다분 선택은 여러 후보 중 하나를 처리한다. 중첩 선택은 선택 구조 안에서 다시 조건을 검사한다.
최종 정리
선택 구조를 정확히 작성하려면 조건이 어떤 불리언 값을 만드는지, 여러 조건이 어떤 논리 연산자로 결합되는지, 조건을 어떤 순서로 검사하는지를 함께 생각해야 한다. 들여쓰기는 단순한 모양이 아니라 각 조건에 속한 실행 블록을 결정하는 파이썬 문법이다.
예상문제 20선
1. 선택 구조의 역할로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
선택 구조는 실행 중 조건을 평가하여 특정 명령문 블록을 실행할지 또는 어느 경로를 실행할지 결정한다.
2. 파이썬에서 권장되는 한 단계 들여쓰기는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
PEP 8은 코드 블록의 한 단계 들여쓰기에 스페이스 4칸을 권장한다.
3. 두 값이 같은지 비교하는 파이썬 연산자는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③==는 동등 비교 연산자이고 =는 값을 저장하는 할당 연산자이다.
4. 불리언 타입이 직접 표현하는 값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
불리언 타입은 참과 거짓을 나타내는 True와 False 두 논리값을 표현한다.
5. 단순 선택 구조에서 조건이 False이면 어떻게 되는가?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
단순 if에서 조건이 거짓이면 해당 코드 블록을 실행하지 않고 다음 문장으로 이동한다.
6. 두 조건이 모두 True일 때만 True인 연산자는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③and는 양쪽 피연산자가 모두 참인 경우에만 참을 반환한다.
7. 두 조건 중 하나 이상이 True이면 True인 연산자는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④or는 두 조건이 모두 거짓일 때만 거짓이며 하나라도 참이면 참이다.
8. not True의 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①not은 논리값을 반전하므로 True를 False로 바꾼다.
9. 논리 연산자의 우선순위가 높은 것부터 바르게 나열된 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
논리 부정 not, 논리곱 and, 논리합 or 순으로 우선순위가 높다.
10. A and B에서 A가 False일 때 단락 평가는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
A가 거짓이면 논리곱 전체가 이미 거짓으로 결정되므로 B를 평가할 필요가 없다.
11. A or B에서 B의 평가가 생략되는 경우는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
A가 참이면 논리합 전체가 이미 참이므로 B의 값과 관계없이 평가가 끝난다.
12. 참과 거짓 두 경로 중 정확히 하나를 실행하는 구조는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①if-else 이분 선택은 조건의 참과 거짓에 대응하는 두 블록 중 하나만 실행한다.
13. 다분 선택 구조에서 여러 조건이 참일 수 있을 때 실행되는 블록은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②if-elif-else는 위에서부터 조건을 검사하고 처음 참이 된 블록 하나만 실행한다.
14. 모든 앞선 if와 elif 조건이 False일 때 실행되는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③else는 앞의 어떤 조건도 만족하지 않은 나머지 경우를 처리한다.
15. 중첩 선택 구조에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
중첩 선택은 바깥 조건의 블록 내부에서 안쪽 조건을 다시 평가하는 계층적 구조이다.
16. 세 수 A, B, C 중 A가 가장 큰지 확인하는 조건은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
A가 가장 크려면 A가 B보다 크고 동시에 C보다도 커야 하므로 두 비교를 and로 결합한다.
17. 반지름과 높이가 모두 0 이상일 때만 계산하려는 조건은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
두 입력 조건이 모두 만족되어야 하므로 논리곱 and를 사용해야 한다.
18. rad >= 0 or hei >= 0을 입력 검사에 사용했을 때의 문제는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③or는 하나의 조건만 참이어도 전체가 참이므로 다른 입력의 음수를 차단하지 못한다.
19. 파이썬에서 코드 블록의 범위를 결정하는 핵심 요소는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
파이썬은 같은 깊이로 들여쓴 명령문들을 하나의 코드 블록으로 해석한다.
20. 선택 구조를 입력 검증에 사용하는 주된 효과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
입력 조건을 먼저 검사하면 유효한 값만 계산하고 잘못된 값에는 별도의 안내를 제공하여 안정성을 높일 수 있다.
댓글
댓글 쓰기