파이썬 강의 2편: 변수와 데이터 타입
파이썬 강의 2편: 변수와 데이터 타입
변수가 뭔지
“변수는 값을 저장하는 상자”라는 설명을 처음 들었을 때 솔직히 잘 안 와닿았습니다. 코드를 직접 쳐보고 나서야 아, 이름을 붙여서 값을 꺼내 쓸 수 있게 하는 거구나 하고 이해했습니다.
age = 25 # "age"라는 이름으로 25를 저장
name = "홍길동" # "name"이라는 이름으로 "홍길동"을 저장
이게 전부입니다. 파이썬에서 변수 선언은 이름 쓰고 = 쓰고 값 넣으면 끝입니다.
C언어랑 비교하면 바로 느껴지는 차이
처음에 C언어 예제를 봤을 때 파이썬이 왜 입문자한테 편하다고 하는지 바로 이해했습니다.
// C언어: 타입을 미리 지정해야 함
int age = 25;
float height = 175.5f;
char grade = 'A';
# 파이썬: 그냥 값을 넣으면 됨
age = 25
height = 175.5
grade = 'A'
타입 선언이 없으니까 처음부터 “이 데이터가 뭔지”에 집중할 수 있습니다. int가 뭔지 float가 뭔지 먼저 외우지 않아도 되니까요.
변수 선언
name = "홍길동"
age = 25
height = 175.5
is_student = True
이게 다입니다. 따로 뭘 더 적을 필요 없습니다.
데이터 타입 종류
파이썬이 알아서 타입을 정해주긴 하는데, 어떤 타입들이 있는지는 알아둬야 합니다. 나중에 타입 때문에 에러 나는 경우가 꽤 있어서요.
정수 (int)
소수점 없는 숫자입니다.
age = 25
count = -10
big_number = 1000000
temperature = -5
print(type(age)) # <class 'int'>
파이썬은 정수 크기 제한이 거의 없습니다. 다른 언어처럼 long 타입이 따로 있는 것도 아니고 그냥 전부 int입니다. 이것도 처음에 좀 신기했습니다.
실수 (float)
소수점 있는 숫자입니다.
height = 175.5
pi = 3.14159
temperature = -5.5
price = 1234.56
print(type(height)) # <class 'float'>
소수점이 하나라도 있으면 자동으로 float가 됩니다. 1.5e3 같은 과학적 표기법도 됩니다 (결과는 1500.0).
문자열 (str)
글자를 다루는 타입입니다.
name = "홍길동"
message = '안녕하세요'
multiline = """여러 줄
문자열입니다"""
print(type(name)) # <class 'str'>
작은따옴표(')든 큰따옴표(")든 상관없습니다. 편한 걸 쓰면 됩니다. 여러 줄 쓰고 싶으면 삼중따옴표를 씁니다.
# 다 같은 문자열
text1 = "Hello"
text2 = 'Hello'
text3 = """Hello"""
# 여러 줄
poem = """동해물과 백두산이
마르고 닳도록
하느님이 보우하사
우리나라 만세"""
불린 (bool)
참/거짓만 담는 타입입니다.
is_student = True
is_working = False
is_raining = True
print(type(is_student)) # <class 'bool'>
여기서 주의할 점 하나: True랑 False는 첫 글자가 대문자여야 합니다. true라고 쓰면 에러 납니다. 처음에 다른 언어 보다가 소문자로 써서 왜 안 되지 한 적이 있습니다.
리스트 (list)
여러 값을 순서대로 묶어서 저장합니다.
numbers = [1, 2, 3, 4, 5]
names = ["홍길동", "김철수", "이영희"]
mixed = [1, "문자열", 3.14, True] # 다양한 타입 섞어서 가능
print(type(numbers)) # <class 'list'>
대괄호 []로 감싸고, 타입을 섞어서 넣을 수 있다는 게 파이썬 리스트의 특징입니다.
딕셔너리 (dict)
키-값 쌍으로 저장합니다. 이름으로 값을 찾을 수 있어서 편합니다.
student = {
"name": "홍길동",
"age": 25,
"grade": "A"
}
print(type(student)) # <class 'dict'>
중괄호 {}를 쓰고, 키로 값을 꺼내 쓸 수 있습니다.
변수 이름 짓기
변수 이름 아무렇게나 지으면 나중에 코드 읽을 때 고생합니다.
규칙
- 영문자, 숫자, 언더스코어(
_)만 사용 가능 - 숫자로 시작할 수 없음
if,for,while,def같은 예약어 사용 불가
되는 것들:
student_name = "홍길동" # 의미가 명확함
student_age = 25 # 언더스코어로 단어 구분
max_score = 100 # 여러 단어는 이렇게
totalCount = 50 # 이것도 되긴 하는데 파이썬에서는 언더스코어 스타일 추천
안 되는 것들:
2name = "홍길동" # 숫자로 시작 -- 안 됨
student-name = "홍길동" # 하이픈 -- 안 됨
if = 10 # 예약어 -- 안 됨
a = 10 # 되긴 하는데 나중에 뭔지 모름
파이썬에서는 student_age 같은 스네이크 케이스가 표준입니다. studentAge 같은 카멜 케이스는 자바 스타일이라 파이썬에서는 잘 안 씁니다.
타입 확인
type() 함수로 확인합니다.
age = 25
name = "홍길동"
height = 175.5
is_student = True
print(type(age)) # <class 'int'>
print(type(name)) # <class 'str'>
print(type(height)) # <class 'float'>
print(type(is_student)) # <class 'bool'>
디버깅할 때 특히 유용합니다. 에러가 나면 일단 type() 찍어보는 습관을 들이면 원인을 빨리 찾을 수 있습니다.
타입 변환
처음에 타입 변환이랑 타입 캐스팅이 같은 건지 헷갈렸는데, 파이썬에서는 그냥 int(), str(), float() 같은 함수를 써서 바꾸는 걸 타입 변환이라고 부릅니다.
# 정수를 문자열로
age = 25
age_str = str(age)
print(age_str, type(age_str)) # 25 <class 'str'>
# 문자열을 정수로
number_str = "100"
number = int(number_str)
print(number, type(number)) # 100 <class 'int'>
# 정수를 실수로
num = 10
num_float = float(num)
print(num_float, type(num_float)) # 10.0 <class 'float'>
# 실수를 정수로 (소수점 버림)
pi = 3.14159
pi_int = int(pi)
print(pi_int) # 3 (소수점이 버려짐)
자주 쓰는 것들:
str(): 문자열로int(): 정수로float(): 실수로bool(): 불린으로
int(3.14)하면 3이 됩니다. 반올림이 아니라 버림이라는 거 주의해야 합니다. 처음에 반올림인 줄 알고 한참 삽질한 적이 있습니다.
값 변경
변수는 언제든 값을 바꿀 수 있습니다. 파이썬은 타입까지 바꿀 수 있습니다.
age = 25
print(age) # 25
age = 26
print(age) # 26
# 타입도 바꿀 수 있음
age = "스물여섯"
print(age, type(age)) # 스물여섯 <class 'str'>
C언어에서는 int로 선언한 변수에 문자열 못 넣는데 파이썬은 됩니다. 편하긴 한데 나중에 실수로 타입이 바뀌어서 에러 나는 경우도 있어서, 이건 양날의 검이긴 합니다.
여러 변수 한 번에 할당
# 같은 값 넣기
a = b = c = 10
print(a, b, c) # 10 10 10
# 다른 값 넣기 (언패킹)
name, age, height = "홍길동", 25, 175.5
print(name, age, height) # 홍길동 25 175.5
# 값 교환 -- 이거 진짜 편함
x = 10
y = 20
x, y = y, x # 한 줄로 교환
print(x, y) # 20 10
C언어에서 값 교환하려면 임시 변수를 써야 합니다:
// C언어: 임시 변수 필요
int temp = x;
x = y;
y = temp;
# 파이썬: 한 줄
x, y = y, x
이런 거 볼 때마다 파이썬 문법이 확실히 간결하긴 하다고 느낍니다.
예제: 학생 정보 관리
# 학생 정보 변수 선언
student_name = "홍길동"
student_age = 20
student_score = 85.5
is_passed = True
# 정보 출력
print("=== 학생 정보 ===")
print("이름:", student_name)
print("나이:", student_age, "세")
print("점수:", student_score, "점")
print("합격 여부:", "합격" if is_passed else "불합격")
print("=================")
# 정보 업데이트
student_age = 21
student_score = 90.0
print("\n=== 업데이트된 정보 ===")
print("나이:", student_age, "세")
print("점수:", student_score, "점")
출력:
=== 학생 정보 ===
이름: 홍길동
나이: 20 세
점수: 85.5 점
합격 여부: 합격
=================
=== 업데이트된 정보 ===
나이: 21 세
점수: 90.0 점
예제: 원의 넓이 계산
# 원의 넓이 계산
radius = 5
pi = 3.14159
area = pi * radius * radius
print("반지름:", radius)
print("원의 넓이:", area)
print("원의 넓이 (소수점 2자리):", round(area, 2))
# 사각형의 넓이 계산
width = 10
height = 5
rectangle_area = width * height
print("\n사각형의 넓이:", rectangle_area)
출력:
반지름: 5
원의 넓이: 78.53975
원의 넓이 (소수점 2자리): 78.54
사각형의 넓이: 50
예제: 타입 변환 써보기
# input()은 항상 문자열을 반환함 -- 이거 모르면 에러 남
age_str = "25" # 문자열
print("나이 (문자열):", age_str, type(age_str))
# 정수로 변환
age = int(age_str)
print("나이 (정수):", age, type(age))
# 내년 나이 계산
next_year_age = age + 1
print("내년 나이:", next_year_age)
# 문자열과 숫자 결합
message = "내년에는 " + str(next_year_age) + "세가 됩니다!"
print(message)
출력:
나이 (문자열): 25 <class 'str'>
나이 (정수): 25 <class 'int'>
내년 나이: 26
내년에는 26세가 됩니다!
문자열이랑 숫자를 +로 붙이려면 숫자 쪽을 str()로 바꿔줘야 합니다. 이거 안 하면 TypeError 나옵니다.
변수가 메모리에서 어떻게 작동하는지
좀 더 깊은 얘기인데 알아두면 나중에 헷갈리는 상황을 줄일 수 있습니다.
a = 10
b = a # b는 a와 같은 객체를 참조
print(a, b) # 10 10
a = 20 # a는 새로운 객체를 참조
print(a, b) # 20 10 (b는 여전히 10)
b = a 하면 b가 a의 값을 “복사”한다기보다, 같은 값을 가리킨다고 보는 게 맞습니다. 그런데 a = 20을 하면 a만 새 값을 가리키게 되고 b는 그대로 10을 가리키고 있습니다. 처음에 이게 좀 헷갈렸는데 코드로 직접 쳐보니까 금방 이해됐습니다.
잘 틀리는 것들 모음
문자열이랑 숫자 연산
age = "25" # 이건 문자열
# next_age = age + 1 # 에러남. 문자열 + 숫자 안 됨
next_age = int(age) + 1 # 타입 변환하고 연산해야 함
변수명 오타
student_age = 20
# print(student_ag) # 오타 -- NameError
print(student_age) # 맞는 이름
예약어 쓰기
# def = 10 # def는 예약어라 변수명으로 못 씀
def_count = 10 # 이런 식으로 바꿔야 함
input() 타입 안 바꾸기
user_input = input("나이를 입력하세요: ") # 이건 항상 문자열임
# age = user_input + 1 # 에러
age = int(user_input) + 1 # int()로 바꿔야 연산 가능
연습 문제
직접 쳐보면 좋은 것들:
- 올해 나이와 내년 나이를 출력하는 코드
- 키와 몸무게로 BMI 계산하기 (BMI = 몸무게(kg) / 키(m)의 제곱)
- 문자열 “100”을 정수로 바꾸고, 50 더한 뒤, 다시 문자열로 바꾸기
# 1번
age = 25
print("올해 나이:", age)
print("내년 나이:", age + 1)
# 2번
weight = 70.0
height = 1.75
bmi = weight / (height ** 2)
print("BMI:", round(bmi, 2))
# 3번
num_str = "100"
num = int(num_str)
result = num + 50
result_str = str(result)
print(result_str)
변수 쪽은 한번 손에 붙으면 계속 반복해서 쓰게 됩니다. 조건문이든 함수든 결국 변수 위에서 돌아가는 거라, 여기서 type() 찍어보면서 감 잡아두면 뒤에 가서 편합니다.