seong_hye, the developer

동적 바인딩 vs 정적 바인딩에 대해 알아보기 본문

Infomation

동적 바인딩 vs 정적 바인딩에 대해 알아보기

seong_hye 2022. 11. 26.

 

컴퓨터 언어를 여러가지 접하다 보면 항상 헷갈리는 부분이 있었다.

'이 언어가 변수 선언할 때 앞에 타입을 써줬었나 아니였나' 하는 부분이다.

var number: Int // swift의 변수 선언
int number = 5; // c++의 변수 선언 및 초기화
number = 5      // 파이썬의 변수 선언 및 초기화

 

이러한 차이는 언어가 정적 바인딩 혹은 정적 바인딩 중 어떤 것을 채용하고 있는 지에 따라 달라지게 된다. 

이때, 변수 선언시 타입을 지정하는 언어가 바로 정적 바인딩 언어인 것이다.

 

C, C++, 오브젝티브-C, 자바는 정적 바인딩(Static Binding)을 채용하고 있는 언어이고,

파이썬 자바스크립트는 동적 바인딩(Dynamic Binding)을 채용하고 있는 언어이다.

 

🔍 Swift는 동적일까? 정적일까?

결론부터 말하자면 swift 언어는 기본적으로 정적 바인딩 언어이다.

데이터 타입 추론 기능에 의해 컴파일러가 알아서 변수와 상수의 타입을 결정하듯이

다형서으 프로토콜, 클래스 상속을 통해 동적 바인딩도 지원한다

 

➡️ Swift에서의 바인딩 결정 방식

코드 패턴 바인딩 종류
let dog = Dog() -> dog.speak 정적 바인딩
let animal: Animal = Dog() -> animal.speak() 동적 바인딩
final 메서드 또는 클래스 무조건 정적 바인딩
프로토콜 메서드 호출 동적 바인딩 (기본적으로)

 

 

이제 동적 바인딩과 정적 바인딩의 차이에 대해 자세히 알아보자


📘 정적 바인딩(Static Binding)

🔹정의

컴파일 타임에 어떤 메서드가 호출될지 결정됨컴파일러가 타입을 알고 있기 때문에 호출 대상을 미리 고정함

 

🔹특징

빠름 (런타임 오버헤드 없음)

오버라이딩에 영향 없음

일반적으로 함수 오버로딩, 정적 메서드, final 클래스 / 메서드 등이 이에 해당

 

🔹예시

class Animal {
	func speak() {
    	print("animal sound")
    }
}

let a = Animal()
a.speak() // 컴파일 타임에 Animal의 speak()로 바인딩됨

📘 동적 바인딩(Dynamic Binding)

 

🔹정의

런타임에 실제 객체의 타입을 확인하고 어떤 메서드를 실행할지 결정됨

주로 상속, 오버라이딩, 프로토콜 기반 호출에서 사용됨

 

🔹특징

유연함 (다형성 지원)

오버라이딩 가능

성능은 약간 떨어지지만 확장성과 유지보수에 유리

 

🔹예시

class Animal {
	func speak() {
    	print("Animal sound")
    }
}

class Dog: Animal {
	override func speak() {
    	print("Bark!")
    }
}

let animal: Animal = Dog() 	//타입은 Animal이지만 인스턴스는 Dog
animal.speak()				// "Bark!" - 런타임에 Dog의 speak()로 바인딩됨

🔍 정리

구분 정적 바인딩 동적 바인딩
바인딩 시점 컴파일 타임 런타임
속도 빠름 상대적으로 느림
유연성 낮음 높음 (다형성 지원)
예시 함수 오버로딩, static 메서드 메서드 오버라이딩, 프로토콜 호출
키워드 영향 final, staic은 정적 바인딩을 강제함 override, 프로토콜 기반 호출은 동적 바인딩

 

Comments