if문에서 or를 중첩할 때 가장 흔히 저지르는 실수는 month == 1 or 3 or 5처럼 조건을 나열하는 것입니다. 이렇게 쓰면 month == 1만 검사하고, 나머지 숫자는 논리 연산에서 항상 참으로 평가됩니다. 올바른 사용법은 month == 1 or month == 3 or month == 5처럼 각 조건을 명확히 비교하는 것입니다. 또한 중첩 if 문이 너무 깊어지면 가독성이 급격히 떨어지고, 복잡한 조건을 and와 or로 단순화할 기회를 놓치기 쉽습니다.
개발자라면 반드시 알아야 할 or 중첩의 오해
프로그래밍에서 if 문은 가장 기본적인 흐름 제어 도구입니다. 하지만 or 연산자를 중첩할 때 많은 개발자가 의도와 다른 결과를 경험합니다. 참고 자료에서 지적한 대로, if month == 1 or 3 or 5 or 7 같은 코드는 month 값이 1일 때만 참으로 평가되고 나머지 조건은 무시됩니다. 이는 or가 비교 연산자가 아니라 논리 연산자이기 때문입니다. 3, 5, 7은 그 자체로 불리언 값으로 평가되며, 파이썬에서 0이 아닌 숫자는 모두 True로 간주됩니다. 따라서 이 조건은 “month가 1이거나, 3이 참이거나, 5가 참이거나…”로 해석되어 항상 참이 됩니다.
이를 방지하려면 각 조건을 분리해서 month == 1 or month == 3 or month == 5처럼 작성해야 합니다. 또는 month in (1, 3, 5, 7) 같은 in 연산자를 사용하는 것도 좋은 방법입니다.
중첩 if 문이 깊어질 때 발생하는 문제
조건이 여러 개일 때 중첩 if 문을 사용하는 경우가 많습니다. 예를 들어 세 과목 중 두 과목 이상 60점 이상일 때 합격을 판정하는 로직을 중첩으로 작성하면 아래와 같습니다.
if math_score > 60:
if english_score > 60:
print("합격")
else:
if science_score > 60:
print("합격")
else:
print("탈락")
else:
if english_score > 60:
if science_score > 60:
print("합격")
else:
print("탈락")
else:
print("탈락")
이 코드는 논리적으로 틀리지 않았지만, 조건이 늘어날수록 읽기 어렵고 수정하기 까다로워집니다. 참고 자료에서도 지적했듯이, 이런 경우 and와 or를 조합하면 훨씬 간결해집니다.
if (math_score >= 60 and english_score >= 60) or (science_score >= 60):
print("합격")
else:
print("탈락")
이렇게 바꾸면 조건의 의도가 명확해지고, 나중에 조건을 추가하거나 변경할 때도 실수할 가능성이 줄어듭니다.
or와 and를 함께 쓸 때 주의할 점
or와 and를 혼합할 때는 연산자 우선순위를 반드시 고려해야 합니다. 대부분의 언어에서 and가 or보다 우선순위가 높습니다. 예를 들어 if a or b and c는 if a or (b and c)로 해석됩니다. 만약 (a or b) and c를 의도했다면 괄호를 명시적으로 써야 합니다.
참고 자료에 나온 학생 성적 예시처럼 조건이 복잡해지면 괄호를 활용하는 것이 안전합니다. 괄호는 코드의 가독성을 높이고, 다른 개발자(또는 미래의 자신)가 의도를 오해할 가능성을 줄여줍니다.
FAQ
Q. if month == 1 or 3 or 5가 왜 잘못된 건가요?
or는 양쪽을 불리언 값으로 평가합니다. 3은 0이 아니므로 항상 True입니다. 따라서 이 조건은 month가 1인지와 상관없이 항상 참이 됩니다. 올바르게 쓰려면 if month == 1 or month == 3 or month == 5 또는 if month in (1, 3, 5)로 작성해야 합니다.
Q. 중첩 if 문을 아예 쓰지 말아야 하나요?
꼭 필요한 경우에는 사용해도 됩니다. 하지만 3단계 이상 깊어지면 가독성이 크게 떨어집니다. and와 or로 대체할 수 있는지, 또는 조건을 함수로 분리할 수 있는지 먼저 고민해보는 것이 좋습니다.
Q. or와 and의 우선순위를 외우기 어려운데 꼭 알아야 하나요?
꼭 외울 필요는 없습니다. 헷갈릴 때는 괄호를 사용하면 됩니다. 예를 들어 (a or b) and c처럼 괄호를 명시하면 우선순위와 상관없이 의도대로 동작합니다.