본문 바로가기

Programming/용어정리

정적 vs 동적 라이브러리 말글로 풀어서 쉽게 설명!!

글을 읽기 전 알아야 할 사전지식 : https://cuffyluv.tistory.com/23

 
라이브러리는, 실행에 필요한 모듈(c 기준 주로 함수, 이하 글에서도 모듈' 대신 '함수' 용어 사용)들을 따로 파일로 모아서 효과적으로 함수 및 프로젝트를 관리할 수 있도록 한 것이다. 이미 기계어로 컴파일 된 상태이기 때문에, 컴파일 과정이 생략되며 또한 실제 사용할 함수만 쓸 수 있어서 효율적이다.

정적 라이브러리와 동적 라이브러리

 
목적 프로그램들이 링크되어 실행 파일을 만들 때, 해당 프로그램에서 실제로 사용하는 라이브러리 함수들의 기계어 코드가 라이브러리 파일에서 실행 파일로 복사되는 경우, 해당 라이브러리를 '정적 라이브러리' 라고 한다.
 
이는 실행 파일 제작 시 필요한 라이브러리 함수들을 모두 복사했기 때문에 실핼 시 별도의 라이브러리 파일이 필요가 없다. 하지만 실행 파일 안에 복사된 라이브러리 코드가 실제로 저장되기 때문에, 프로그램 크기가 커진다. 
 
 
이에 반해, 링크 과정까지는 그 기계어 코드가 실행 파일에 포함되거나 하지는 않지만, 그 중에 해당 라이브러리 내 실제 사용할 함수들에 대한 주소만을 가지고 있다가 실행 파일이 실행될 때 해당 라이브러리 내 함수의 주소로 가서 실제 사용할 것들에 대한 기계어 코드를 복사해 오는 경우, 이는 '동적 라이브러리'에 해당한다.
 
이는 실행 파일 제작 시에 해당 함수들이 포함되지는 않기에 프로그램 크기가 작아지는 장점이 있다.
 
 
동적 라이브러리는 메모리 주소에 가서 내용을 복사해오는 과정이 필요하기에, 실행 속도가 정적 라이브러리에 비해 비교적 느리다.
그러나, 만약 라이브러리 내에 함수를 수정해야 한다면(ex. release new library version ) 정적 라이브러리의 경우는 이미 실행 파일에 기계어 코드로 함수들이 복사되어있기에 라이브러리 수정 뿐만 아니라 해당 실행파일까지 다시 링크해야한다는 단점이 있다. 이에 비해 동적 라이브러리를 사용했다면, 실행 파일에는 해당 라이브러리 내 함수들의 주솟값만 복사되어 있을 뿐이기에, 자동으로 수정 된 버전의 라이브러리를 사용해주니 다시 링크 할 필요가 없는 것이다. 
 
하지만 반대로 생각해본다면 나중에 해당 라이브러리가 제거된다고 하더라도, 동적 라이브러리였다면 해당 메모리 주소에서 코드를 가져올 수가 없어 실행 파일의 실행에 문제가 생길 수 있으나
정적 라이브러리를 사용한다면 이미 해당 라이브러리에서 필요한 함수 내용은 다 쏙쏙 복사해놓았기 때문에 라이브러리가 삭제되어도 문제없이 실행할 수 있는 것이다!
 
 
 
우리가 컴파일러로 기본적인 프로젝트를 만들고 실행 파일을 배포할 때, 또는 이론적으로 '라이브러리'에 대해 배울 때는 이 정적 라이브러리를 배운다고 보면 된다(실제 필자가 본 전공 기본서들도 라이브러리에 대한 이론을 정적 라이브러리로 가정한 후 설명했다).
 
일반적으로 C 표준 라이브러리 내 함수들(printf, scanf 같은 기본적인 함수들부터 다양한 함수들까지)은 정적 라이브러리 형태로 사용되고, (일부 함수들은 동적으로 사용되기도 한다고 함!! 해당 예시에 대해선 필요하면 공부 필요. 그러나 지금 단계에선 대부분 정적이라고 생각하자.) 
있다고 한다.
 
 
 
 
 


다음 용어정리 글에서는 동적 라이브러리와 혼동되는 개념, '런타임 라이브러리'에 대해 소개하겠다.