본문으로 건너뛰기

변수와 자료형

변수란?

변수는 값을 저장하는 상자입니다. Python은 동적 타이핑을 사용해 타입을 자동으로 추론합니다.

# 변수 선언과 할당
name = "홍길동"
age = 25
height = 175.5
is_student = True

print(name) # 홍길동
print(age) # 25

변수명 규칙

# ✅ 올바른 변수명
user_name = "김철수"
age2 = 30
_private = "내부용"
total_price = 10000

# ❌ 잘못된 변수명
2age = 30 # 숫자로 시작 불가
user-name = "" # 하이픈 불가
for = 10 # 예약어 불가

명명 규칙

- snake_case 사용 (Python 표준)
- 소문자로 시작
- 의미있는 이름 사용
- 예약어 피하기 (if, for, class 등)

기본 자료형

1. 숫자형 (Numbers)

정수 (int)

# 정수
x = 10
y = -5
big_number = 1000000

# 연산
print(10 + 5) # 15 (덧셈)
print(10 - 5) # 5 (뺄셈)
print(10 * 5) # 50 (곱셈)
print(10 / 5) # 2.0 (나눗셈 - 실수 반환)
print(10 // 5) # 2 (정수 나눗셈)
print(10 % 3) # 1 (나머지)
print(2 ** 3) # 8 (거듭제곱)

실수 (float)

# 실수
pi = 3.14
temperature = -15.5
scientific = 1.5e3 # 1500.0

# 정밀도 주의
print(0.1 + 0.2) # 0.30000000000000004 (부동소수점 오차)

# 반올림
result = round(0.1 + 0.2, 1)
print(result) # 0.3

복소수 (complex)

z = 3 + 4j
print(z.real) # 3.0 (실수부)
print(z.imag) # 4.0 (허수부)

2. 문자열 (String)

# 문자열 생성
name = "홍길동"
message = '안녕하세요'
multi_line = """여러 줄
문자열
작성"""

# 문자열 연산
greeting = "안녕" + "하세요" # 안녕하세요 (연결)
repeat = "!" * 3 # !!! (반복)

# 인덱싱과 슬라이싱
text = "Python"
print(text[0]) # P (첫 글자)
print(text[-1]) # n (마지막 글자)
print(text[0:3]) # Pyt (0부터 3 전까지)
print(text[2:]) # thon (2부터 끝까지)
print(text[:4]) # Pyth (처음부터 4 전까지)

문자열 메서드

text = "Hello, Python!"

# 대소문자 변환
print(text.upper()) # HELLO, PYTHON!
print(text.lower()) # hello, python!
print(text.capitalize()) # Hello, python!

# 검색
print(text.find("Python")) # 7 (위치)
print(text.count("l")) # 2 (개수)
print("Python" in text) # True (포함 여부)

# 변환
print(text.replace("Python", "World")) # Hello, World!
print(text.split(", ")) # ['Hello', 'Python!']

# 공백 제거
text = " hello "
print(text.strip()) # "hello"
print(text.lstrip()) # "hello "
print(text.rstrip()) # " hello"

문자열 포매팅

name = "홍길동"
age = 25

# f-string (Python 3.6+, 추천)
message = f"이름: {name}, 나이: {age}"
print(message) # 이름: 홍길동, 나이: 25

# 계산도 가능
print(f"내년 나이: {age + 1}") # 내년 나이: 26

# 포맷 지정
price = 1234.5678
print(f"가격: {price:.2f}원") # 가격: 1234.57원

# format() 메서드
message = "이름: {}, 나이: {}".format(name, age)

# % 포매팅 (오래된 방식)
message = "이름: %s, 나이: %d" % (name, age)

3. 불린 (Boolean)

# 불린 값
is_active = True
is_deleted = False

# 비교 연산
print(5 > 3) # True
print(5 == 5) # True
print(5 != 3) # True

# 논리 연산
print(True and False) # False
print(True or False) # True
print(not True) # False

# 실제 활용
age = 20
is_adult = age >= 18
print(is_adult) # True

Truthy와 Falsy

# False로 간주되는 값들
print(bool(0)) # False
print(bool("")) # False
print(bool(None)) # False
print(bool([])) # False
print(bool({})) # False

# True로 간주되는 값들
print(bool(1)) # True
print(bool("hello")) # True
print(bool([1, 2])) # True
print(bool({"a": 1})) # True

# 조건문에서 활용
if "hello": # "hello"는 True
print("실행됨")

4. None 타입

# None은 '값이 없음'을 나타냄
result = None

if result is None:
print("결과가 없습니다")

# 함수 기본값
def greet(name=None):
if name is None:
print("안녕하세요!")
else:
print(f"안녕하세요, {name}님!")

greet() # 안녕하세요!
greet("홍길동") # 안녕하세요, 홍길동님!

타입 변환

명시적 변환

# 문자열 → 숫자
age = int("25") # 25
price = float("19.99") # 19.99

# 숫자 → 문자열
age_str = str(25) # "25"

# 불린 변환
print(bool(1)) # True
print(bool(0)) # False
print(bool("hello")) # True
print(bool("")) # False

# 리스트 → 튜플
numbers = [1, 2, 3]
numbers_tuple = tuple(numbers) # (1, 2, 3)

타입 확인

age = 25
name = "홍길동"
height = 175.5

# type() 함수
print(type(age)) # <class 'int'>
print(type(name)) # <class 'str'>
print(type(height)) # <class 'float'>

# isinstance() 함수
print(isinstance(age, int)) # True
print(isinstance(name, str)) # True
print(isinstance(height, int)) # False

연산자

산술 연산자

a = 10
b = 3

print(a + b) # 13 (덧셈)
print(a - b) # 7 (뺄셈)
print(a * b) # 30 (곱셈)
print(a / b) # 3.333... (나눗셈)
print(a // b) # 3 (몫)
print(a % b) # 1 (나머지)
print(a ** b) # 1000 (거듭제곱)

비교 연산자

print(5 == 5)  # True  (같음)
print(5 != 3) # True (다름)
print(5 > 3) # True (큼)
print(5 < 3) # False (작음)
print(5 >= 5) # True (크거나 같음)
print(5 <= 3) # False (작거나 같음)

# 문자열 비교
print("a" < "b") # True (사전순)

논리 연산자

age = 20
has_license = True

# and: 모두 True여야 True
can_drive = age >= 18 and has_license
print(can_drive) # True

# or: 하나만 True면 True
is_free = age < 7 or age >= 65
print(is_free) # False

# not: 반대
is_not_adult = not (age >= 18)
print(is_not_adult) # False

할당 연산자

x = 10

x += 5 # x = x + 5 → 15
x -= 3 # x = x - 3 → 12
x *= 2 # x = x * 2 → 24
x /= 4 # x = x / 4 → 6.0
x //= 2 # x = x // 2 → 3.0
x %= 2 # x = x % 2 → 1.0
x **= 3 # x = x ** 3 → 1.0

실전 예제

온도 변환기

def celsius_to_fahrenheit(celsius):
"""섭씨를 화씨로 변환"""
fahrenheit = (celsius * 9/5) + 32
return fahrenheit

def fahrenheit_to_celsius(fahrenheit):
"""화씨를 섭씨로 변환"""
celsius = (fahrenheit - 32) * 5/9
return celsius

# 사용
c = 25
f = celsius_to_fahrenheit(c)
print(f"{c}°C = {f:.1f}°F") # 25°C = 77.0°F

f = 77
c = fahrenheit_to_celsius(f)
print(f"{f}°F = {c:.1f}°C") # 77°F = 25.0°C

BMI 계산기

def calculate_bmi(weight, height):
"""BMI 계산 (체중kg, 키m)"""
bmi = weight / (height ** 2)
return round(bmi, 1)

def get_bmi_category(bmi):
"""BMI 카테고리 반환"""
if bmi < 18.5:
return "저체중"
elif bmi < 23:
return "정상"
elif bmi < 25:
return "과체중"
else:
return "비만"

# 사용
weight = 70 # kg
height = 1.75 # m

bmi = calculate_bmi(weight, height)
category = get_bmi_category(bmi)

print(f"BMI: {bmi}")
print(f"분류: {category}")

문자열 분석기

def analyze_text(text):
"""텍스트 분석"""
length = len(text)
words = len(text.split())
uppercase = sum(1 for c in text if c.isupper())
lowercase = sum(1 for c in text if c.islower())
digits = sum(1 for c in text if c.isdigit())

print(f"=== 텍스트 분석 ===")
print(f"전체 길이: {length}")
print(f"단어 수: {words}")
print(f"대문자: {uppercase}")
print(f"소문자: {lowercase}")
print(f"숫자: {digits}")

# 사용
text = "Hello Python 2024!"
analyze_text(text)

입력 받기

# 기본 입력
name = input("이름을 입력하세요: ")
print(f"안녕하세요, {name}님!")

# 숫자 입력 (변환 필요)
age = int(input("나이를 입력하세요: "))
next_year_age = age + 1
print(f"내년 나이: {next_year_age}")

# 여러 값 입력
text = input("두 숫자를 띄어쓰기로 입력: ")
a, b = map(int, text.split())
print(f"합: {a + b}")

자주 묻는 질문

Q1. 변수 선언 시 타입을 지정하나요?

A: Python은 동적 타이핑이라 자동으로 타입이 결정됩니다.

# 타입 자동 추론
x = 10 # int
x = "hello" # 이제 str (재할당 가능)

# 타입 힌트는 가능 (검증은 안 됨)
age: int = 25
name: str = "홍길동"

Q2. 정수 나눗셈(/) vs (//)의 차이는?

A: /는 실수 반환, //는 정수 반환

print(7 / 2)   # 3.5 (실수)
print(7 // 2) # 3 (정수)

# 음수도 마찬가지
print(-7 // 2) # -4 (내림)

Q3. 문자열 불변(immutable)이란?

A: 문자열은 생성 후 변경 불가능합니다.

text = "hello"
# text[0] = "H" # ❌ 에러!

# 새 문자열 생성해야 함
text = "H" + text[1:] # "Hello"

Q4. is vs == 차이는?

A: is는 객체 동일성, ==는 값 동일성

a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(a == b) # True (값이 같음)
print(a is b) # False (다른 객체)
print(a is c) # True (같은 객체)

# None 비교는 is 사용
x = None
print(x is None) # ✅ 권장
print(x == None) # 가능하지만 비권장

다음 단계

변수와 기본 타입을 배웠습니다!

핵심 정리:
✅ 변수 선언과 명명 규칙
✅ 숫자, 문자열, 불린, None
✅ 타입 변환과 확인
✅ 다양한 연산자
✅ 입력 받기

다음 단계: 문자열 처리에서 문자열을 더 깊이 배워보세요!