변수, 자료형, 연산: 값을 다루는 기본기
변수가 무엇인지, 정수·실수·문자열·불리언 같은 자료형이 왜 나뉘는지, 연산자와 형 변환, 그리고 0.1 + 0.2가 0.3이 아닌 이유까지 값을 다루는 기본기를 익혀요.
프로그램이 하는 일은 결국 값을 받아서, 바꾸고, 내보내는 것이에요. 이번 강의에서는 그 값을 담는 그릇인 변수와, 값의 종류인 자료형을 배워요. 이 기본기가 단단해야 뒤에 나오는 조건문, 반복문, 함수가 쉽게 붙어요.
변수는 이름표다
변수를 흔히 "값을 담는 상자"라고 설명하지만, 파이썬에서는 값에 붙이는 이름표라고 생각하는 편이 더 정확해요.
age = 30
name = "민지"
age = 30은 "30이라는 값에 age라는 이름표를 붙인다"는 뜻이에요. 여기서 =는 수학의 "같다"가 아니라 대입(오른쪽 값을 왼쪽 이름에 연결)이에요. 그래서 이런 코드도 성립해요.
count = 1
count = count + 1
print(count) # 2
수학이라면 말이 안 되는 식이지만, 프로그래밍에서는 "지금 count 값에 1을 더한 값을 다시 count라고 부른다"는 뜻이에요.
이름 짓는 규칙
- 영문자, 숫자, 밑줄(
_)을 쓸 수 있어요. 숫자로 시작할 수는 없어요. - 대소문자를 구분해요.
Score와score는 다른 변수예요. if,for,class같은 예약어는 이름으로 못 써요.- 관례상 소문자와 밑줄을 써요.
user_name,total_price처럼요.
팁 이름은 길어도 괜찮으니 뜻이 드러나게 지으세요.
x보다price,p2보다discounted_price가 낫습니다. 코드는 쓰는 시간보다 읽는 시간이 훨씬 길어요.
자료형: 값의 종류
값에는 종류가 있어요. 종류에 따라 할 수 있는 일이 달라요. type()으로 종류를 확인할 수 있어요.
print(type(42)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type("안녕")) # <class 'str'>
print(type(True)) # <class 'bool'>
print(type(None)) # <class 'NoneType'>
| 자료형 | 이름 | 예 | 용도 |
|---|---|---|---|
int | 정수 | 42, -7, 0 | 개수, 나이, 순번 |
float | 실수 | 3.14, 0.5, 1e6 | 길이, 무게, 비율 |
str | 문자열 | "안녕", 'abc' | 이름, 문장, 주소 |
bool | 불리언 | True, False | 참과 거짓, 조건 |
NoneType | 없음 | None | 값이 아직 없음 |
왜 종류를 나눌까
컴퓨터 메모리 안에서 숫자 42와 글자 "42"는 완전히 다르게 저장돼요. 숫자는 계산을 위해, 글자는 표시를 위해 저장 방식이 달라요. 그래서 이런 일이 생겨요.
print(42 + 8) # 50
print("42" + "8") # 428
print("42" + 8) # TypeError!
숫자끼리 더하면 덧셈, 문자열끼리 더하면 이어 붙이기예요. 숫자와 문자열을 섞으면 파이썬은 무엇을 원하는지 알 수 없어서 오류를 내요. 이 오류는 파이썬이 실수를 막아 주는 장치예요.
숫자 연산
a = 17
b = 5
print(a + b) # 22 더하기
print(a - b) # 12 빼기
print(a * b) # 85 곱하기
print(a / b) # 3.4 나누기 (결과는 항상 실수)
print(a // b) # 3 몫 (소수점 버림)
print(a % b) # 2 나머지
print(a ** b) # 1419857 거듭제곱
몫(//)과 나머지(%)는 생각보다 자주 써요.
- 짝수 판별:
n % 2 == 0 - 초를 분과 초로 나누기:
minutes = seconds // 60,rest = seconds % 60 - 10개씩 묶음 만들기: 몇 묶음(
// 10), 남는 개수(% 10)
연산 순서는 수학과 같아요. 거듭제곱, 곱셈과 나눗셈, 덧셈과 뺄셈 순이고, 헷갈리면 괄호를 쓰세요.
0.1 + 0.2는 왜 0.3이 아닐까
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False
버그가 아니에요. 컴퓨터는 실수를 2진수로 저장하는데, 0.1은 2진수로 정확히 표현되지 않아요(10진수에서 1/3이 0.333...으로 끝나지 않는 것과 같아요). 아주 작은 오차가 생겨요.
그래서 실수를 비교할 때는 같은지 대신 "충분히 가까운지"를 확인해요.
import math
print(math.isclose(0.1 + 0.2, 0.3)) # True
돈 계산처럼 오차가 있으면 안 되는 곳에서는 원 단위 정수로 계산하거나 decimal 모듈을 써요. 실제 서비스에서 금액을 실수로 계산하다 1원씩 어긋나는 사고가 꽤 흔해요.
문자열 다루기
문자열은 따옴표로 감싼 글자 묶음이에요. 작은따옴표와 큰따옴표 모두 돼요.
f-string: 값 끼워 넣기
name = "민지"
age = 30
print(f"{name}님은 {age}살입니다.")
print(f"내년에는 {age + 1}살이 됩니다.")
따옴표 앞에 f를 붙이면 중괄호 안에 변수나 계산식을 넣을 수 있어요. 앞 강의처럼 +로 이어 붙이는 것보다 훨씬 읽기 쉬워요.
숫자 모양도 정할 수 있어요.
price = 1234567.891
print(f"{price:,.0f}원") # 1,234,568원 (쉼표, 소수점 없음)
print(f"{0.4567:.1%}") # 45.7%
인덱싱과 슬라이싱
문자열의 글자에는 0부터 시작하는 번호가 붙어요.
word = "PYTHON"
print(word[0]) # P 첫 글자
print(word[-1]) # N 마지막 글자
print(word[0:3]) # PYT 0번부터 3번 앞까지
print(word[2:]) # THON
print(len(word)) # 6 길이
번호가 0부터 시작하고, [시작:끝]에서 끝 번호는 포함하지 않는다는 점이 처음엔 헷갈려요. "끝 번호 앞에서 멈춘다"고 기억하세요.
자주 쓰는 메서드
s = " Hello, World "
print(s.strip()) # 'Hello, World' 양쪽 공백 제거
print(s.lower()) # 소문자로
print(s.replace("World", "Python"))
print("a,b,c".split(",")) # ['a', 'b', 'c'] 나누기
print("-".join(["2026", "11", "16"])) # 2026-11-16 합치기
print("python" in "I love python") # True 포함 여부
문자열은 바꿀 수 없는 값이에요. s.upper()는 s를 바꾸는 게 아니라 대문자로 된 새 문자열을 돌려줘요. 결과를 쓰려면 변수에 다시 담아야 해요.
불리언과 비교
비교 연산의 결과는 True 아니면 False예요.
print(10 > 3) # True
print(10 == 10) # True 같다 (=는 대입, ==는 비교)
print(10 != 3) # True 다르다
print("a" < "b") # True 문자열은 사전 순으로 비교
여러 조건은 and, or, not으로 묶어요.
age = 25
has_ticket = True
print(age >= 19 and has_ticket) # 둘 다 참이어야 True
print(age < 13 or age > 65) # 하나만 참이어도 True
print(not has_ticket) # 반대로 뒤집기
형 변환
input()으로 받은 값은 항상 문자열이에요. 숫자로 계산하려면 바꿔야 해요.
text = input("숫자를 입력하세요: ") # "25"
num = int(text) # 25
print(num * 2) # 50
| 함수 | 바꾸는 방향 | 예 |
|---|---|---|
int() | 정수로 | int("42") → 42, int(3.9) → 3 (버림) |
float() | 실수로 | float("3.14") → 3.14 |
str() | 문자열로 | str(42) → "42" |
bool() | 참거짓으로 | bool(0) → False, bool("a") → True |
숫자가 아닌 글자를 int()에 넣으면 ValueError가 나요. 사용자 입력을 받을 때 이 오류를 어떻게 처리하는지는 예외 처리 강의에서 다뤄요.
실습: 단위 변환기
아래 프로그램을 완성해 보세요.
- 키를 센티미터로 입력받는다.
- 미터와 피트로 바꿔 출력한다. (1피트 = 30.48cm)
- 소수점 둘째 자리까지만 보여 준다.
cm = float(input("키(cm): "))
meter = cm / 100
feet = cm / 30.48
print(f"{cm}cm는 {meter:.2f}m, {feet:.2f}피트입니다.")
도전 과제
- 초를 입력받아 "1시간 23분 45초" 형식으로 바꾸는 프로그램을 만들어 보세요. 힌트:
//와%를 써요. - 상품 가격과 할인율(%)을 입력받아 할인된 가격을 원 단위 정수로 출력해 보세요.
자주 하는 실수
- input 결과로 바로 계산하기.
input()은 문자열을 돌려줘요."3" * 2는 6이 아니라"33"이에요. - = 와 == 혼동. 조건을 쓸 때
if x = 3처럼 쓰면 문법 오류가 나요. 비교는==예요. - 실수 그대로 비교하기.
0.1 + 0.2 == 0.3은 False예요.math.isclose()를 쓰세요. - 문자열 메서드 결과 버리기.
name.strip()만 쓰고 결과를 담지 않으면 name은 그대로예요.
점검 문제
x = 5,x = x * 2다음x의 값은?7 // 2와7 / 2의 결과는 각각 무엇이고 왜 다른가요?"10" + "20"의 결과는?int("3.5")는 동작할까요?word = "computer"일 때word[3:6]은?
정답
- 오른쪽 계산(5 × 2)이 먼저 되고 그 결과에 x라는 이름이 다시 붙어요.
7 // 2는 3(몫),7 / 2는 3.5(실수 나눗셈)예요.//는 소수점 아래를 버려요."1020". 문자열끼리 더하면 이어 붙여요.- 동작하지 않아요(
ValueError). 소수점이 있는 문자열은int(float("3.5"))처럼 실수를 거쳐야 해요. "put". 3번(p), 4번(u), 5번(t)까지이고 6번은 포함하지 않아요.
다음 강의
다음 강의에서는 조건문과 반복문을 배워요. 지금까지의 프로그램은 위에서 아래로 한 번 흐르고 끝났지만, 조건과 반복을 쓰면 상황에 따라 다르게 움직이고 같은 일을 수천 번 반복하는 프로그램을 만들 수 있어요.