Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- list
- error
- mvvm
- Git
- Animation
- SWIFT
- NotificationCenter
- uikit
- Refresh
- array
- IOS
- Switch
- 글또
- struct
- ScrollView
- apns
- protocol
- Observer
- PushNotification
- segue
- 고차함수
- SWIFTUI
- http
- viewlifecycle
- class
- 화면전환
- escaping
- calendar
- self
- singleton
Archives
- Today
- Total
seong_hye, the developer
동적 바인딩 vs 정적 바인딩에 대해 알아보기 본문
컴퓨터 언어를 여러가지 접하다 보면 항상 헷갈리는 부분이 있었다.
'이 언어가 변수 선언할 때 앞에 타입을 써줬었나 아니였나' 하는 부분이다.
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, 프로토콜 기반 호출은 동적 바인딩 |
'Infomation' 카테고리의 다른 글
유데미) Git 완벽 이해하기 (0) | 2024.05.12 |
---|---|
코드 작성 시 다양한 표기법 (Code Naming) (0) | 2023.02.07 |
Fatal error: Unexpectedly found nil while unwrapping an Optional value (0) | 2022.11.25 |
github과 연동하기 (0) | 2022.11.21 |
MackBook 단축키 모음 (0) | 2022.11.05 |
Comments