래퍼 라이브러리

라이브러리는 소프트웨어를 개발하는데 사용되는 서브루틴이나 클래스들의 모음이다. 라이브러리는 라이브러리의 클라이언트가 라이브러리 루틴들을 실행하는데 사용할 수 있게 하는 인터페이스들을 노출한다. 래퍼 라이브러리(Wrapper library)는 라이브러리의 현재 인터페이스를 호환되는 인터페이스로 변환하는 코드의 얇은 층(심)으로 이루어져 있다. 이것은 여러 이유들로 인한 것이다:
 엉성하게 설계되었거나 복잡한 인터페이스를 정제하기 위해.
 대립되는 데이터 포맷 같이 같이 동작할 수 없는 코드를 동작하게 하기 위해.
 크로스 랭귀지 또는 런타임 상호운용성을 활성화하기 위해.
래퍼 라이브러리들은 어댑터, 퍼사드 등을 사용해서 구현된다.

 구조와 구현 
래퍼 라이브러리가 구현되는 구체적인 방식은 쓰인 환경이나 의도하는 주소에 따라 매우 다르다. 이것은 특히 크로스 랭귀지/런타임 상호운용성이 고려될 때 더 그렇다.

 예시 
다음은 일반적인 래퍼 라이브러리 구현을 보여준다. 이 예시에서 C++ 인터페이스는 C 언어 인터페이스를 감싸는 "래퍼"로서 동작한다.

 C 인터페이스 
int pthread_mutex_init(pthread_mutex_t * mutex , pthread_mutexattr_t * attr);
int pthread_mutex_destroy (pthread_mutex_t * mutex);
int pthread_mutex_lock (pthread_mutex_t * mutex );
int pthread_mutex_unlock (pthread_mutex_t * mutex );

 C++ 래퍼 
class Mutex
{
     pthread_mutex_t mutex;

public:

     Mutex()
     {
          pthread_mutex_init(&mutex, 0);
     }

     ~Mutex()
     {
          pthread_mutex_destroy(&mutex);
     }

private:

     friend class Lock;

     void lock()
     {
          pthread_mutex_lock(&mutex);
     }

     void unlock()
     {
          pthread_mutex_unlock(&mutex);
     }
};

class Lock
{
      Mutex& mutex;
public:
      Lock(Mutex& mutex):mutex(mutex){mutex.lock();}
      ~Lock(){mutex.unlock();}
};원래 C-인터페이스는 특히 라이브러리의 사용자가 이미 락된 뮤텍스를 언락하는 것을 잊을 때 오류를 유발한다. 새로운 인터페이스는 새로운 Mutex와 Lock 클래스에서 Mutex가 결국 언락되고 pthread_mutext_t 객체가 자동으로 릴리스된다는 것을 보장하기 위해 효과적으로 RAII를 활용한다.

위의 코드는 boost::thread 라이브러리의 한 부분인 boost::scoped_lock 과 boost::mutex 의 구현을 거의 흉내낸 것이다.

 드라이버 래퍼 

 크로스-랭귀지/런타임 상호운용성 
몇몇 래퍼 라이브러리들은 클라이언트 애플리케이션과 호환되지 않은 기술을 사용해 쓰여진 라이브러리 사이의 브리지 역할을 위해 존재한다. 예를 들면 자바 애플리케이션은 시스템 호출을 실행할 필요가 있을 것이다. 그러나 시스템 호출은 일반적으로 C 라이브러리 함수들로 표출된다. 이 문제를 풀기 위해 자바는 이러한 시스템 호출들을 자바 애플리케이션에서 호출할 수 있게 래퍼 라이브러리들을 구현하였다.

이 목적을 위해 자바 같은 언어들은 외부 함수 인터페이스라고 불리는 메커니즘을 제공한다. 이러한 예시는 다음과 같다:
 자바 네이티브 인터페이스 (JNI)
 자바 네이티브 액세스 (JNA)
 파이썬을 위한 외부 함수 라이브러리
 SWIG (단순화된 래퍼와 인터페이스 생성기)

 존재하는 래퍼 라이브러리들 
현존하는 래퍼 라이브러리들의 예:
 WIN32를 위한 Pthreads
 파이썬을 위한 OpenGL 바인딩
 MySQL++
 JavaCV

 같이 보기 
 래퍼 함수

분류:라이브러리