안녕하세요! 소진입니다 :)
오늘은 정적 바인딩(Static binding)과 동적 바인딩(Dynamic binding)에 대해 알아보겠습니다!
binding (바인딩)?
- 프로그램 구성 요소의 성격을 결정 ex) 변수의 데이터 타입이 정해지는 것
- 함수 주소를 찾아가는 과정
두 가지가 있군요!
먼저 프로그램 구성 요소의 성격을 결정하는 바인딩에 대해서 알아보기전에,
정적, 동적 타입에 대해서 알아야하기때문에! 알아보고 가겠습니당 ㅎㅎ
정적 타입 (Static Type)
- 컴파일 시에 타입이 결정
- 변수를 선언할 때, 반드시 앞에 타입을 명시해야 하는 언어들은 모두 정적 타입 시스템에 속합니다.
ex ) C, C++, Java, Swift ...
장점
- . 컴파일 시에 타입에 대한 정보를 결정하기 때문에 속도↑ (효율성↑)
- . 타입 에러로 인한 문제점을 초기에 발견할 수 있어 타입의 안정성↑
단점
- 컴파일시 결정이되고, 그 이후 변경이 불가능합니다.
동적 타입 (Dynamic Type)
- 런타임 시에 타입이 결정
- 코드를 작성할 때, 변수 타입을 명시하지 않고 런타임에 변수의 값에 따라 타입이 결정되는 시스템.
ex ) Python, Ruby, SmallTalk ...
장점
- 유연성 (혹은 적응성) : 런타임까지 타입에 대한 결정을 끌고 갈 수 있기 때문에 많은 선택의 여지가 있음
단점
- 안정성 저하 : 인터프리터 언어는 배우기는 쉬우나 실행 도중에 변수에 예상치 못한 타입이 들어와 Type Error 를 뿜는 경우가 생긴다. 그러니 너무 편리함에만 의존하면 안정성 저하를 유발할 수 있습니다.
Function binding (함수 바인딩)
함수를 만들어 컴파일을 하면, 각 코드가 메모리 어딘가에 저장됩니다.
그럼 함수를 호출하는 부분에는 그 함수가 저장된 메모리 번지 즉, 주소값이 저장이 되겠죠?
프로그램 실행 → 함수 호출 → 함수가 저장된 주소로 점프 → 함수 실행 → 원래 위치
위 과정에서 함수를 호출하는 부분에 함수가 위치한 메모리 번지로 연결시켜주는 것을 바인딩이라고 합니다.
쉽게 말해, 함수의 호출부와 정의부를 연결시켜주는 것이 바인딩이라고 할 수 있습니다.
Function binding 방법
✔️ Static binding (일반 함수)
컴파일 시간에 호출될 함수로 점프할 주소가 결정되어 바인딩 되는 것을 말합니다.
✔️ Dynamic binding (가상 함수)
실행 파일을 만들 때 바인딩 되지 않고 보류 상태 둡니다.
점프할 메모리 번지를 저장하기 위한 메모리 공간(4 byte)을 가지고 있다가 런타임에 결정됩니다.
단점
- 타입 체킹으로 인한 수행 속도 저하
- 메모리 공간 낭비 (가급적 정적 바인딩 사용)
Q. 2 가지의 단점이 있음에도 불구하고 동적 바인딩을 하는 이유
A. 어떤 포인터에 의해 접근되었는지에 상관없이 참조된 인스턴스의 실제 클래스형에 따라 재정의된 함수 호출이 가능
Type System 에 따른 상속의 의미 차이
객체지향에서 중요한 개념 중에 하나가 다형성(Polymorphism) 이고,
일반적으로 다형성은 함수의 오버라이딩, 즉 동적 바인딩에 의한 것입니다.
✔️ Static Type (정적 타입) 의 상속
: 코드 재사용 + 타입의 호환성 유지 를 목적으로 합니다.
컴파일 시에 상속의 관계를 파악하여 상속관계에 있는 객체들 간의 타입 호환성을 유지합니다.
타입은 컴파일 시에 결정되나 메소드 호출 시에 값에 따라 그 객체의 메소드를 호출하게 됩니다.
이와 같은 방법으로 동적 바인딩에 대한 문제를 해결할 수 있습니다.
✔️ Dynamic Type (동적 타입) 의 상속
: 코드 재사용 을 목적으로 합니다.
타입 속성에 따라 메소드의 형태만 같으면 동적 바인딩을 유도할 수 있습니다.
상속을 한다고 예시를 들면,
정적 타입의 경우 :
컴파일 시에 a 객체의 타입에 호환될 수 있는 타입을 결정하고,
런타임 시에 객체의 값에 따른 호환성 있는 객체의 메소드를 호출합니다.
--> 즉, 상위 클래스의 코드 재사용과 동시에 타입의 호환성을 유지하는 목적을 가집니다.
동적 타입의 경우 :
동적 타입 시스템에 의해 동적 바인딩이 자동적으로 유도되어 단지 상위 클래스의 코드를 상속받는 의미가 전부입니다.
바인딩 부분을 간단하게 정리해보겠습니다!
종류 | 정적 바인딩(Static bindin) | 동적 바인딩(Dynamic binding) |
정의 | 컴파일(Compile) 시간에 타입 결정 | 실행 시간(runtime) 즉, 파일을 실행하는 시점에 성격이 결정 |
예시 | C, C++, Java | Python |
장단점 | 컴파일 시간에 많은 정보가 결정되므로 실행 효율 높음 | 런타임에 자유롭게 타입이 바뀌므로 적응성 높음 |
참고 블로그 : https://secretroute.tistory.com/entry/140819 [Empty]
'Swift > Grammar' 카테고리의 다른 글
[Swift] Property (0) | 2023.01.27 |
---|---|
[Swift] Function (함수) (0) | 2023.01.16 |
[Swift] Closures (클로저) (0) | 2022.12.30 |
[Swift] 구조체(Struct), 클래스(Class), 열거형(Enum) (0) | 2022.12.30 |
[Swift] guard(feat. if문) & assert (0) | 2022.12.30 |