본문 바로가기

개발 언어 및 알고리즘 기초/JAVA 기초

[Java] Wrapper Class (래퍼 클래스, 포장 클래스)

자바 공부 중 Wrapper Class에 대한 내용이 헷갈려 정리한 것에 대한 기록이다. 아래 책을 공부 중이다.

신용권, 임경균, 『이것이 자바다』, 한빛미디어(2023), p120-121.

 

 

참고한 블로그 글들이다.

https://medium.com/@s23051/%EB%9E%98%ED%8D%BC-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%9E%80-wrapper-class-cc5aa6f7cdd1

 

래퍼 클래스란(Wrapper Class)?

자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어집니다. 대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고 참조 타입은 class…

medium.com

https://velog.io/@ksh9409255/%EB%9E%98%ED%8D%BCwrapper-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%B4...%EC%9E%91%EC%84%B1%EC%A4%91

 

래퍼(wrapper) 클래스에 대해...

자료형이란 데이터 타입(type)을 의미하며, 프로그래밍 언어에서는 여러 종류의 데이터를 식별하는 분류를 의미한다.자바에서 제공하는 자료형은 크게 2가지로 분류할 수 있다.1\. 기본 자료형2\.

velog.io

https://velog.io/@dmchoi224/Wrapper-%ED%81%B4%EB%9E%98%EC%8A%A4

 

Wrapper 클래스 , 빠른for문, 제네릭(Generic), 싱글톤 패턴

Wrapper 클래스 큼직한 걸로 작은 걸 감싼다 > 기본형 타입을 객체화 하도록 도와주는 클래스 클래스 타입 -> Wrapper 클래스 > Wrapper 클래스 > 기본형 타입 : 박싱(Boxing) Wrapper 클래스 int Double > double

velog.io

 

 

 Wrapper Class란 

 Wrapper class는 기본 타입을 객체로 다루기 위해서 사용하는 클래스이다.

 이를 이해하기 위해서는 먼저 기본 타입(primitive type)과 참조 타입(reference type)에 대한 이해가 있어야 한다. 기본 타입은 char, int, float, double, boolean 등의 우리가 아는 일반적인 타입이다. 참조 타입은 class, interface 등의 타입이다. 기본 타입을 가진 값들을 참조 타입 객체로 표현하기 위해서 사용되는 것이 Wrapper class이다. 

 이렇게 기본 타입에서 객체 형태로 만들게 되면 불변성을 가지게 되어 wrapper 클래스 안에 객체의 값은 변경이 불가능하다. 

 

 Wrapper 객체를 생성하기 위한 클래스는 java.lang 패키지에 포함되어 있고, char과 int를 제외하고는 기본 타입의 첫 문자를 대문자로 바꾼 이름을 가지고 있다. 

기본 타입 포장 클래스
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean

 

 

 

 Boxing과 Unboxing 

기본 타입의 값을 포장 객체로 만드는 과정을 박싱(boxing), 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱(unboxing)이라고 한다. 예시는 아래와 같다. 

public class BoxingUnboxing {
	public static void main(String[] args) {
    	Integer obj = 100;			// boxing
        int value = obj;			// unboxing
        int result = obj + 100;		// 연산 시 자동으로 unboxing
    }
}

 

 

 

 Wrapper Class를 사용하는 이유 

 이렇게까지 공부하고 나서도 생기는 나의 근본적인 의문이 있었다. 왜 wrapper class를 사용해 가면서 까지 기본 타입을 객체로 만들어야 하는가? 값을 바꿀 수도 없어 연산을 수행할 수도 없는데, 굳이 객체로 만드는 이유가 궁금했다. 검색을 하며 공부한 결과 주로 아래 두 가지 이유로 사용된다.

 첫 번째 이유는 제네릭(Generic)이다.  제네릭은 자료형을 정하지 않는 기법이다. 예를 들어 아래와 같이 Generic이라는 클래스를 선언하면 T는 아직 정해지지 않은 타입이 되고, Generic class의 객체를 만들 때, T에 어떤 타입이 들어갈지 결정하게 된다. 이때 타입은 꼭 Wrapper class를 사용해주어야 한다. 

public class Generic<T> {
	public T data;
}
public class GenericExample {
	public static void main(String[] args) {
    	Generic<Integer> generic = new Generic<Integer>();
        generic.data = 10;
    }
}

 

 두 번째 이유는 기본형 타입을 객체로 다뤄야 하는 경우가 있기 때문이다. 예를 들어 하나의 배열에 여러 가지 데이터 타입을 넣고 싶다면 Object를 사용하고 그 안에서는 Wrapper class를 사용하여 요소들을 넣어준다. 

Object[] objAry = {
        new Integer(10),
        new Double(10.5),
        new String("안녕")
};

 

 혹은 매개변수를 객체로 넘겨야 하는 경우도 있다.

public class Wrapper {
	public static void func(Object a) {
    	System.out.println(String.valueOf(a));
    }
    
    public static void main(String[] args) {
    	func(new Integer(10));
    }
}
728x90