본문으로 건너뛰기
Advertisement

Ch 2.2 기본 데이터 타입

파이썬의 기본 데이터 타입은 정수(int), 실수(float), 불리언(bool), 문자열(str), 그리고 None입니다. 각 타입의 특성과 실무에서 주의해야 할 점을 알아봅니다.

1. int — 정수

파이썬의 정수는 무한 정밀도(Arbitrary Precision) 를 지원합니다. 다른 언어처럼 오버플로우가 발생하지 않습니다.

# 기본 정수
x = 42
y = -100
z = 0

# 큰 정수도 그냥 표현 가능
big_number = 10 ** 100 # 구골(Googol) — 오버플로우 없음
print(big_number)
# 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

# 진수 표현
binary = 0b1010 # 2진수 (10)
octal = 0o17 # 8진수 (15)
hexadecimal = 0xFF # 16진수 (255)
print(binary, octal, hexadecimal) # 10 15 255

# 가독성을 위한 언더스코어 구분자 (Python 3.6+)
million = 1_000_000
billion = 1_000_000_000
hex_color = 0xFF_A5_00 # 주황색 #FFA500
print(million) # 1000000
print(billion) # 1000000000

정수 관련 내장 함수

# abs() — 절댓값
print(abs(-42)) # 42
print(abs(42)) # 42

# divmod() — 몫과 나머지를 튜플로 반환
quotient, remainder = divmod(17, 5)
print(quotient, remainder) # 3 2

# pow() — 거듭제곱 (세 번째 인수로 모듈러 가능)
print(pow(2, 10)) # 1024
print(pow(2, 10, 100)) # 1024 % 100 = 24 (암호학에서 유용)

# round() — 반올림
print(round(3.7)) # 4
print(round(3.14159, 2)) # 3.14

# bin(), oct(), hex() — 진수 변환
print(bin(255)) # '0b11111111'
print(oct(255)) # '0o377'
print(hex(255)) # '0xff'

2. float — 부동소수점

# 기본 실수
x = 3.14
y = -2.71828
z = 1.0

# 과학적 표기법
speed_of_light = 3e8 # 3 × 10^8 = 300000000.0
electron_mass = 9.109e-31 # 9.109 × 10^-31
print(speed_of_light) # 300000000.0

부동소수점 정밀도 문제

# 0.1 + 0.2는 0.3이 아님!
result = 0.1 + 0.2
print(result) # 0.30000000000000004
print(result == 0.3) # False !!

# 이유: 컴퓨터는 이진수로 소수를 표현하기 때문에 근사값이 됨

# 해결책 1: round() 사용 (간단한 경우)
print(round(0.1 + 0.2, 1)) # 0.3
print(round(0.1 + 0.2, 10) == 0.3) # True

# 해결책 2: math.isclose() 사용 (비교 시)
import math
print(math.isclose(0.1 + 0.2, 0.3)) # True

# 해결책 3: decimal.Decimal 사용 (금융/정밀 계산)
from decimal import Decimal
a = Decimal("0.1")
b = Decimal("0.2")
print(a + b) # 0.3 (정확!)
print(a + b == Decimal("0.3")) # True

# 금융 계산 예시
price = Decimal("29900")
discount = Decimal("0.1")
final_price = price * (1 - discount)
print(final_price) # 26910.0

3. bool — 불리언

파이썬의 boolint서브클래스입니다. True는 1, False는 0으로 취급됩니다.

# 기본 불리언
is_active = True
is_deleted = False

print(type(True)) # <class 'bool'>
print(isinstance(True, int)) # True — bool은 int의 하위 클래스!

# bool은 정수처럼 연산 가능
print(True + True) # 2
print(True * 10) # 10
print(False + 1) # 1

# 리스트에서 True의 개수 세기 (실용적인 활용)
scores = [85, 92, 78, 55, 90, 45]
passed = [score >= 60 for score in scores]
print(passed) # [True, True, True, False, True, False]
print(sum(passed)) # 4 (합격자 수)

# 비교 연산의 결과는 bool
print(10 > 5) # True
print(10 == "10") # False
print(type(10 > 5)) # <class 'bool'>

4. str — 문자열

문자열은 불변(Immutable) 시퀀스입니다. 한 번 생성된 문자열은 변경할 수 없습니다.

# 여러 가지 따옴표 방식
single = '작은따옴표'
double = "큰따옴표"
triple_single = '''세 줄짜리
문자열
작성 가능'''
triple_double = """여러 줄
문자열"""

# 이스케이프 문자
newline = "첫 번째 줄\n두 번째 줄"
tab = "이름:\t홍길동"
backslash = "경로: C:\\Users\\alice"
quote = "그가 말했다: \"안녕하세요\""
print(newline)
print(tab)

# Raw string — 이스케이프 처리 안 함 (정규식, 경로에 유용)
path = r"C:\Users\alice\Documents"
regex = r"\d+\.\d+"
print(path) # C:\Users\alice\Documents (역슬래시 그대로)

# 문자열 인덱싱과 슬라이싱
text = "Python"
print(text[0]) # P
print(text[-1]) # n
print(text[1:4]) # yth
print(text[::-1]) # nohtyP (역순)

# 문자열 불변성 확인
# text[0] = "J" # TypeError: 'str' object does not support item assignment

# 불변이므로 새 문자열 생성
text = "J" + text[1:]
print(text) # Jython

5. NoneType — None

None은 파이썬에서 값이 없음을 나타내는 특별한 객체입니다. 다른 언어의 null에 해당합니다.

# None 할당
result = None
user = None

# None 확인 — is를 사용하는 것이 권장 방법
if result is None:
print("결과가 없습니다.")

if user is not None:
print(f"사용자: {user}")

# == 와 is의 차이
print(None == None) # True
print(None is None) # True (이것을 권장)

# None이 함수 기본 반환값
def do_nothing():
pass # return이 없으면 None 반환

result = do_nothing()
print(result) # None
print(type(result)) # <class 'NoneType'>

# None은 falsy 값
print(bool(None)) # False
if not None:
print("None은 거짓으로 평가됩니다.")

# 함수 매개변수 기본값으로 자주 사용
def greet(name=None):
if name is None:
return "Hello, stranger!"
return f"Hello, {name}!"

print(greet()) # Hello, stranger!
print(greet("Alice")) # Hello, Alice!

6. type()isinstance() 활용

# type() — 정확한 타입 반환
x = 42
print(type(x)) # <class 'int'>
print(type(x) == int) # True
print(type(x) == str) # False

# isinstance() — 상속 관계를 고려한 타입 확인 (권장)
print(isinstance(x, int)) # True
print(isinstance(True, int)) # True — bool은 int의 하위 클래스
print(isinstance(True, bool)) # True

# 여러 타입 동시 확인
def process(value):
if isinstance(value, (int, float)):
return value * 2
elif isinstance(value, str):
return value.upper()
else:
raise TypeError(f"지원하지 않는 타입: {type(value)}")

print(process(5)) # 10
print(process(3.14)) # 6.28
print(process("hello")) # HELLO

고수 팁: sys.maxsize, math.inf, math.nan 활용
import sys
import math

# sys.maxsize — 현재 플랫폼에서 리스트/문자열의 최대 인덱스 크기
print(sys.maxsize) # 9223372036854775807 (64비트 시스템)

# 파이썬 정수에는 실제 제한 없음
huge = sys.maxsize + 1 # 오버플로우 없음
print(type(huge)) # <class 'int'>

# math.inf — 양의 무한대
positive_inf = math.inf
negative_inf = -math.inf
print(math.inf > 10**1000) # True

# float('inf')도 동일
print(float('inf') == math.inf) # True

# 최솟값을 무한대로 초기화하는 패턴 (자주 사용!)
def find_min(numbers):
minimum = math.inf
for num in numbers:
if num < minimum:
minimum = num
return minimum

print(find_min([5, 3, 8, 1, 9])) # 1

# math.nan — 숫자가 아님 (Not a Number)
nan = math.nan
print(nan) # nan
print(nan == nan) # False!! (NaN은 자기 자신과 같지 않음)
print(math.isnan(nan)) # True (nan 확인은 isnan 사용)

# 실제 활용: 누락 데이터 표현
data = [1.0, 2.0, math.nan, 4.0, math.nan, 6.0]
valid_data = [x for x in data if not math.isnan(x)]
print(valid_data) # [1.0, 2.0, 4.0, 6.0]

기본 데이터 타입을 마스터했습니다. 다음 챕터에서는 파이썬의 강력한 컬렉션 타입인 list, tuple, set, dict를 깊이 있게 살펴보겠습니다.

Advertisement