파이썬에서 값을 자유자재로 다루기 위해 반드시 알아야 할 7가지 핵심 연산자의 종류와 동작 원리를 완벽하게 정리해 드려요. 헷갈리기 쉬운 나눗셈의 차이점부터 실수 비교 시 발생하는 미세한 오차 문제, 그리고 초보자가 흔히 겪는 에러 대처법까지 실무적인 팁을 듬뿍 담았어요. 변수의 실제 메모리 주소를 확인하는 방법을 통해 파이썬이 데이터를 내부적으로 어떻게 식별하는지 아주 직관적이고 쉽게 이해하실 수 있을 거예요.
목차
- 1. 산술 연산자 — 사칙연산과 나눗셈의 비밀
- 2. 비교 연산자 — 값의 크기와 다름 비교하기
- 3. 논리 및 할당 연산자 — 조건 결합과 코드 단축
- 4. 멤버십과 식별 연산자 — 포함 여부와 메모리 주소 확인
- 5. 연산자 우선순위와 초보자 단골 실수 모음
1. 산술 연산자 — 사칙연산과 나눗셈의 비밀
파이썬으로 처음 코딩을 시작해보셨나요? 그렇다면 변수에 값을 담은 뒤에 가장 먼저 해보는 게 바로 수학 계산일 거예요. 파이썬에서는 기본적으로 우리가 학교에서 배웠던 사칙연산 기호들을 그대로 사용할 수 있어요. 더하기는 +, 빼기는 -, 곱하기는 *를 쓰죠. 여기까지는 정말 익숙하실 텐데, 파이썬에는 나누기와 관련된 연산자가 무려 세 개나 있다는 사실 알고 계셨나요? 바로 /, //, %예요.
먼저 /는 우리가 아는 가장 일반적인 나누기 연산자예요. 이 연산자의 특징은 계산 결과가 딱 떨어지더라도 항상 소수점이 있는 실수(float) 형태로 결과를 돌려준다는 거예요. 반면에 //는 나눗셈을 한 뒤에 소수점 이하는 전부 버리고 딱 떨어지는 정수(int) 몫만 깔끔하게 구해주는 연산자예요. 그리고 마지막으로 % 연산자가 있는데요, 이건 나눈 뒤에 남는 나머지만을 구해줘요. 어떤 숫자가 홀수인지 짝수인지 판별하거나, 특정 배수를 찾을 때 실무에서 정말 유용하게 쓰이는 친구랍니다.
이런 기본적인 파이썬 사칙연산을 할 때 초보자분들이 가장 조심해야 할 부분이 하나 있어요. 바로 0으로 나누려고 시도하는 상황이에요. 우리가 수학 시간에 0으로 숫자를 나눌 수 없다고 배웠던 것 기억하시죠? 파이썬에서도 마찬가지로 0으로 나누기를 시도하면, 프로그램이 그 즉시 계산을 포기하고 뻗어버리면서 에러 화면을 뱉어내요.
일반적인 나눗셈, 몫 구하기, 그리고 0으로 나누었을 때 발생하는 에러를 아래 코드로 직접 확인해 볼게요. 눈으로 보는 것보다 코드를 쳐보는 게 훨씬 이해가 빠르니까요!
코드를 작성하실 때는 나누는 값이 변수로 들어올 때, 그 값이 0이 될 가능성이 단 1퍼센트라도 있는지 항상 염두에 두셔야 해요. 이렇게 방어적으로 코드를 짜는 습관을 들여야 실제 서비스에서 프로그램이 비정상 종료되는 대형 사고를 막을 수 있어요.
⚠️ Warning
사용자의 입력을 받아 나눗셈을 할 때는 무조건 ZeroDivisionError가 발생할 수 있다고 가정해야 해요. 조건문이나 try-except 블록을 활용해 0이 입력되었을 때의 대처 방안을 미리 짜두는 것이 필수랍니다.
2. 비교 연산자 — 값의 크기와 다름 비교하기
어떤 값이 더 큰지, 혹은 두 값이 완벽하게 똑같은지 확인하고 싶을 때 우리는 비교 연산자를 사용해요. 파이썬에서 제공하는 비교 연산자(==, !=, >, <, >=, <=)를 사용해서 수식을 만들면, 그 결과는 무조건 참(True) 아니면 거짓(False)이라는 불리언(bool) 값으로 딱 떨어지게 나와요.
여기서 프로그래밍을 처음 하시는 분들이 가장 많이, 그리고 지긋지긋하게 하는 실수가 하나 있어요. 이거 한 번쯤 경험해보셨을 거예요. 바로 변수에 값을 집어넣을 때 쓰는 = 기호 하나와, 두 값이 똑같은지 물어볼 때 쓰는 == 기호 두 개를 헷갈리는 거예요. 조건문에서 값이 같은지 확인할 때는 무조건 ==를 써야 한다는 점, 꼭 기억해 주세요!
또 하나 정말 중요하게 짚고 넘어가야 할 점이 있어요. 파이썬 비교연산자를 써서 소수점이 있는 실수를 비교하다 보면, 우리가 흔히 아는 수학적 상식과 다르게 동작해서 당황스러울 때가 있어요. 컴퓨터는 내부적으로 실수를 0과 1로 이루어진 2진수로 바꿔서 저장하는데요, 이 변환 과정에서 아주 미세한 부동소수점 오차가 발생하기 때문이에요. 그래서 파이썬에게 0.1 + 0.2가 0.3과 똑같냐고 물어보면, 컴퓨터는 미세한 오차 때문에 둘이 다르다고 거짓(False) 판정을 내려버려요.
이런 실수의 미세한 오차 문제를 어떻게 해결하고 안전하게 값을 비교할 수 있는지, 코드로 자세히 알아볼게요.
실수 값을 다루는 금융 프로그램이나 정밀한 계산기에서는 단순하게 ==를 써서 값을 비교하면 절대 안 돼요. 그럴 때는 반드시 math.isclose() 함수를 사용해서 두 값이 거의 일치하는지 확인하는 방식으로 안전하게 코딩해야 해요.
📌 Note
문자열을 비교할 때도 == 연산자를 그대로 사용할 수 있어요. 대소문자를 엄격하게 구분하니까 “Python”과 “python”은 서로 다른 값으로 인식한다는 점 참고해 주세요.
3. 논리 및 할당 연산자 — 조건 결합과 코드 단축
조건이 여러 개일 때는 어떻게 처리해야 할까요? 예를 들어서 영화관에 입장하려면 나이도 18세 이상이어야 하고, 동시에 티켓도 가지고 있어야만 들어갈 수 있겠죠. 이렇게 여러 가지 조건을 하나로 묶어줄 때 사용하는 것이 바로 논리 연산자인 and, or, not이에요.
and: 양쪽 조건이 모두 참일 때만 최종적으로True를 반환해요. 하나라도 거짓이면 얄짤없이False가 돼요.or: 양쪽 중에 단 하나라도 참이면 바로True로 통과시켜주는 관대한 연산자예요.not: 참과 거짓을 반대로 휙 뒤집어버려요.True는False로,False는True로 바꿔주죠.
그리고 코딩을 하다 보면, 변수 자기 자신에게 어떤 값을 더하거나 곱한 뒤에 다시 그 변수에 덮어쓰기 하는 일이 정말정말 많아요. 예를 들어 점수를 올릴 때 score = score + 10처럼 쓰는 경우죠. 이걸 더 짧고 간결하게 줄여주는 게 바로 복합 할당 연산자(+=, -=, *= 등)예요.
논리 연산자를 사용해서 여러 조건을 매끄럽게 결합하고, 할당 연산자로 변수의 값을 깔끔하게 업데이트하는 과정을 코드로 확인해 볼까요?
논리 연산자는 항상 왼쪽에서부터 오른쪽으로 읽어가며 조건을 판단해요. 그리고 복합 할당 연산자는 타자 치는 수고를 덜어줄 뿐만 아니라, 코드를 한눈에 읽기 쉽게 만들어주기 때문에 실무에서 무조건 쓰는 문법이에요.
💡 Tip
파이썬의 논리 연산자는 ‘단축 평가(Short-circuit)’라는 똑똑한 기능을 지원해요. 예를 들어 and 연산자를 쓸 때 왼쪽 조건이 이미 False라면, 오른쪽 조건은 아예 쳐다보지도 않고 계산을 끝내버린답니다. 이 속성을 이용하면 코드의 실행 속도를 미세하게나마 올릴 수 있어요.
4. 멤버십과 식별 연산자 — 포함 여부와 메모리 주소 확인
내가 가지고 있는 데이터 모음 안에 특정 값이 들어있는지 콕 집어서 확인하고 싶을 때가 있죠? 그럴 때는 멤버십 연산자인 in과 not in을 쓰면 아주 간단하게 해결돼요. 아주 긴 문장 안에 내가 찾는 특정 단어가 포함되어 있는지, 혹은 장바구니 리스트 안에 사과가 담겨 있는지 검사할 때 영어 문장을 읽듯이 직관적으로 사용할 수 있어요.
그런데 파이썬 기초를 배우면서 초보자들이 가장 머리 아파하고 헷갈려 하는 것이 바로 식별 연산자인 is예요. 앞서 우리가 살펴봤던 == 연산자는 겉으로 보이는 데이터의 ‘값’ 자체가 똑같은지만 비교해요. 하지만 is는 두 변수가 가리키고 있는 컴퓨터 메모리상의 주소가 완전히 똑같은지, 즉 아예 ‘동일한 하나의 객체’인지 아주 엄격하게 확인한답니다.
이런 파이썬 연산자의 깊숙한 내부 동작을 제대로 이해하려면, id()라는 내장 함수를 써서 변수가 차지하고 있는 실제 메모리 주소를 눈으로 직접 확인해 보는 게 가장 확실해요. 실무에서 파이썬의 is 연산자는 주로 어떤 변수의 값이 텅 비어있는지 확인할 때 is None이라는 형태로 가장 많이 쓰여요.
멤버십 연산자를 어떻게 활용하는지, 그리고 도대체 ==와 is가 어떻게 다른지 메모리 주소를 통해 명확하게 증명해 드릴게요!
단순히 리스트 안에 든 숫자가 똑같은지 물어볼 때는 ==가 참이라고 대답하지만, 두 리스트가 완전히 같은 본체냐고 물어보는 is에는 거짓이라고 대답하죠. 완전히 다른 메모리 공간에 만들어졌기 때문이에요.
❗ 중요
값만 같다면 ==를 쓰고, 객체 자체가 완벽히 동일한지 확인할 때만 is를 써야 해요. 특히 변수 값이 비어있는지 물어보는 if value is None: 구문은 파이썬의 핵심 국룰 같은 문법이니 반드시 입에 붙도록 연습해 두세요.
5. 연산자 우선순위와 초보자 단골 실수 모음
우리가 수학 시간에 더하기보다 곱하기를 먼저 계산해야 한다고 배웠듯이, 파이썬에 있는 수많은 연산자들 사이에도 엄격한 우선순위라는 게 존재해요. 괄호 ()가 1순위로 가장 먼저 계산되고, 거듭제곱 **이 2순위, 그 다음으로 곱셈과 나눗셈, 그리고 마지막으로 덧셈과 뺄셈 순서로 진행돼요. 값의 크기를 비교하는 연산이나 논리 연산은 이런 산술 연산보다 나중에 실행된답니다.
하지만 이 복잡한 연산자 우선순위 표를 달달 외울 필요는 전혀 없어요. 계산 순서가 아주 조금이라도 헷갈린다 싶으면, 고민하지 말고 무조건 괄호 ()를 쳐주시면 돼요. 괄호를 쓰면 내가 원하는 순서대로 계산을 강력하게 강제할 수 있고, 나중에 내 코드를 읽는 다른 사람도 의도를 한눈에 파악하기 쉬워지거든요.
또한, 조건문을 작성할 때 and나 or 대신에 비트 연산자인 &나 |를 잘못 쓰는 경우도 흔하게 발생해요. 조건의 참과 거짓을 판별할 때는 반드시 영어 단어 그대로 and와 or를 써야 의도한 대로 정확하게 동작해요. not의 위치도 헷갈리기 쉬운데, 이때도 괄호와 함께 묶어 쓰면 코드가 훨씬 명확해진답니다.
우선순위에 따라서 계산 결과가 어떻게 확연히 달라지는지, 그리고 초보자들이 흔히 저지르는 문법 실수를 어떻게 올바르게 고치는지 코드로 꼼꼼하게 확인해 볼게요.
연산자 우선순위 표를 찾아보고 고민할 시간에 괄호를 한 번 더 감싸주는 것이 시간도 아끼고 오류도 막는 가장 실용적이고 안전한 코딩 습관이라는 점, 절대 잊지 마세요!
자주 묻는 질문
Q. 나눗셈을 할 때 ZeroDivisionError가 발생하면 어떻게 대처해야 하나요?
A. 나누는 값이 고정된 숫자가 아니라 변수라면, 그 값이 0이 될 가능성이 항상 존재한다고 보셔야 해요. 이럴 때는 나누기 연산을 실행하기 전에 if문으로 나누는 수가 0인지 미리 검사하거나, try-except 예외 처리 구문으로 감싸주세요. 이렇게 방어벽을 세워두면 프로그램이 강제로 뻗어버리는 비정상 종료를 막고, 사용자에게 “0으로 나눌 수 없습니다” 같은 친절한 안내 문구를 띄워줄 수 있어요.
Q. 파이썬에서 0.1 + 0.2 == 0.3 이 왜 False가 되나요?
A. 컴퓨터가 우리가 일상에서 쓰는 10진수 실수를 처리하기 위해, 내부적으로는 0과 1로 이루어진 2진수로 변환하는 과정을 거치기 때문이에요. 이 변환 과정에서 무한 소수가 발생하면서 아주 미세한 끝자리 오차가 생기게 돼요. 그래서 사람 눈으로 볼 때는 완벽히 같아 보여도 컴퓨터 입장에서는 미세하게 다른 숫자라고 판단하는 거죠. 실수를 비교할 때는 언제나 math.isclose() 함수를 사용해 안전하고 정밀하게 비교하는 것이 정석이랍니다.
Q. is 연산자와 == 연산자는 언제 어떻게 구분해서 써야 하나요?
A. ==는 겉으로 보이는 데이터의 ‘값’ 자체가 똑같은지 비교할 때 써요. 예를 들어 두 리스트 안에 들어있는 숫자들이 똑같은지 확인할 때가 대표적이죠. 반면 is는 id() 함수로 확인했을 때 컴퓨터 메모리상의 주소까지 ‘완전히 똑같은 하나의 객체’인지 엄격하게 확인할 때 써요. 일반적인 변수 값을 비교할 때는 항상 ==를 쓰고, is는 변수에 값이 비어있는지 확인하는 if result is None: 같은 특별한 상황에서만 쓴다고 기억해 두시면 코딩하기 훨씬 편하실 거예요.