์๋ก
์๋ฐ๋ฅผ ๊ณต๋ถํ๋ค ๋ณด๋ฉด int, Integer ๊ทธ๋ฆฌ๊ณ double, Double์ ๊ฐ์ด ์ฒซ ์ด๋ฆ์ด ๋๋ฌธ์๋ก ์ ์ธ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ฒ์๊ธ์์๋ ์ด๋ฌํ ๊ฒ๋ค์ด ๋ฌด์์ธ์ง์ ๋ํด์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
๋ํผ(Wrapper) ํด๋์ค
๊ฐ์ฒด์งํฅ ๊ฐ๋ ์์ ๋ชจ๋ ๊ฒ์ ๊ฐ์ฒด๋ก ๋ค๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ฐ์์๋ 8๊ฐ์ ๊ธฐ๋ณธํ(privitive type)์ ๊ฐ์ฒด๋ก ๋ค๋ฃจ์ง ์๊ณ ์๋๋ฐ ๋์ ์ฑ๋ฅ์ ์ป๊ธฐ ์ํด์ ๊ธฐ๋ณธํ์ผ๋ก ๋ค๋ฃจ๊ณ ์์์ต๋๋ค. ํ์ง๋ง ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ฒด๋ฅผ ์๊ตฌํ๊ฑฐ๋, ๊ธฐ๋ณธํ์ด ์๋ ๊ฐ์ฒด๋ก ๊ฐ์ ์ ์ฅํด์ผ ํ ๋, ๊ฐ์ฒด ๊ฐ์ ๋น๊ต๊ฐ ํ์ํ ๋ ๋ฑ๋ฑ์ ๊ฒฝ์ฐ์์ ๊ธฐ๋ณธํ ๊ฐ๋ค์ ๊ฐ์ฒด๋ก ๋ฐํํ์ฌ ์์ ์ ์ํํ ๋๊ฐ ์์ต๋๋ค.
์ด๋ ์ฌ์ฉ๋๋ ๊ฒ์ด ๋ํผ(wrapper) ํด๋์ค์ ๋๋ค. 8๊ฐ์ ๊ธฐ๋ณธํ์ ๋ํํ๋ 8๊ฐ์ wrapper ํด๋์ค๊ฐ ์๋๋ฐ, ์ด ํด๋์ค๋ค์ ์ด์ฉํ๋ฉด ๊ธฐ๋ณธํ ๊ฐ์ ๊ฐ์ฒด๋ก ๋ค๋ฃฐ ์ ์์ต๋๋ค.
๊ธฐ๋ณธํ | ๋ํผํด๋์ค | ์์ฑ์ | ์ |
boolean | Boolean | Boolean (boolean value) Boolean (String s) |
Boolean b = new Boolean(true); Boolean b2 = new Boolean("true"); |
char | Character | Character (char value) | Character c = new Character('a'); |
byte | Byte | Byte (byte value) Byte (String s) |
Byte b = new Byte(10); Byte b2 = new Byte("10"); |
short | Short | Short (short value) Short (short s) |
Short s = new Short(10); Short s2 = new Short("10"); |
int | Integer | Integer (int value) Integer (String s) |
Integer i = new Integer(100); Integer 2 = new Integer("100"); |
long | Long | Long (long value) Long (String s) |
Long l = new Long(100); Long l = new Long("100"); |
float | Float | Float (double value) Float (float value) Float (String s) |
Float f = new Float(1.0); Float f2 = new Float(1.0f); Float f3 = new Float("1.0f"); |
double | Double | Double (double value) Double (String s) |
Double d = new Double(1.0); Double d = new Double("1.0"); |
wrapper ํด๋์ค๋ค์ ๋ชจ๋ equals()๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ด์๊ธฐ ๋๋ฌธ์ ์ฃผ์ ๊ฐ์ด ์๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ ๋น๊ตํ๊ฒ ๋ฉ๋๋ค. ๋ํ wrapper ํด๋์ค๋ค์ MAX_VALUE, MIN_VALUE, SIZE, TYPE ๋ฑ์ static ๋ฉค๋ฒ๋ฅผ ๊ณตํต์ ์ผ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค.
Wrapper ํด๋์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
Wrapper ํด๋์ค๋ค์ ์ฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์๋ ๊ธฐ๋ณธํ๊ณผ๋ ๋ค๋ฅธ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค.
int a = 4;
Integer b = 16;
์ ์ฝ๋๋ฅผ ์์๋ก ๋ค์ด๋ณด๋ฉด a๋ int์ ํฌ๊ธฐ์ธ 4byte๊ฐ ํ ๋น๋์ง๋ง, b ๊ฐ์ ๊ฒฝ์ฐ 16byte๊ฐ ํ ๋น๋ฉ๋๋ค. ๊ทธ ์ด์ ๋ wrapper๋ ํด๋์ค ํฌ์ธํฐ, ํ๋๊ทธ, ๋ฝ(Lock), int ๊ฐ ๊น์ง ์ด 4๊ฐ์ value๋ฅผ ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Wrapper ํด๋์ค์ ์บ์ฑ
Wrapper ํด๋์ค๋ ์ผ์ ๊ตฌ๊ฐ์ ๊ธฐ๋ณธ ๊ฐ์ ๋ฏธ๋ฆฌ ์์ฑํด ๋๊ณ ์์ต๋๋ค. ์๋ ์ฝ๋๋ ์ค์ Integer ํด๋์ค์ ์ฝ๋์ ๋๋ค.
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* jdk.internal.misc.VM class.
*/
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
ํ์ฌ -128 ~ 127๊น์ง์ ๊ฐ์ ๊ฐ์ง๋ Integer ์ธ์คํด์ค๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๊ณ ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
/**
* Returns an {@code Integer} instance representing the specified
* {@code int} value. If a new {@code Integer} instance is not
* required, this method should generally be used in preference to
* the constructor {@link #Integer(int)}, as this method is likely
* to yield significantly better space and time performance by
* caching frequently requested values.
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
๋ฐ๋ผ์ valueOf ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ ๋ -127 ~ 128 ๋ฒ์์ ๊ฐ์ด ๋ค์ด์จ๋ค๋ฉด ์บ์ฑ๋ ๊ฐ์ ๋ด๋ณด๋ด๊ณ ๋ฒ์ ๋ฐ์ด๋ผ๋ฉด ์๋ก์ด ์ธ์คํด์ค๋ฅผ ํ ๋นํฉ๋๋ค.
Integer ํด๋์ค ๋ฟ๋ง ์๋๋ผ, Byte, Short, Long, Character ์ญ์ ์์ฒด์ ์ผ๋ก ์บ์ฑ์ ์ฌ์ฉํ๊ณ ์์ง๋ง Float์ Double๋ ์ค์์ด๊ธฐ ๋๋ฌธ์ ๋ฒ์ ์์ธก์ด ํ๋ค์ด ์์ฒด์ ์ผ๋ก ์บ์ฑ์ ํ์ง ์์ต๋๋ค.
'BackEnd๐ฑ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] (Project, Package, Class, Method) Naming ๊ท์น (0) | 2022.05.16 |
---|---|
[Java] String format() method (0) | 2022.05.14 |
[Java] Object to int (0) | 2022.05.06 |
[Java] StringBuffer์ StringBuilder (0) | 2022.04.06 |
[Java] ArrayList vs LinkedList (0) | 2022.04.06 |
[Java] String ํด๋์ค (0) | 2022.04.05 |
๋๊ธ