πŸ“‚ JAVA/μ£Όμš” κ°œλ…

래퍼 클래슀 (Wrapper Class)

Amenable 2023. 5. 9. 21:27

1. κ°œλ… 🚢‍♀️

  일반적으둜 객체지ν–₯ κ°œλ…μ—μ„œ λͺ¨λ“  것은 객체둜 닀루어져야 ν•œλ‹€. ν•˜μ§€λ§Œ μžλ°”μ—μ„œ 8개의 κΈ°λ³Έν˜•(boolean, char, byte, short, int, long, float, double)은 객체둜 닀루어지지 μ•ŠλŠ”λ‹€. μžλ°”κ°€ μ™„μ „ν•œ 객체 μ§€ν–₯ μ–Έμ–΄κ°€ μ•„λ‹ˆλΌλŠ” 이야기λ₯Ό λ“£μ§€λ§Œ, 보닀 높은 μ„±λŠ₯을 얻을 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.

  ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λ‹€ 보면 κΈ°λ³Έν˜•(Primitive Type) λ³€μˆ˜λ„ μ–΄μ©” 수 없이 객체둜 닀뀄야 ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. 예λ₯Ό λ“€λ©΄, λ§€κ°œλ³€μˆ˜λ‘œ 객체λ₯Ό μš”κ΅¬ν•  λ•Œ, κΈ°λ³Έν˜• 값이 μ•„λ‹Œ 객체둜 μ €μž₯ν•΄μ•Ό ν•  λ•Œ, 객체 κ°„μ˜ 비ꡐ가 ν•„μš”ν•  λ•Œ λ“±λ“±μ˜ κ²½μš°μ—λŠ” κΈ°λ³Έν˜• 값듀을 객체둜 λ³€ν™˜ν•˜μ—¬ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.

  이럴 λ•Œ 래퍼 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 각각의 νƒ€μž…μ— ν•΄λ‹Ήν•˜λŠ” 데이터λ₯Ό 인수둜 전달받아 ν•΄λ‹Ή 값을 κ°€μ§€λŠ” 객체둜 λ§Œλ“€ 수 μžˆλ‹€. 8개의 κΈ°λ³Έν˜•μ„ λŒ€ν‘œν•œ 8개의 래퍼클래슀λ₯Ό μ΄μš©ν•˜λ©΄ κΈ°λ³Έν˜• 값을 객체둜 λ‹€λ£° 수 μžˆλ‹€. 래퍼 ν΄λž˜μŠ€λŠ” λͺ¨λ‘ java.lang νŒ¨ν‚€μ§€μ— ν¬ν•¨λ˜μ–΄ μ œκ³΅λœλ‹€.

κΈ°λ³Έ νƒ€μž… 래퍼 클래슀
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

 

2. λ°•μ‹±(Boxing) & μ–Έλ°•μ‹±(UnBoxing) 🚢‍♂️

  μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ κ²ƒμ²˜λŸΌ 래퍼 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ 값을 포μž₯ν•˜μ—¬ 객체둜 λ§Œλ“€ 수 μžˆλ‹€. μ•„μ£Ό λ‹Ήμ—°ν•˜κ²Œ 생각할 수 μžˆλ“―μ΄ '포μž₯을 ν•˜λŠ” 것'κ³Ό '포μž₯을 λœ―λŠ” 것' 두 κ°€μ§€μ˜ ν–‰μœ„κ°€ μžˆμ„ 것이닀.

  이것을 λ°•μ‹±(Boxing)κ³Ό μ–Έλ°•μ‹±(UnBoxing)이라고 ν•œλ‹€.

  λ°•μ‹±κ³Ό 언박싱은 각각 λ‹€μŒκ³Ό 같은 λ³€ν™˜μ„ μ˜λ―Έν•œλ‹€.

  • λ°•μ‹± (Boxing)
    κΈ°λ³Έ νƒ€μž…μ˜ 데이터 → 래퍼 클래슀의 μΈμŠ€ν„΄μŠ€
  • μ–Έλ°•μ‹± (UnBoxing)
    래퍼 클래슀의 μΈμŠ€ν„΄μŠ€μ— μ €μž₯된 κ°’ → κΈ°λ³Έ νƒ€μž…μ˜ 데이터
// λ°•μ‹±(Boxing)
Integer num1 = Integer.valueOf(27); // new Integer(int value)λŠ” μ‹œκ°„κ³Ό κ³΅κ°„μƒμ˜ 문제둜 Deprecated λ˜μ—ˆλ‹€.
// μ–Έλ°•μ‹±(UnBoxing)
int num2 = num1.intValue();

 

3. μ˜€ν†  λ°•μ‹±(AutoBoxing) & μ˜€ν†  μ–Έλ°•μ‹±(AutoUnBoxing) πŸƒ‍♀️

  JDK 1.5λΆ€ν„°λŠ” λ°•μ‹±κ³Ό 언박싱이 ν•„μš”ν•œ μƒν™©μ—μ„œ μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μ²˜λ¦¬ν•΄ μ€€λ‹€. 이λ₯Ό μ˜€ν†  λ°•μ‹±(AutoBoxing)κ³Ό μ˜€ν†  μ–Έλ°•μ‹±(AutoUnBoxing)이라고 ν•œλ‹€.

// μ˜€ν†  λ°•μ‹± (Auto Boxing)
Integer num3 = 17;
// μ˜€ν†  μ–Έλ°•μ‹± (Auto UnBoxing)
int num4 = num3;

  μ˜€ν† λ°•μ‹±μ„ μ΄μš©ν•΄μ„œ κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜• κ°„μ˜ ν˜•λ³€ν™˜κ³Ό 연산을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

int i = 5;
Integer intg = Integer.valueOf(10);
Long lng = 100L;

// int + Integer
int sum1 = i + intg; // 15

// int + Long
long sum2 = i + lng; // 105

  μ£Όμ˜ν•΄μ•Ό ν•  점은 κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜•μ˜ 연산은 μ˜€ν† λ°•μ‹±μ΄λΌλŠ” μ»΄νŒŒμΌλŸ¬κ°€ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯ λ•Œλ¬Έμ— κ°€λŠ₯ν•œ 것이닀. κΈ°λ³Έν˜•κ³Ό μ°Έμ‘°ν˜•μ˜ μ—°μ‚°μ΄ μ›λž˜ κ°€λŠ₯ν•œ κ²ƒμ΄λΌκ³  μƒκ°ν•˜λ©΄ μ•ˆ λœλ‹€.

πŸ“™ μ„±λŠ₯ 비ꡐ

  νŽΈμ˜μ„±μ„ μœ„ν•΄ μ˜€ν†  λ°•μ‹±κ³Ό μ˜€ν†  언박싱을 μ œκ³΅ν•˜κ³  μžˆμ§€λ§Œ, λ‹€λ₯Έ νƒ€μž… κ°„μ˜ ν˜• λ³€ν™˜μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯에 영ν–₯을 λ―ΈμΉœλ‹€. λΆˆν•„μš”ν•œ μ˜€ν†  λ°•μ‹±κ³Ό μ˜€ν†  언박싱이 μΌμ–΄λ‚˜λ©΄ λ‹Ήμ—°νžˆ 더 λ§Žμ€ μ‹œκ°„μ΄ μ†ŒλΉ„λœλ‹€.

// λΆˆν•„μš”ν•œ μ˜€ν† λ°•μ‹± O
long start = System.currentTimeMillis();
Integer num1;
for(int i = 0; i < 1_000_000_000; i++){
    num1 = Integer.valueOf(i);
}

long end = System.currentTimeMillis();
System.out.println(end - start);  // 8

----------

// λΆˆν•„μš”ν•œ μ˜€ν† λ°•μ‹± X
long start = System.currentTimeMillis();
int num1;
for(int i = 0; i < 1_000_000_000; i++){
    num1 = i;
}

long end = System.currentTimeMillis();
System.out.println(end - start); // 3

  κ·ΈλŸ¬λ―€λ‘œ μ„±λŠ₯을 κ³ λ €ν•œλ‹€λ©΄ κΌ­ ν•„μš”ν•œ 상황이 아닐 λ•Œ μ˜€ν†  λ°•μ‹±κ³Ό μ˜€ν†  언박싱은 μ§€μ–‘ν•˜λŠ” 것이 μ’‹λ‹€. (IntelliJμ—μ„œλ„ λΆˆν•„μš”ν•œ λ°•싱이 μΌμ–΄λ‚˜λ©΄ 'Unnecessary boxing'이라고 μΉœμ ˆν•˜κ²Œ μ•Œλ €μ£Όκ³  μžˆλ‹€.)

 

4. 래퍼 클래슀 동등 비ꡐ πŸƒ‍♂️

  μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ κ²ƒμ²˜λŸΌ 래퍼 ν΄λž˜μŠ€λŠ” μ˜€ν†  λ°•μ‹±κ³Ό μ˜€ν†  언박싱을 μ΄μš©ν•΄μ„œ 비ꡐ 연산이 κ°€λŠ₯ν•˜λ‹€.

  ν•˜μ§€λ§Œ 동등 μ—¬λΆ€ νŒλ‹¨μ„ ν•  λ•ŒλŠ” μ£Όμ˜κ°€ ν•„μš”ν•˜λ‹€. 래퍼 ν΄λž˜μŠ€λ„ κ°μ²΄μ΄λ―€λ‘œ λ™λ“± μ—°μ‚°μž(==)λ₯Ό μ‚¬μš©ν•˜κ²Œ λ˜λ©΄, λ‘ μΈμŠ€ν„΄μŠ€ κ°’을 λΉ„κ΅ν•˜λŠ” κ²ƒμ΄ μ•„λ‹ˆλΌ λ‘ μΈμŠ€ν„΄μŠ€ μ£Όμ†Œκ°’을 λΉ„κ΅ν•˜κ²Œ λœλ‹€.

Integer num1 = Integer.valueOf(200);
Integer num2 = Integer.valueOf(200);

System.out.println(num1 == num2); // false
System.out.println(num1.equals(num2)); // true

  κ·ΈλŸ¬λ―€λ‘œ μΈμŠ€ν„΄μŠ€μ˜ 값이 같은지 비ꡐ할 λ•Œμ—λŠ” equalsλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

πŸ“™ μ£Όμ˜μ‚¬ν•­

  μ—¬κΈ°μ„œ 쑰금 μ£Όμ˜ν•  점이 μžˆλ‹€. κΈ°μ‘΄ μ±…κ³Ό μžλ£Œμ—μ„œλŠ” Integer.valueOf()κ°€ μ•„λ‹Œ new Integer()λ₯Ό μ΄μš©ν•΄μ„œ μ„€λͺ…을 ν•΄μ£Όκ³  μžˆλ‹€. new Integer()λ₯Ό ν•˜λ©΄ λ‹Ήμ—°νžˆ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ '=='λ₯Ό ν•˜λ©΄ 무쑰건 falseκ°€ λ‚˜μ˜¨λ‹€.

  ν•˜μ§€λ§Œ Integer.valueOf()μ—μ„œλŠ” 쑰금 λ‹€λ₯΄λ‹€. Integer.valueOf()λŠ” -128~127에 μ†ν•˜λŠ” IntegerλŠ” 캐싱해 λ‘” 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆμ–΄μ„œ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€κ°€ 생기지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€. κ·Έλž˜μ„œ λ§Œμ•½ 값을 100으둜 μœ„μ˜ μ½”λ“œλ₯Ό λŒλ €λ³Έλ‹€λ©΄ μ•„λž˜μ™€ 같이 trueκ°€ λ‚˜μ˜€κ²Œ λœλ‹€.

Integer num1 = Integer.valueOf(100);
Integer num2 = Integer.valueOf(100);

System.out.println(num1 ==  num2); // true
System.out.println(num1.equals(num2)); // true

  new Integer()κ°€ μžλ°” 9λΆ€ν„° Deprecated λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이 점을 μœ μ˜ν•˜λ„λ‘ ν•˜μž. 일단 μ΄λ²ˆ κΈ€μ—μ„œλŠ” λž˜νΌ ν΄λž˜μŠ€λ₯Ό μ΄μš©ν•΄μ„œ λ™λ“± λΉ„ꡐλ₯Ό ν•˜λ©΄ μΈμŠ€ν„΄μŠ€ μ£Όμ†Œκ°’을 λΉ„κ΅ν•œλ‹€λŠ” κ²ƒμ„ κ°•μ‘°ν•˜κΈ° μœ„ν•΄ μΌλ‹¨μ€ '래퍼 ν΄λž˜μŠ€λ‘œ λ™λ“± λΉ„ꡐλ₯Ό ν•  λ•Œμ—λŠ” equalsλ₯Ό μ‚¬μš©ν•˜μž'라고 ν•˜κ³  λ„˜μ–΄κ°€λ„둝 ν•œλ‹€. (이 μ£Όμ œμ— λŒ€ν•΄μ„œλŠ” λ‹€μ‹œ λΈ”λ‘œκΉ…μ„ ν•˜κ² λ‹€.)

 

5. μžλ£Œν˜• λ³€ν™˜ λ©”μ„œλ“œ πŸ§—‍♀️

  래퍼 ν΄λž˜μŠ€μ—μ„œ 자체 μ§€μ›ν•˜λŠ” parseType() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ 데이터 νƒ€μž…μ˜ ν˜• λ³€ν™˜μ„ ν•  수 μžˆλ‹€.

String strTen = "10";
String strTrue = "true";
String strFalse = "false";

byte b = Byte.parseByte(strTen); // 10
int i = Integer.parseInt(strTen); // 10
short s = Short.parseShort(strTen); // 10
long l = Long.parseLong(strTen); // 10
float f = Float.parseFloat(strTen); // 10.0
double d = Double.parseDouble(strTen); // 10.0
boolean boolTrue = Boolean.parseBoolean(strTrue); // true
boolean boolFalse = Boolean.parseBoolean(strFalse); // false

 

ν•΄λ‹Ή 글은
남ꢁ성 λ‹˜μ˜ 'μžλ°”μ˜ 정석',
Inpa λ‹˜μ˜ '[JAVA] Wrapper ν΄λž˜μŠ€μ™€ Boxing & UnBoxing 총정리',
TCP SCHOOL의 'Wrapper 클래슀'
λ₯Ό μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.