4. 바인딩(Binding)과 타입 시스템

프로그램이 실행될 때, 우리가 지어준 “이름(변수)”과 실제 메모리 공간에 존재하는 “데이터(객체)”가 서로 연결되는 과정을 바인딩(Binding)이라고 합니다.

바인딩이 언제, 어떻게 일어나는지 이해하는 것은 파이썬의 동작 방식을 파악하는 핵심 열쇠입니다. 파이썬은 변수에 타입을 강제하지 않고 오로지 런타임에 동적으로 객체와 연결되는 고유한 메커니즘을 가지고 있습니다.

4.1 정적 타입(Static) vs 동적 타입(Dynamic)

프로그래밍 언어는 변수와 데이터 타입이 묶이는 시점에 따라 두 가지로 분류됩니다.

  • 정적 타입 언어 (C, Java 등): 코드를 컴파일하는 시점에 변수의 자료형을 미리 결정합니다. 한 번 int로 선언된 변수에는 문자열을 넣을 수 없습니다.
  • 동적 타입 언어 (Python, JavaScript 등): 변수를 선언할 때 타입을 지정하지 않습니다. 프로그램이 실행되는 도중(런타임)에 할당되는 데이터 객체를 보고 즉석에서 타입이 결정됩니다.

파이썬의 동적 바인딩 예제

파이썬에서는 동일한 변수 이름에 서로 다른 타입의 데이터를 자유롭게 번갈아 가며 할당할 수 있습니다.

In : current_data = 100
In : print(type(current_data))
Out: <class 'int'>

# 동일한 변수에 문자열을 재할당하면 타입이 동적으로 변경됩니다.
In : current_data = "Hello"
In : print(type(current_data))
Out: <class 'str'>

강한 타입(Strong Typing) 언어
파이썬이 동적 타입 언어라서 변수에 아무거나 넣을 수 있다고 해서, 데이터 타입의 구분이 모호한 “약한 타입(Weak Typing)”인 것은 아닙니다. 파이썬은 한 번 메모리에 적재된 객체의 고유한 본질(타입)은 절대 임의로 변환하지 않는 아주 엄격한 강한 타입 언어입니다. (예: 정수와 문자열을 명시적 변환 없이 더하면 에러 발생)


4.2 표현식의 평가(Evaluation) 전략

파이썬 엔진이 코드 안의 수식을 계산(평가)할 때 사용하는 두 가지 주요 전략이 있습니다.

1) 엄격한 평가 (Eager Evaluation)

일반적인 변수 할당이나 산술 연산에서는 수식의 결과를 즉시 끝까지 계산합니다.

# A부터 D까지 모두 평가된 최종 값 5를 즉시 할당받습니다.
In : a = b = c = d = 5
In : print(a + b + c + d)
Out: 20

2) 지연 평가 (Lazy Evaluation)

논리 연산자(and, or)와 같이 끝까지 계산하지 않아도 결과를 확정 지을 수 있는 상황에서는 효율성을 위해 불필요한 뒷부분 로직의 실행을 건너뜁니다. 이를 단축 평가(Short-circuit Evaluation)라고도 부릅니다.

# 앞의 조건(1+5 = 6, True)이 참이므로 뒤의 조건(10)은 아예 평가조차 하지 않고 통과합니다.
In : (1+5) or (10)
Out: 6

# 앞의 조건이 거짓(0)이므로, 뒤의 조건을 마저 평가하여 15를 반환합니다.
In : 0 or (10+5)
Out: 15

4.3 파이썬의 인터페이스(Interface) 원칙

Java나 C++ 같은 언어에서는 private, protected, public 등의 접근 제어자(Access Modifier)를 통해 객체 내부로의 외부 침투를 엄격하게 막습니다.

하지만 파이썬은 “We are all consenting adults here” (우리는 모두 책임감 있는 어른이다) 라는 특유의 문화적 철학을 가집니다. 파이썬의 모든 메서드와 속성은 기본적으로 완벽하게 공개(Public)되어 있습니다.

class UserProfile:
    def __init__(self, name):
        # 관행적으로 언더바(_)를 앞에 붙여 내부 사용용임을 '암시'만 할 뿐, 실제 접근을 막진 못합니다.
        self._name = name
        
    def get_name(self):
        return self._name

user = UserProfile("Alice")

# 일반적인 메서드 접근
print(user.get_name())  # "Alice"

# 캡슐화가 적용된 언어와 달리, 속성에 다이렉트로 접근도 얼마든지 강제 가능합니다.
print(user._name)  # "Alice"

파이썬에서 언더바(_)로 시작하는 변수나 메서드는 “이것은 가급적 건드리지 말고 내부적으로만 쓰세요”라는 개발자 간의 신사협정(Convention)일 뿐, 시스템이 물리적으로 접근을 차단하지는 않는다는 점을 꼭 기억해야 합니다.

서브목차