글
* Binding
- 프로그램 구성 요소의 성격을 결정해주는 것
ex ) 변수의 데이터 타입이 무엇인지 정해지는 것
종류 | 정적 바인딩(Static binding) |
동적 바인딩(Dynamic binding) |
정의 | 컴파일 시간에 성격이 결정되는 것 |
실행 시간(runtime)에 성격이 결정되는 것 |
예시 | C언어 컴파일 시간에 변수의 데이터 타입이 결정 | Python(Interpreter 언어) 런타임에 값에 따라 변수의 데이터 타입이 결정 |
장단점 | 컴파일 시간에 많은 정보가 결정되므로 실행 효율↑ | 런타임에 자유롭게 성격이 바뀌므로 적응성↑ |
* 함수의 바인딩
- 함수를 만들어 컴파일을 하면 각각의 코드가 메모리 어딘가에 저장된다.
그리고 함수를 호출하는 부분에는 그 함수가 저장된 메모리 번지수(주소값)이 저장된다.
프로그램 실행 → 함수 호출 → 함수가 저장된 주소로 점프 → 함수 실행 → 원래 위치
위 과정에서 함수를 호출하는 부분에 함수가 위치한 메모리 번지로 연결시켜 주는 것을 바인딩(Binding) 이라고 한다.
- 함수를 바인딩하는 2가지 방법
(1) 정적 바인딩 (일반 함수)
컴파일 시간에 호출될 함수로 점프할 주소가 결정되어 바인딩 되는 것.
(2) 동적 바인딩 (가상 함수)
실행 파일을 만들 때 바인딩 되지 않고 보류 상태 둔다.
점프할 메모리 번지를 저장하기 위한 메모리 공간(4 byte)을 가지고 있다가 런타임에 결정.
=> 단점 : 타입 체킹으로 인한 수행 속도 저하 / 메모리 공간 낭비
=> 가급적 정적 바인딩 사용
?? 2 가지의 단점이 있음에도 불구하고 동적 바인딩을 하는 이유 ??
- 어떤 포인터에 의해 접근되었는 지에 상관없이 참조된 인스턴스의 실제 클래스형에 따라 재정의된 함수 호출이 가능!
이 포스팅의 원본 출처이자 C++ 에서
Template, 정적 바인딩 vs. Virtual Function, 동적 바인딩 으로 실험한 결과를 볼 수 있는 블로그 :
위 출처에서 정적 바인딩이 항상 동적 바인딩 보다 빠르다고 할 수 없다는 결과를 볼 수 있다.
* 프로그래밍 언어에서의 2가지 Type System
(1) 정적 타입 (Static Type)
- 컴파일 시에 타입이 결정
- 변수를 선언할 때, 반드시 앞에 타입을 명시해야 하는 언어들은 모두 정적 타입 시스템에 속한다.
ex ) C, C++, Java ...
- 결국 장점에 대해 언급을 하자면,
. 컴파일 시에 타입에 대한 정보를 결정하기 때문에 속도↑ (효율성↑)
. 타입 에러로 인한 문제점을 초기에 발견할 수 있어 타입의 안정성↑
(2) 동적 타입 (Dynamic Type)
- 런타임 시에 타입이 결정
- 코드를 작성할 때, 변수 타입을 명시하지 않고 런타임에 변수의 값에 따라 타입이 결정되는 시스템.
ex ) Python, Ruby, SmallTalk ...
- 장점 : 유연성 (혹은 적응성)
런타임까지 타입에 대한 결정을 끌고 갈 수 있기 때문에 많은 선택의 여지가 있다.
- 단점 : 안정성
인터프리터 언어는 배우기는 쉬우나 실행 도중에 변수에 예상치 못한 타입이 들어와 Type Error 를 뿜는 경우가 생긴다.
그러니 너무 편리함에만 의존하면 안정성 저하를 유발할 수 있다.
* Type System 에 따른 상속의 의미 차이
객체지향에서 중요한 개념 중에 하나가 다형성(Polymorphism) 이고,
일반적으로 다형성은 함수의 오버라이딩, 즉 동적 바인딩에 의한 것이다.
(1) 정적 타입(Static Type) 의 상속
: 코드 재사용 + 타입의 호환성 유지 를 목적으로 한다.
- 컴파일 시에 상속의 관계를 파악하여 상속관계에 있는 객체들 간의 타입 호환성을 유지해
타입은 컴파일 시에 결정되나 메소드 호출 시에 값에 따라 그 객체의 메소드를 호출하게 된다.
이와 같은 방법으로 동적 바인딩에 대한 문제를 해결했다고 할 수 있다.
(2) 동적 타입(Dynamic Type) 의 상속
: 코드 재사용 을 목적으로 한다.
- 타입 속성에 따라 메소드의 형태만 같으면 동적 바인딩을 유도할 수 있다.
간단하게 예시를 보면,
a.call();
정적 타입의 경우 :
컴파일 시에 a 객체의 타입에 호환될 수 있는 타입을 결정하고,
런타임 시에 객체의 값에 따른 호환성 있는 객체의 메소드를 호출한다.
=> 즉, 상위 클래스의 코드 재사용과 동시에 타입의 호환성을 유지하는 목적을 가진다.
동적 타입의 경우 :
동적 타입 시스템에 의해 동적 바인딩이 자동적으로 유도되어 단지 상위 클래스의 코드를 상속받는 의미가 전부다.
바인딩이 일어나는 타이밍에 관련 포스팅 :
http://destiny738.tistory.com/178
휴.. 팔수록 어렵다 ㅠ_ㅠ
'Programming > C++' 카테고리의 다른 글
dynamic_cast 연산자 (0) | 2014.10.26 |
---|---|
.h 컴파일 : #ifndef vs. #pragma once (0) | 2014.08.25 |
RECENT COMMENT