변수, 자료형, 연산: 값을 다루는 기본기

변수가 무엇인지, 정수·실수·문자열·불리언 같은 자료형이 왜 나뉘는지, 연산자와 형 변환, 그리고 0.1 + 0.2가 0.3이 아닌 이유까지 값을 다루는 기본기를 익혀요.

입문강의 2 / 6약 8분

프로그램이 하는 일은 결국 값을 받아서, 바꾸고, 내보내는 것이에요. 이번 강의에서는 그 값을 담는 그릇인 변수와, 값의 종류인 자료형을 배워요. 이 기본기가 단단해야 뒤에 나오는 조건문, 반복문, 함수가 쉽게 붙어요.

변수는 이름표다

변수를 흔히 "값을 담는 상자"라고 설명하지만, 파이썬에서는 값에 붙이는 이름표라고 생각하는 편이 더 정확해요.

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. 키를 센티미터로 입력받는다.
  2. 미터와 피트로 바꿔 출력한다. (1피트 = 30.48cm)
  3. 소수점 둘째 자리까지만 보여 준다.
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은 그대로예요.

점검 문제

  1. x = 5, x = x * 2 다음 x의 값은?
  2. 7 // 2와 7 / 2의 결과는 각각 무엇이고 왜 다른가요?
  3. "10" + "20"의 결과는?
  4. int("3.5")는 동작할까요?
  5. word = "computer"일 때 word[3:6]은?

정답

    1. 오른쪽 계산(5 × 2)이 먼저 되고 그 결과에 x라는 이름이 다시 붙어요.
  1. 7 // 2는 3(몫), 7 / 2는 3.5(실수 나눗셈)예요. //는 소수점 아래를 버려요.
  2. "1020". 문자열끼리 더하면 이어 붙여요.
  3. 동작하지 않아요(ValueError). 소수점이 있는 문자열은 int(float("3.5"))처럼 실수를 거쳐야 해요.
  4. "put". 3번(p), 4번(u), 5번(t)까지이고 6번은 포함하지 않아요.

다음 강의

다음 강의에서는 조건문과 반복문을 배워요. 지금까지의 프로그램은 위에서 아래로 한 번 흐르고 끝났지만, 조건과 반복을 쓰면 상황에 따라 다르게 움직이고 같은 일을 수천 번 반복하는 프로그램을 만들 수 있어요.