๋ชฉ์ฐจ
Java๋ ๊ธฐ๋ณธํ(primitive type)๊ณผ ์ฐธ์กฐํ(reference type)์ ๋ช ํํ ๊ตฌ๋ถํฉ๋๋ค.
ํ์ง๋ง ์ปฌ๋ ์ ์ด๋ ์ ๋ค๋ฆญ์ฒ๋ผ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ์ค๊ณ๋ Java์ ๊ตฌ์กฐ ์์์๋ ๊ธฐ๋ณธํ๋ง์ผ๋ก๋ ๋ถ์กฑํ ๋๊ฐ ๋ง์ต๋๋ค.
์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก Wrapper ํด๋์ค์ ๋๋ค.
์ด๋ฒ ๊ธ์์๋ Wrapper ํด๋์ค์ ๊ฐ๋ , ๋ณํ(๋ฐ์ฑ/์ธ๋ฐ์ฑ), ๊ทธ๋ฆฌ๊ณ ํ์ฉ๋ฒ๊น์ง ๊น๋ํ๊ฒ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
๐ Wrapper ํด๋์ค๋?
Wrapper ํด๋์ค๋ ๊ธฐ๋ณธํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ํฌ์ฅํ๋ ํด๋์ค์ ๋๋ค.
์๋ฅผ ๋ค์ด, int ๊ฐ์ ๊ฐ์ฒด๋ก ๋ค๋ฃจ๊ณ ์ถ๋ค๋ฉด Integer๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ธฐ๋ณธํ | Wrapper ํด๋์ค |
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
์ Wrapper ํด๋์ค๊ฐ ํ์ํ ๊น?
- ์ ๋ค๋ฆญ(Generic) ์ ๊ฐ์ฒด ํ์ ๋ง ํ์ฉ → ๊ธฐ๋ณธํ ๋ถ๊ฐ
- ์ปฌ๋ ์ (Collection) ์ ๊ฐ์ฒด๋ง ์ ์ฅ ๊ฐ๋ฅ
- null ํํ์ด ๊ฐ๋ฅ → ๊ธฐ๋ณธํ์ null์ ๋ด์ ์ ์์
- ๋ฉ์๋์ ํ๋๋ฅผ ๊ฐ๋ ๊ฐ์ฒด์งํฅ์ ๊ธฐ๋ฅ ์ ๊ณต
๐ฆ ๋ฐ์ฑ(Boxing)๊ณผ ์ธ๋ฐ์ฑ(Unboxing)
๋ฐ์ฑ(Boxing)
๋ฐ์ฑ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์ ํด๋นํ๋ Wrapper ํด๋์ค์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋๋ค.
// ์๋ ๋ฐ์ฑ
Integer wrappedInt = Integer.valueOf(10);
// ์๋ ๋ฐ์ฑ(Auto-boxing) - Java 5๋ถํฐ ์ง์
Integer autoBoxed = 10; // ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก Integer.valueOf(10)์ผ๋ก ๋ณํ
์ธ๋ฐ์ฑ(Unboxing)
์ธ๋ฐ์ฑ์ Wrapper ํด๋์ค ๊ฐ์ฒด๋ฅผ ํด๋นํ๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋๋ค.
// ์๋ ์ธ๋ฐ์ฑ
int primitiveInt = wrappedInt.intValue();
// ์๋ ์ธ๋ฐ์ฑ(Auto-unboxing) - Java 5๋ถํฐ ์ง์
int autoUnboxed = wrappedInt; // ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก wrappedInt.intValue()๋ก ๋ณํ
๐ง ์ฃผ์ ๊ธฐ๋ฅ ์ ๋ฆฌ
1. ํ๋ณํ ๋ฉ์๋
// ๋ฌธ์์ด -> ๊ธฐ๋ณธํ
int i = Integer.parseInt("100");
double d = Double.parseDouble("3.14");
boolean b = Boolean.parseBoolean("true");
// ๊ธฐ๋ณธํ -> ๋ฌธ์์ด
String s1 = Integer.toString(100);
String s2 = Double.toString(3.14);
String s3 = Boolean.toString(true);
2. ๊ฐ ๋น๊ต ๋ฉ์๋
Integer num1 = 10;
Integer num2 = 20;
int comparison = num1.compareTo(num2); // -1 (num1 < num2)
3. ์์ ํ๋
int max = Integer.MAX_VALUE; // 2147483647
int min = Integer.MIN_VALUE; // -2147483648
int bits = Integer.SIZE; // 32 (bit)
int bytes = Integer.BYTES; // 4 (byte)
4. ์ ํธ๋ฆฌํฐ ๋ฉ์๋
// 2์ง์, 8์ง์, 16์ง์ ๋ณํ
String binary = Integer.toBinaryString(10); // "1010"
String octal = Integer.toOctalString(10); // "12"
String hex = Integer.toHexString(10); // "a"
// ์ต๋๊ฐ, ์ต์๊ฐ ์ฐพ๊ธฐ
int max = Integer.max(10, 20); // 20
int min = Integer.min(10, 20); // 10
// ๋ถํธ ๊ด๋ จ
int sign = Integer.signum(-10); // -1 (์์๋ -1, 0์ 0, ์์๋ 1)
โ ๏ธ Wrapper ํด๋์ค ์ฌ์ฉ ์ ์ฃผ์์
1. ๊ฐ์ฒด ๋น๊ต (== vs equals())
๊ฐ์ ๋น๊ตํ ๋๋ == ์ฐ์ฐ์ ๋์ equals() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true (์บ์ฑ ๋๋ฌธ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ)
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false (์บ์ฑ ๋ฒ์ ๋ฐ, ๋ค๋ฅธ ๊ฐ์ฒด)
System.out.println(c.equals(d)); // true (๊ฐ ๋น๊ต, ํญ์ ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ)
2. ์บ์ฑ(Caching) ๋ฉ์ปค๋์ฆ
Java๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์์ฃผ ์ฌ์ฉ๋๋ ๊ฐ์ Wrapper ๊ฐ์ฒด๋ฅผ ์บ์ฑํฉ๋๋ค.
์ด๋ฅผ Flyweight ํจํด์ด๋ผ๊ณ ๋ ํฉ๋๋ค.
- Boolean: true, false
- Byte: ๋ชจ๋ ๊ฐ (-128 ~ 127)
- Character: '\u0000' ~ '\u007f' (0 ~ 127)
- Short, Integer, Long: -128 ~ 127
Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
System.out.println(a == b); // true (์บ์ฑ๋ ๊ฐ์ ๊ฐ์ฒด)
Integer c = Integer.valueOf(1000);
Integer d = Integer.valueOf(1000);
System.out.println(c == d); // false (์บ์ฑ ๋ฒ์ ๋ฐ, ๋ค๋ฅธ ๊ฐ์ฒด)
3. ์ฑ๋ฅ ์ด์
์๋ ๋ฐ์ฑ/์ธ๋ฐ์ฑ์ ํธ๋ฆฌํ์ง๋ง, ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
ํนํ ๋ฐ๋ณต๋ฌธ ๋ด์์ ๋ง์ ๋ฐ์ฑ/์ธ๋ฐ์ฑ์ด ๋ฐ์ํ๋ฉด ์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋ ์ ์์ต๋๋ค.
// ๋นํจ์จ์ ์ธ ์ฝ๋ ์
Long sum = 0L; // Wrapper ํ์
for (int i = 0; i < 1000000; i++) {
sum += i; // ๋งค ๋ฐ๋ณต๋ง๋ค ๋ฐ์ฑ/์ธ๋ฐ์ฑ ๋ฐ์
}
// ๊ฐ์ ๋ ์ฝ๋
long sum = 0L; // ๊ธฐ๋ณธ ํ์
for (int i = 0; i < 1000000; i++) {
sum += i; // ๋ฐ์ฑ/์ธ๋ฐ์ฑ ๋ฐ์ํ์ง ์์
}
4. null ์ฒ๋ฆฌ์ ์ฃผ์
Wrapper ํด๋์ค๋ null์ ๊ฐ์ง ์ ์์ง๋ง, ์๋ ์ธ๋ฐ์ฑ ์ NullPointerException์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
Integer nullInteger = null;
int value = nullInteger; // NullPointerException ๋ฐ์
// ์์ ํ ๋ฐฉ๋ฒ
int safeValue = (nullInteger != null) ? nullInteger : 0;
๐ ๋ง๋ฌด๋ฆฌ
์ด๋ฒ ๊ธ์์๋ Java์ Wrapper ํด๋์ค์ ๋ํด ์์๋ณด์์ต๋๋ค.
Wrapper ํด๋์ค๋ Java์์ ๊ธฐ๋ณธํ์ ๊ฐ์ฒด์ฒ๋ผ ๋ค๋ค์ผ ํ ๋ ํ์์ ์ผ๋ก ์ฌ์ฉ๋๋ ํด๋์ค์ ๋๋ค.
ํนํ ์ปฌ๋ ์ ์ฌ์ฉ, ์ ๋ค๋ฆญ ํ์ ์ง์ , null ์ฒ๋ฆฌ ๋ฑ์์ ๋งค์ฐ ์ ์ฉํ์ฃ .
์์ฝํ์๋ฉด:
- ๊ธฐ๋ณธํ์ ๊ฐ์ฒด์ฒ๋ผ ๋ค๋ฃฐ ์ ์๋ค → Wrapper๋ก ๊ฐ์ธ๊ธฐ
- Integer, Double, Boolean ๋ฑ์ผ๋ก ๋์
- Wrapper๋ null์ด ๊ฐ๋ฅํ๋ฏ๋ก ์ธ๋ฐ์ฑ ์ ๋ฐ๋์ ์ฒดํฌ
Java ํ๋ก๊ทธ๋๋ฐ์์ Wrapper ํด๋์ค์ ํน์ฑ๊ณผ ํ์ฉ๋ฒ์ ์ ์ดํดํ๋ฉด ๋ ํจ์จ์ ์ด๊ณ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํนํ ๋ฐ์ฑ/์ธ๋ฐ์ฑ์ ๋น์ฉ๊ณผ null ์ฒ๋ฆฌ ๋ฑ์ ์ฃผ์ํ๋ฉด์ ์ ์ ํ ํ์ฉํ์๊ธฐ ๋ฐ๋๋๋ค.
๋ค์ ๊ธ์์๋ ์๋ฐ์ ์ปฌ๋ ์ ํ๋ ์์ํฌ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๊ถ๊ธํ ๋ด์ฉ์ด๋ ์ถ๊ฐ๋ก ์๊ณ ์ถ์ ๊ฐ๋ ์ด ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์ ๐