래퍼 클래스 란 무엇입니까?


답변:


171

일반적으로 래퍼 클래스는 다른 클래스 나 구성 요소의 기능을 "랩핑"또는 "캡슐화"하는 클래스입니다. 이것들은 기본 클래스 또는 구성 요소의 구현에서 추상화 수준을 제공함으로써 유용합니다. 예를 들어 COM 구성 요소를 래핑하는 래퍼 클래스는 호출 코드를 방해하지 않고 COM 구성 요소를 호출하는 프로세스를 관리 할 수 ​​있습니다. 또한 관련된 인터페이스 포인트 수를 줄여 기본 개체의 사용을 단순화 할 수 있습니다. 이로 인해 기본 구성 요소를보다 안전하게 사용할 수 있습니다.


15
랩퍼 클래스 (어댑터로서)는 랩퍼가 특정 인터페이스를 존중해야하고 다형성 동작을 지원해야 할 때 사용됩니다. 반면, 파사드는 더 쉽고 간단한 인터페이스를 원할 때 사용됩니다.
Yadu

3
이 게시물에서는, 래퍼 늦은 바인딩 클래스에 대해 엄격하게 정의 된 프록시를 만드는 데 도움이 될 수 있다고 제안 : 수 있습니까 후기 바인딩을 사용 ... . 이것은 Paul Sonier가 위에서 설명한 것 이외의 래퍼에 추가로 유효합니까?
Todd

1
@NirajanSingh Wrapper는 기존의 두 인터페이스를 재사용하고 하나의 인터페이스를 작동시킵니다. 반면에 facade는 새로운 인터페이스를 만듭니다.
Alireza

67

간단하게 또는 다른 API로 다른 클래스 또는 API의 기능을 "랩핑"하는 클래스입니다.

참조 : 어댑터 패턴 , 외관 패턴


예! Facade 패턴의 동의어 인 경우가 많습니다. 많은 코드 문서에서 필자는 "Wrapper to XX :: yy method"또는 "Wrapper to XX :: yy method with exception handling"과 같은 작은 Facade 메서드를 볼 수 있습니다.
피터 크라우스

41

랩퍼 클래스는 기본 유형을 오브젝트로 사용하는 방법을 제공합니다. 각 프리미티브마다 다음과 같은 래퍼 클래스가 있습니다.

int Integer
byte Byte 

정수 및 바이트는 기본 int 및 바이트의 래퍼 클래스입니다. 래퍼 클래스가 boxing / unboxing이라는 메커니즘을 제공하도록 프리미티브를 오브젝트로 사용해야하는 경우 시간 / 제한이 있습니다.

다음 예제에서는 개념을 다음과 같이 잘 이해할 수 있습니다.

double d = 135.0 d;
Double doubleWrapper = new Double(d);

int integerValue = doubleWrapper.intValue();
byte byteValue = doubleWrapper.byteValue();
string stringValue = doubleWrapper.stringValue();

이것이 래퍼 클래스 타입을 사용하여 다른 프리미티브 타입으로 변환 할 수있는 방법입니다. 이 유형의 변환은 기본 유형을 객체로 변환하고이를 사용하여 다른 기본 유형을 가져와야하는 경우에 사용됩니다.이 방법을 사용하려면 큰 코드를 작성해야합니다. 그러나 간단한 코드 작성 기술을 사용하면 다음과 같이 코드 스 니펫을 얻을 수 있습니다.

double d = 135.0;
int integerValue = (int) d ;

double 값은 명시 적으로 정수 값으로 변환되지만 다운 캐스팅이라고도합니다.


1
귀하의 대답은 래퍼 클래스가 기본 객체 전용임을 의미합니다.

17

랩퍼 클래스가 반드시 다른 클래스를 랩핑 할 필요는 없습니다. dll 파일과 같은 API 클래스 래핑 기능 일 수 있습니다.

예를 들어 dll 래퍼 클래스를 생성하면 모든 dll 초기화 및 정리를 처리하고 예를 들어 생성 된 함수 포인터를 래핑하는 클래스 메서드를 만드는 것이 매우 유용 할 수 있습니다 GetProcAddress().

건배!


8

랩퍼 클래스는 이름과 같이 다른 것을 둘러싼 클래스입니다.

보다 공식적인 정의는 Adapter Pattern 을 구현하는 클래스입니다 . 이를 통해 하나의 API 세트를보다 유용하고 읽기 쉬운 형식으로 수정할 수 있습니다. 예를 들어 C #에서 네이티브 Windows API를 사용하려면 .NET 디자인 지침을 준수하는 클래스로 래핑하는 것이 좋습니다.


2
어댑터 패턴을 이해하면 래퍼와 다릅니다 .X가 Y를 래핑하면 X 는 Y 의 상태 를 캡슐화해야 하지만 ID는 아닙니다 . X의 두 인스턴스가 모두 Y를 래핑하는 경우 X의 두 인스턴스가 모두 동일한 Y의 인스턴스를 래핑한다는 것을 증명할 수있는 수단이 없어야합니다 . 반면에 어댑터 오브젝트는 종종 ID를 캡슐화하지만 상태는 캡슐화하지 않습니다. 조정중인 오브젝트의 변경은 어댑터 자체의 변경으로 간주되지 않습니다.
supercat


7

또한 일부 환경에서는 래퍼 클래스가 수행 할 수있는 많은 작업이 측면으로 대체되고 있다는 점에 유의해야합니다.

편집하다:

일반적으로 랩퍼는 랩핑 구현에 대해 걱정하지 않고 랩핑이 수행하는 기능을 확장합니다. 일반적인 예는 해당 인터페이스의 모든 구현에 추가하는 것이 아니라 다른 서비스 인터페이스 주위에 타이밍 정보 또는 로깅 기능을 추가하는 것입니다.

그런 다음 이것은 Aspect 프로그래밍의 전형적인 예입니다. 기능별 인터페이스 기능을 사용하고 상용구 로깅을 추가하는 대신, 측면 프로그래밍에서는 메소드에 대한 정규식의 일종 인 포인트 컷을 정의한 다음 일치하는 모든 메소드 전후에 실행하려는 메소드를 선언합니다. 포인트 컷. 어 스펙트 프로그래밍은 데코레이터 패턴을 사용하는 일종의 래퍼 클래스도 사용할 수 있지만 두 기술 모두 다른 용도로 사용된다고 말할 수 있습니다.


7

래퍼 클래스는 다른 클래스를 래핑하고 클라이언트와 래핑되는 원래 클래스 사이의 추상화를 제공하는 클래스입니다.


5

랩퍼 클래스는 일반적으로 전용 속성으로 객체를 갖는 클래스입니다. 랩퍼는 해당 개인용 객체의 API를 구현하므로 개인용 객체의 인수로 전달 될 수 있습니다.

컬렉션이 있고 개체가 추가 될 때 일종의 변환을 사용하려고한다고 가정합니다. 컬렉션의 모든 메서드가 포함 된 래퍼 클래스를 작성합니다. add ()가 호출되면 랩퍼는 인수를 개인 콜렉션으로 전달하는 대신 인수를 변환합니다.

랩퍼는 콜렉션이 사용될 수있는 어느 곳에서나 사용될 수 있으며, 개인용 오브젝트는 여전히이를 참조하고 읽는 다른 오브젝트를 가질 수 있습니다.


1
동의합니다. 래퍼에 대한 개인적인 견해 는 원래 유형처럼 보이고 느껴 지며 동일한 인터페이스를 구현하고 래핑 된 인스턴스의 상태를 확실하게 유지할 수 있다는 입니다. 멤버 호출을 "차단"하는 방법으로 존재합니다.
Luke Puplett

3

랩퍼 클래스는 다른 클래스를 랩핑하여 클라이언트와 랩핑되는 원래 클래스 사이에 간접 및 추상화 계층을 추가하는 데 사용되는 클래스입니다.


3

랩퍼 클래스는 기본 데이터 유형을 둘러싼 랩퍼입니다. 해당 클래스 인스턴스에서 기본 데이터 유형을 나타냅니다. 예를 들어 부울 데이터 유형은 부울 클래스 인스턴스로 표시 될 수 있습니다. Java의 모든 기본 래퍼 클래스는 변경할 수 없습니다. 즉, 래퍼 클래스 인스턴스에 값을 할당 한 후에는 더 이상 변경할 수 없습니다.


3

Java 프로그래밍은 각 기본 데이터 유형에 대해 랩퍼 클래스를 제공하여 기본 데이터 유형을 랩퍼 클래스의 오브젝트로 변환합니다.


1

래퍼 클래스를 잘 만드는 것은 쉬운 일이 아닙니다. 래퍼 클래스를 이해하는 것은 다른 사람들이 어떻게 디자인 했는지도 쉬운 일이 아닙니다. 코드가 아니라 아이디어이기 때문입니다. 아이디어를 이해할 때만 랩퍼를 이해할 수 있습니다.


0

래퍼 클래스는 프로그래머의 기본적인 요구를 충족시키기 위해 존재했습니다. 즉, Objects 만 허용되는 경우 기본 값을 사용합니다. 이름에서 알 수 있듯이 래퍼 클래스는 프리미티브 값을 감싸고 Object에 값을 보유합니다. 따라서 generics, hashmap-keys, Arraylists 등과 같은 프리미티브가 허용되지 않는 모든 위치에서 프로그래머는 이제 이러한 프리미티브 값을 해당 래퍼 유형으로 제공 할 수 있습니다.

또한 이러한 랩퍼 유형에는 기본 유형에서 해당 랩퍼 유형으로 또는 그 반대로 변환하고 문자열에서 랩퍼 유형으로 변환하는 많은 유틸리티 메소드가 있습니다.

- 나는 깊이 래퍼 유형의 개념을 설명하는 내 블로그에 래퍼 클래스에 대한 자세한 기사를 작성했습니다 http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (공개 - 이 블로그는 내 소유입니다.)


0

나는 현재 내 프로젝트와 내가 얻는 주요 이점 (주제 설명을 넓히기위한 단 하나의 이점)에 래퍼 클래스를 사용했습니다.

예외 처리 : 다른 클래스가 래핑하는 주 클래스에는 예외가 발생하면 예외를 던지는 메소드가 있으므로 예외를 처리하고 즉시 기록하는 래퍼 클래스를 만들었습니다. 따라서 내 주요 범위에는 예외 처리가 없습니다. 방금 메서드를 호출하고 무언가를합니다.

쉬운 사용법 : 객체를 쉽게 시작할 수 있습니다. 일반적으로 시작 단계는 많은 단계로 구성됩니다.

코드 가독성 : 다른 프로그래머가 내 코드를 열면 코드가 매우 명확하고 조작하기 쉽습니다.

세부 사항 숨기기 : 다른 프로그래머가 사용할 클래스를 생성하는 경우, 프로그래머가 처리 할 필요가 없도록 "오류 처리, 예외 처리, 메시지 로깅 등"과 같은 세부 사항을 랩핑 할 수 있습니다. 혼돈은 단순히 방법을 사용합니다.


0

랩퍼 클래스는 무언가를 잡고 기능을 추가하는 유일한 목적을 제공하는 클래스입니다. Java에서는 기본 요소 (int, float, chars와 같은)가 객체가 아니기 때문에 객체를 처리하려면 래퍼 클래스를 사용해야합니다. int의 Vector를 만들고 싶다고 가정 해 봅시다. 문제는 Vector가 프리미티브가 아닌 오브젝트 만 보유한다는 것입니다. 그래서 당신이 할 일은 모든 정수를 정수 래퍼에 넣고 그것을 사용하는 것입니다. 예:

int number = 5;
Integer numberWrapped = new Integer(number);
//now you have the int in an object.
//and this is how to access the int value that is being wrapped.
int again = numberWrapped.intValue();

이것을 랩핑이 아닌 복싱 프리미티브라고합니다.
cyborg

-8

래퍼는 서로 다른 플랫폼 사이에서 서로 다른 두 응용 프로그램간에 통신하는 데 사용되는 클래스입니다.



1
실제로 이것은 하나의 작은 사용 사례 일뿐입니다.
praseodym 2011

나는 이것이 웹 서비스의 정의라고 생각한다
Bahadir Tasdemir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.