Skip to main content

변수와 타입

학습 목표

  • 변수의 개념과 Python의 변수 할당 방식을 이해한다
  • int, float, bool, str, None 타입의 특성을 구분할 수 있다
  • 타입 변환(Type Casting)을 올바르게 수행할 수 있다
  • 산술, 비교, 논리 연산자를 활용할 수 있다

왜 중요한가

변수와 타입은 프로그래밍의 가장 기본적인 구성 요소입니다. 데이터를 저장하고, 처리하고, 전달하는 모든 과정이 변수와 타입 위에서 동작합니다. 특히 ML/DL에서는 데이터 타입에 따라 메모리 사용량과 연산 정밀도가 달라지므로, 타입에 대한 정확한 이해가 필수입니다.

변수(Variable)

변수란

변수는 값을 저장하는 이름표입니다. Python에서는 = 연산자(할당 연산자, Assignment Operator)로 값을 변수에 할당합니다.
# 변수 할당
name = "김철수"
age = 25
height = 175.5
is_student = True

Python의 변수 특성

Python의 변수는 다른 언어와 다르게 **이름이 객체를 참조(Reference)**하는 방식으로 동작합니다.
# 변수는 객체를 가리키는 이름표
a = [1, 2, 3]
b = a           # b도 같은 리스트 객체를 가리킴

b.append(4)
print(a)        # [1, 2, 3, 4] — a도 변경됨!
print(a is b)   # True — 같은 객체를 참조

변수 이름 규칙

규칙예시설명
영문자/밑줄로 시작name, _count숫자로 시작 불가
영문자, 숫자, 밑줄 사용user_name, score2특수문자 불가
대소문자 구분Name != name별개의 변수
예약어 사용 불가if, for, class내장 키워드
# 좋은 변수명
user_name = "김철수"
total_score = 95
is_valid = True
MAX_RETRY = 3          # 상수(관례적으로 대문자)

# 나쁜 변수명
x = "김철수"           # 의미 불분명
temp = 95              # 모호함
flag = True            # 무엇의 플래그인지 불명확

다중 할당

# 여러 변수에 동시 할당
x, y, z = 1, 2, 3

# 같은 값 할당
a = b = c = 0

# 값 교환 (swap)
x, y = 10, 20
x, y = y, x    # Python만의 간결한 swap
print(x, y)    # 20 10

기본 데이터 타입

정수(int)

크기 제한이 없는 정수형입니다. 메모리가 허용하는 한 얼마든지 큰 수를 다룰 수 있습니다.
# 정수 리터럴
a = 42
b = -17
c = 0

# 큰 수 (밑줄로 구분 가능 - Python 3.6+)
population = 51_840_000
budget = 1_000_000_000

# 다양한 진법
binary = 0b1010      # 2진수: 10
octal = 0o17         # 8진수: 15
hexadecimal = 0xFF   # 16진수: 255

print(type(a))       # <class 'int'>

실수(float)

IEEE 754 배정밀도 부동소수점(64비트)으로 표현됩니다.
# 실수 리터럴
pi = 3.14159
temp = -40.0
ratio = 0.618

# 과학적 표기법
avogadro = 6.022e23      # 6.022 x 10^23
planck = 6.626e-34       # 6.626 x 10^-34

# 특수 값
import math
print(math.inf)          # 양의 무한대
print(-math.inf)         # 음의 무한대
print(math.nan)          # Not a Number
부동소수점은 근사값입니다. 0.1 + 0.2 == 0.3False입니다!
print(0.1 + 0.2)         # 0.30000000000000004
print(0.1 + 0.2 == 0.3)  # False

# 해결 방법
import math
print(math.isclose(0.1 + 0.2, 0.3))  # True

불리언(bool)

True 또는 False 두 값만 가지는 논리형입니다. 내부적으로 int의 하위 타입이며, True == 1, False == 0입니다.
is_active = True
has_error = False

# bool은 int의 하위 타입
print(True + True)     # 2
print(True * 10)       # 10
print(isinstance(True, int))  # True

# 진리값 판단 (Truthiness)
# 거짓(Falsy): False, 0, 0.0, "", [], {}, set(), None
# 참(Truthy): 그 외 모든 값
print(bool(0))         # False
print(bool(42))        # True
print(bool(""))        # False
print(bool("hello"))   # True
print(bool([]))        # False
print(bool([1, 2]))    # True

문자열(str)

유니코드 텍스트 시퀀스입니다. 작은따옴표(')와 큰따옴표(") 모두 사용 가능합니다.
# 문자열 리터럴
name = "김철수"
greeting = 'Hello, World!'
multiline = """여러 줄
문자열도
가능합니다"""

# 이스케이프 문자
path = "C:\\Users\\user"     # 백슬래시
newline = "첫째 줄\n둘째 줄"  # 줄바꿈
tab = "이름\t나이"           # 탭

# raw string (이스케이프 무시)
regex = r"\d+\.\d+"         # 정규표현식에 유용
문자열은 자료구조 - 문자열 문서에서 더 자세히 다룹니다.

None 타입

“값이 없음”을 나타내는 특수 타입입니다. 다른 언어의 null에 해당합니다.
result = None

# None 확인은 is 연산자 사용
if result is None:
    print("결과 없음")

# None은 Falsy
if not result:
    print("결과가 비어 있습니다")

# 함수가 명시적으로 return하지 않으면 None 반환
def do_nothing():
    pass

print(do_nothing())    # None

타입 확인과 변환

타입 확인

x = 42
print(type(x))              # <class 'int'>
print(isinstance(x, int))   # True
print(isinstance(x, (int, float)))  # True (둘 중 하나)

타입 변환(Type Casting)

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

# 숫자 -> 문자열
text = str(42)           # "42"
text = str(3.14)         # "3.14"

# 정수 <-> 실수
n = int(3.7)             # 3 (소수점 이하 버림)
f = float(42)            # 42.0

# bool 변환
print(int(True))         # 1
print(int(False))        # 0
print(bool(1))           # True
print(bool(0))           # False
변환 불가능한 값은 ValueError를 발생시킵니다.
int("hello")   # ValueError: invalid literal for int()
float("abc")   # ValueError: could not convert string to float

연산자(Operator)

산술 연산자

a, b = 10, 3

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

# 복합 대입 연산자
x = 10
x += 5    # x = x + 5  ->  15
x -= 3    # x = x - 3  ->  12
x *= 2    # x = x * 2  ->  24
x //= 5   # x = x // 5 ->  4

비교 연산자

a, b = 10, 20

print(a == b)    # False  같은가
print(a != b)    # True   다른가
print(a > b)     # False  큰가
print(a < b)     # True   작은가
print(a >= b)    # False  크거나 같은가
print(a <= b)    # True   작거나 같은가

# 체이닝 가능 (Python 특유의 문법)
x = 15
print(10 < x < 20)    # True
print(0 <= x <= 100)   # True

논리 연산자

# and, or, not
print(True and False)   # False
print(True or False)    # True
print(not True)         # False

# 단축 평가 (Short-circuit Evaluation)
# and: 첫 Falsy 값 또는 마지막 값 반환
# or: 첫 Truthy 값 또는 마지막 값 반환
print(0 and 42)         # 0
print(42 and "hello")   # "hello"
print(0 or 42)          # 42
print("" or "default")  # "default"

# 실용적 활용
name = input_name or "익명"    # 입력값이 비면 "익명" 사용

동일성 연산자

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

# == : 값이 같은가
print(a == b)    # True

# is : 같은 객체인가 (메모리 주소 비교)
print(a is b)    # False (다른 객체)
print(a is c)    # True  (같은 객체)

# None 비교는 항상 is 사용
x = None
print(x is None)      # True  (권장)
print(x == None)       # True  (비권장)

AI/ML에서의 활용

데이터 타입에 대한 이해는 ML/DL 작업의 기초입니다.
# 하이퍼파라미터 설정에서의 타입 활용
learning_rate = 0.001        # float: 학습률
epochs = 100                 # int: 에포크 수
batch_size = 32              # int: 배치 크기
use_gpu = True               # bool: GPU 사용 여부
model_name = "bert-base"     # str: 모델 이름
checkpoint = None            # None: 아직 저장된 체크포인트 없음

# NumPy에서의 타입 매핑
# Python int   -> np.int64
# Python float -> np.float64
# Python bool  -> np.bool_
Python에는 진정한 상수(constant)가 없습니다. 관례적으로 대문자와 밑줄로 이름을 짓습니다: MAX_RETRY = 3, PI = 3.14159. 이는 “변경하지 마세요”라는 개발자 간의 약속입니다.
del 키워드로 변수를 삭제할 수 있습니다. del x를 실행하면 이후 x를 참조하면 NameError가 발생합니다. 실무에서는 거의 사용하지 않습니다.
id(obj)는 객체의 고유 식별자(메모리 주소)를 반환합니다. a is bid(a) == id(b)와 동일합니다. 디버깅 시 객체의 동일성을 확인할 때 유용합니다.

체크리스트

  • 변수 할당과 참조 방식을 설명할 수 있다
  • int, float, bool, str, None의 특성을 구분할 수 있다
  • 부동소수점의 근사값 문제를 인지하고 대처할 수 있다
  • type()isinstance()로 타입을 확인할 수 있다
  • 타입 변환 함수(int(), float(), str(), bool())를 올바르게 사용할 수 있다
  • 산술, 비교, 논리, 동일성 연산자를 구분하여 사용할 수 있다

다음 문서