파이썬 if-elif-else 조건문, 대입 연산자 실수까지 직접 겪고 정리

파이썬 조건문에서 ===을 헷갈려 SyntaxError를 만난 적 있다면, 이 글이 그 혼란을 한 번에 풀어줄 거예요.

처음 파이썬을 배울 때 if문은 금방 이해했거든요. 조건이 참이면 실행, 거짓이면 패스. 쉽잖아요. 근데 실제로 코드를 짜기 시작하니까 엉뚱한 데서 에러가 터졌어요. 비교한다고 쓴 게 대입이 되어 있고, 들여쓰기 한 칸 차이로 코드 흐름이 완전히 달라지고. 어이없는 실수인데 에러 메시지만 보면 뭐가 틀렸는지 감이 안 오더라고요.

그래서 제가 직접 삽질한 경험을 바탕으로, if-elif-else 구조의 핵심과 초보자가 반드시 알아야 할 대입 연산자 오류를 하나씩 풀어보려고 해요. 프로그래밍 경력 3년 차인 지금 돌아보면, 이 글을 처음에 읽었으면 며칠은 아꼈을 거예요.

if-elif-else가 뭔지 모르면 파이썬 절반을 모르는 거예요

파이썬의 조건문은 세 가지 키워드로 구성돼요. if, elif, else. if는 “만약 ~라면”이고, elif는 “그게 아니라 ~라면”이고, else는 “위 조건 다 아니면”이에요. 간단하죠? 근데 이게 실전에서 얼마나 다양하게 변형되는지 아는 순간, 쉽다는 생각이 사라져요.

기본 구조를 코드로 보면 이래요. score라는 변수에 점수가 담겨 있다고 하면, if score >= 90: 다음 줄에 “A등급”을 출력하고, elif score >= 80: 다음 줄에 “B등급”, 마지막으로 else: 다음 줄에 “C등급 이하”를 출력하는 거예요. 위에서 아래로 순서대로 조건을 평가하다가 참인 걸 만나면 그 블록만 실행하고 나머지는 전부 건너뛰거든요.

여기서 핵심은 “위에서 아래로 순차 평가”라는 점이에요. if가 이미 참이면 아래의 elif와 else는 아예 평가조차 하지 않아요. 이걸 모르면 나중에 조건 순서 때문에 어마어마한 버그를 만들게 되는데, 이건 뒤에서 자세히 다룰게요.

참고로 파이썬에는 C나 자바의 switch-case 구문이 없어요. Python 3.10에서 match-case가 도입되긴 했지만, 대부분의 상황에서는 elif 체인이 그 역할을 대신하고 있어요. 조건이 5개든 10개든 elif를 쭉 이어 붙이면 되거든요.

= 하나 빠뜨렸을 뿐인데 코드가 통째로 박살 난 날

이건 진짜 제 이야기예요. 파이썬 배운 지 2주쯤 됐을 때, 사용자 입력값이 특정 숫자인지 확인하는 코드를 짰거든요. if number = 5: 이렇게 썼어요. 등호 하나. 당연히 SyntaxError가 떴죠. 근데 에러 메시지가 “invalid syntax”라고만 나오니까 한참을 헤맸어요.

=은 대입 연산자예요. 변수에 값을 집어넣는 역할이에요. 반면 ==은 비교 연산자로, 좌변과 우변이 같은지 따져서 True 또는 False를 돌려줘요. C 언어에서는 if 안에 대입문을 쓸 수 있어서 의도치 않은 버그가 빈번하게 생기거든요. 파이썬은 아예 이걸 문법 차원에서 금지해 버렸어요.

⚠️ 주의

if x = 10: 이렇게 쓰면 파이썬은 무조건 SyntaxError를 던져요. Python 3.9 이후 버전에서는 에러 메시지가 친절해져서 “대입 연산자 = 대신 비교 연산자 ==을 쓰려고 한 거 아니냐”고 물어봐요. 근데 3.8 이전에서는 그냥 “invalid syntax”만 나오거든요. 이 차이를 모르면 에러 원인을 찾는 데 시간이 두 배로 걸려요.

C 계열 언어 출신이라면 이 실수를 더 많이 해요. C에서 if (a = 5)는 a에 5를 대입하고 그 값(5)이 참이니까 조건이 통과돼 버리거든요. 논리적으로 완전히 다른 동작인데 에러 없이 실행되니 버그 찾기가 지옥이에요. 파이썬이 이걸 원천 차단한 건 정말 좋은 설계 판단이었다고 생각해요.

정리하면 이래요. 값을 넣을 때는 =, 같은지 비교할 때는 ==, 다른지 비교할 때는 !=. 이 세 개만 확실히 구분하면 조건문 에러의 절반은 잡히더라고요.

들여쓰기와 콜론, 초보가 가장 많이 빠지는 함정

파이썬은 들여쓰기가 곧 문법이에요. 다른 언어처럼 중괄호 { }로 블록을 감싸는 게 아니라, 들여쓴 정도로 코드 블록을 구분하거든요. 그래서 스페이스 하나, 탭 하나 차이가 코드의 의미를 완전히 바꿔 놓을 수 있어요.

제가 겪은 사례가 하나 있어요. if문 아래 print 두 줄을 같은 블록으로 넣으려고 했는데, 두 번째 줄에 탭을 한 번 더 눌러 버린 거예요. IndentationError: unexpected indent. 이 에러 메시지를 처음 봤을 때 뭔 소린지 몰랐어요. 알고 보니 같은 블록 안의 줄들은 들여쓰기 깊이가 정확히 같아야 하더라고요.

콜론 빠뜨리는 것도 클래식한 실수예요. if score >= 90 여기서 콜론을 안 찍으면 역시 SyntaxError가 나요. elif 뒤에도, else 뒤에도 콜론은 필수거든요. 이건 습관의 문제라서, 조건문 한 줄 쓰고 자동으로 콜론을 찍는 버릇을 들이는 게 제일 좋았어요.

그리고 하나 더. 탭과 스페이스를 섞어 쓰면 TabError가 발생해요. PEP 8 스타일 가이드에서는 스페이스 4칸을 표준으로 권장하고 있어요. VS Code나 PyCharm 같은 에디터에서 탭을 스페이스 4칸으로 자동 변환하도록 설정해두면 이 문제를 원천 차단할 수 있어요.

💡 꿀팁

VS Code를 쓴다면 설정에서 “Editor: Render Whitespace”를 “all”로 바꿔보세요. 스페이스와 탭이 화면에 점으로 표시돼서, 들여쓰기가 어디서 어긋났는지 눈으로 바로 확인할 수 있거든요. 이 설정 하나로 IndentationError와의 싸움이 거의 끝나요.

and·or·not 논리 연산자 우선순위 제대로 이해하기

조건문이 복잡해지면 and, or, not을 섞어 쓰게 되는데, 여기서 우선순위를 모르면 의도와 다른 결과가 나와요. 파이썬 공식 문서 기준으로 논리 연산자 우선순위는 not > and > or 순이에요. 숫자가 높을수록 나중에 평가되는 건데, not이 13순위, and가 14순위, or가 15순위거든요.

예를 들어볼게요. if a > 5 or b > 3 and c < 10: 이 코드를 보면, and가 or보다 먼저 계산돼요. 그래서 실제로는 if a > 5 or (b > 3 and c < 10): 이렇게 동작하는 거예요. "a가 5보다 크거나" 또는 "b가 3보다 크면서 동시에 c가 10보다 작거나"가 되는 거죠. 괄호를 안 쓰면 or의 왼쪽만 따로 평가된다는 걸 모르는 분이 정말 많더라고요.

연산자 우선순위 의미
not 가장 높음 논리 반전 (True ↔ False)
and 중간 둘 다 참이어야 참
or 가장 낮음 하나만 참이어도 참

제 습관은 논리 연산자가 2개 이상 들어가면 무조건 괄호를 쓰는 거예요. if (a > 5) or (b > 3 and c < 10): 이렇게 하면 다른 사람이 봐도 의도가 명확하고, 우선순위 실수를 할 여지가 사라지거든요.

그리고 파이썬의 재밌는 특성이 하나 있어요. 쇼트 서킷(Short-Circuit) 평가라고, and 연산에서 왼쪽이 False면 오른쪽은 아예 평가를 안 해요. or도 마찬가지로 왼쪽이 True면 오른쪽을 건너뛰고요. 이걸 잘 활용하면 None 체크 같은 데서 에러를 방지할 수 있어요. if data is not None and data.value > 0: 이 코드에서 data가 None이면 뒤의 data.value는 실행되지 않으니까 AttributeError가 안 나거든요.

elif 순서를 잘못 놓으면 조건 자체가 무용지물

이건 제가 성적 계산기를 만들다가 직접 겪은 건데요. if score >= 80: 아래에 “B등급”을 넣고, elif score >= 90: 아래에 “A등급”을 넣었어요. 결과가 어떻게 됐을까요? 95점을 입력해도 B등급이 나온 거예요. 왜냐하면 95는 80 이상이니까 첫 번째 if에서 바로 걸려 버린 거죠.

elif 체인에서는 범위가 좁은 조건(더 엄격한 조건)을 위쪽에, 넓은 조건을 아래쪽에 두어야 해요. score >= 95, score >= 90, score >= 80 이 순서가 맞는 거예요. 반대로 하면 넓은 조건이 위에서 다 잡아먹어 버려서, 아래 elif는 영원히 실행되지 않는 “죽은 코드”가 돼요.

💬 직접 써본 경험

이 실수를 하고 나서 한 가지 습관이 생겼어요. elif를 쓸 때마다 “가장 까다로운 조건이 맨 위에 있는가?”를 소리 내서 확인하는 거예요. 바보 같지만 효과가 확실하더라고요. 특히 숫자 범위 비교에서 이 습관이 없으면 서너 달에 한 번은 같은 실수를 반복하게 돼요.

또 하나 흔한 실수가 있어요. 독립 if문 여러 개와 if-elif 체인의 차이를 혼동하는 거예요. if-elif는 하나가 참이면 나머지를 전부 건너뛰지만, if-if-if로 따로 쓰면 각각 독립적으로 모두 평가해요. 조건이 서로 겹칠 때 if-if로 쓰면 여러 블록이 동시에 실행되는 일이 벌어져요.

else를 쓸 때도 주의할 게 있어요. else는 항상 가장 가까운 if(또는 elif 체인의 마지막)와 짝을 이뤄요. 홀로 쓸 수 없고, 들여쓰기 레벨이 대응하는 if와 반드시 동일해야 해요. 이걸 어기면 SyntaxError: invalid syntax가 나오는데, 에러 메시지만 봐서는 원인을 금방 못 찾을 수 있어요.

월러스 연산자 :=는 대입인데 왜 조건문에서 쓸까

앞에서 파이썬은 조건문 안에 대입을 금지한다고 했잖아요. 근데 Python 3.8부터 월러스 연산자(:=)라는 게 추가됐어요. 이름이 웃기죠. := 기호를 옆으로 눕히면 바다코끼리(walrus) 눈과 엄니처럼 보인다고 해서 붙은 이름이에요.

이게 뭐냐면, 값을 변수에 대입하면서 동시에 그 값을 표현식의 결과로 반환하는 연산자예요. 예를 들면 if (n := len(my_list)) > 10: 이렇게 쓰면, my_list의 길이를 n에 저장하면서 동시에 10보다 큰지 비교하는 거예요. 이전에는 n = len(my_list)를 먼저 쓰고, 다음 줄에 if n > 10:을 써야 했거든요. 두 줄이 한 줄로 줄어드는 거죠.

처음엔 “이게 왜 필요하지?”라고 생각했어요. 근데 while 루프에서 입력을 받을 때 진가가 드러나더라고요. while (line := input(“입력: “)) != “quit”: 이렇게 쓰면 입력받기와 종료 조건 확인을 한 줄에서 처리할 수 있거든요. 코드가 확실히 깔끔해져요.

다만 주의할 점이 있어요. := 연산자는 반드시 괄호 안에서 써야 할 때가 많고, 남용하면 오히려 가독성이 떨어져요. PEP 572 문서에서도 “코드가 명확해지는 경우에만 사용하라”고 권고하고 있어요. 개인적으로는 리스트 컴프리헨션이나 while 조건에서만 제한적으로 쓰는 게 좋다고 느꼈어요.

📊 실제 데이터

파이썬 연산자 우선순위 표에서 := 월러스 연산자는 18순위로 가장 낮은 우선순위를 가져요. 비교 연산자(==, !=, >, < 등)는 12순위이고, 논리 연산자 or가 15순위, 조건부 표현식(if else)이 16순위거든요. 즉 := 는 거의 모든 연산이 끝난 뒤에 마지막으로 평가되기 때문에, 복잡한 표현식에서는 괄호로 명시적으로 감싸야 의도대로 동작해요.

실전에서 조건문 버그 줄이는 습관 5가지

지금까지 다룬 내용을 바탕으로, 제가 실제로 쓰고 있는 조건문 관련 습관을 공유할게요. 전부 삽질 끝에 몸에 밴 것들이에요.

첫 번째, 비교 연산을 쓸 때 == 을 치고 나서 등호가 두 개인지 눈으로 확인해요. 사소한데 이것만으로 SyntaxError를 만날 확률이 확 줄어들었어요. 특히 피곤한 밤에 코딩할 때 이 습관이 빛을 발하더라고요.

두 번째, elif 체인을 쓸 때는 항상 좁은 범위부터 써요. 숫자라면 큰 수 기준부터, 문자열이라면 더 구체적인 조건부터 위에 배치하는 거예요. 습관이 되면 순서 실수가 거의 사라져요.

세 번째, 논리 연산자가 두 개 이상이면 무조건 괄호를 써요. 우선순위를 외우고 있어도 괄호 없는 코드는 3개월 뒤에 다시 보면 의도를 헷갈리거든요. 미래의 나를 위한 배려예요.

네 번째, 파이썬의 Truthy/Falsy 값을 활용해요. 빈 리스트, 빈 문자열, 숫자 0, None은 전부 False로 평가되거든요. if len(my_list) > 0: 대신 if my_list: 이렇게 쓰면 더 파이썬다운 코드가 돼요. 근데 정확한 타입 체크가 필요한 상황에서는 오히려 명시적 비교가 안전해요. if value is None: 처럼요.

다섯 번째, 중첩 if가 3단계 이상 들어가면 구조를 의심해 봐요. 대부분 조기 반환(early return)이나 함수 분리로 깊이를 줄일 수 있어요. 중첩이 깊어질수록 버그가 숨을 공간이 넓어지거든요.

자주 묻는 질문

Q. if문에서 = 대신 ==을 써야 하는 이유가 정확히 뭔가요?

= 는 변수에 값을 대입(저장)하는 연산자이고, ==는 두 값이 같은지 비교해서 True/False를 반환하는 연산자예요. 파이썬은 조건문 안에서 = 사용을 문법적으로 금지하고 있어서, 실수로 쓰면 SyntaxError가 발생해요. C 언어에서 이 혼동이 수많은 버그를 만들었기 때문에 파이썬이 원천 차단한 거예요.

Q. elif 없이 if-if-if로만 써도 되나요?

동작은 하지만 의미가 달라요. if-elif 체인은 하나가 참이면 나머지를 전부 건너뛰지만, if-if-if는 각각 독립적으로 전부 평가해요. 조건이 서로 겹치는 상황에서는 여러 블록이 동시에 실행될 수 있으니, 상호 배타적인 조건이라면 반드시 elif를 쓰는 게 맞아요.

Q. 월러스 연산자(:=)와 일반 대입(=)의 차이가 뭔가요?

일반 대입 =은 문(statement)이라서 표현식 안에서 쓸 수 없어요. 반면 :=은 표현식(expression) 안에서 값을 대입하면서 동시에 그 값을 반환해요. if나 while 조건 안에서 변수 할당과 비교를 한 번에 처리할 때 유용하고, Python 3.8 이상에서만 사용 가능해요.

Q. 파이썬에서 탭과 스페이스를 섞어 쓰면 왜 안 되나요?

Python 3에서는 탭과 스페이스 혼용 시 TabError가 발생해요. 화면에서는 같은 폭처럼 보여도 내부적으로는 다른 문자이기 때문에 들여쓰기 레벨이 달라지거든요. PEP 8 기준으로 스페이스 4칸이 표준이니, 에디터 설정에서 탭을 스페이스 4칸으로 자동 변환하는 게 가장 안전해요.

Q. if 조건에 True, False 대신 1, 0을 넣어도 동작하나요?

네, 동작해요. 파이썬에서 0은 False, 0이 아닌 모든 숫자는 True로 평가돼요. 빈 문자열 “”, 빈 리스트 [], None도 False 취급이에요. 이걸 Truthy/Falsy라고 부르는데, 파이썬다운 코드를 쓸 때 자주 활용되는 개념이에요.

본 포스팅은 개인 경험과 공개 자료를 바탕으로 작성되었으며, 전문적인 의료·법률·재무 조언을 대체하지 않습니다. 정확한 정보는 해당 분야 전문가 또는 공식 기관에 확인하시기 바랍니다.

파이썬 조건문의 핵심은 결국 두 가지예요. if-elif-else의 순차 평가 구조를 정확히 이해하는 것, 그리고 =과 ==을 절대 헷갈리지 않는 것. 이 두 가지만 확실하면 조건문 관련 버그의 80%는 예방할 수 있어요.

파이썬 입문자라면 오늘 다룬 들여쓰기 규칙, 논리 연산자 우선순위, elif 순서까지 꼭 챙겨두세요. 코딩 테스트에서도, 실무 프로젝트에서도 조건문은 매일 쓰게 되거든요.


혹시 조건문 쓰다가 겪은 황당한 에러 경험이 있으신가요? 댓글로 공유해 주시면 다른 분들께도 큰 도움이 될 거예요. 이 글이 유용했다면 주변 파이썬 입문자에게도 공유해 주세요!

댓글 남기기