아요 개발 일기

[Swift] Static(정적) & Dynamic(동적) 본문

Swift/Grammar

[Swift] Static(정적) & Dynamic(동적)

소진이 2023. 1. 16. 10:34

안녕하세요! 소진입니다 :)

오늘은 정적 바인딩(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