래퍼 라이브러리

위키백과, 우리 모두의 백과사전.
둘러보기로 가기 검색하러 가기

라이브러리는 소프트웨어를 개발하는데 사용되는 서브루틴이나 클래스들의 모음이다. 라이브러리는 라이브러리의 클라이언트가 라이브러리 루틴들을 실행하는데 사용할 수 있게 하는 인터페이스들을 노출한다. 래퍼 라이브러리(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 라이브러리 함수들로 표출된다. 이 문제를 풀기 위해 자바는 이러한 시스템 호출들을 자바 애플리케이션에서 호출할 수 있게 래퍼 라이브러리들을 구현하였다.

이 목적을 위해 자바 같은 언어들은 외부 함수 인터페이스라고 불리는 메커니즘을 제공한다. 이러한 예시는 다음과 같다:

존재하는 래퍼 라이브러리들[편집]

현존하는 래퍼 라이브러리들의 예:

같이 보기[편집]