๋ฐ˜์‘ํ˜•

 

์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด JVM์€ ์šด์˜์ฒด์ œ ์œ„์—์„œ ์‹คํ–‰๋  ๋•Œ ๊ฐ๊ฐ์˜ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ›๊ณ  ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šฉ๋„์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๊ธฐ์— ํ•ด๋‹น ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด๋จ

 

 

๊ฒฐ๋ก ์€ int๋Š” primitive type(์›์‹œ ํƒ€์ž…) ์ด๊ณ  integer๋Š” wrapper class(๋ž˜ํผ ํด๋ž˜์Šค) ์ž„

 

int

 

  • ๋‹จ์ˆœํžˆ ์ˆซ์ž ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” Java์˜ 8๊ฐœ ์›์‹œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์ž„

    => ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…

 

Java์˜ 8๊ฐœ ์›์‹œ ํƒ€์ž…

boolean
: ture ๋˜๋Š” false (8bit)
char : ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž ๋ฐ์ดํ„ฐ (16bit)
byte : -128 ~ 127 (8bit)
short : -32768 ~ 32767 (16bit)
int : -21์–ต ~ 21์–ต (32bit)
long : -100๊ฒฝ ~ 100๊ฒฝ (64bit)
float : -3.4 * 10^38 ~ 3.4 * 10^3.8 (32bit)
double : -1.7 * 10^308 ~ 1.7 * 10^308 (64bit)

 

 

  • null ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ 0์ž„

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ์ ๊ณ  ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋น ๋ฆ„

  • JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์—์„œ Stack ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ง์ ‘ ์ €์žฅ๋จ
Stack ๋ฉ”๋ชจ๋ฆฌ

1. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ์ž„

2. LIFO(Last In First Out) ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•จ

3. ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ Stack ์˜์—ญ์„ ๊ฐ€์ง

4. ์ ‘๊ทผ ์†๋„๊ฐ€ ๋น ๋ฆ„

 

Integer

 

  • int ์›์‹œ ํƒ€์ž…์„ ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ๋Š” ํด๋ž˜์Šค์ž„

    => java.lang.Number ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค

 

  • ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ์ œ๊ณต

 

  • null ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

 

  • ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•จ (์•ฝ 16byte)

 

  • JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์—์„œ Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅ๋จ

    => ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” Stack์— ์ €์žฅ๋˜๊ณ , ์‹ค์ œ ๊ฐ์ฒด๋Š” Heap์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์ž„

 

Heap ๋ฉ”๋ชจ๋ฆฌ

1. ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ

2. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

3. Garbage Collector์— ์˜ํ•ด ๊ด€๋ฆฌ๋จ

4. Stack๋ณด๋‹ค ์ ‘๊ทผ ์†๋„๊ฐ€ ๋Š๋ฆผ

 

Wrapper Class

 

๋ž˜ํผ ํด๋ž˜์Šค๋Š” ์›์‹œ ํƒ€์ž…์„ ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ๋Š” ํด๋ž˜์Šค์ž„

 

public final class Integer extends Number implements Comparable<Integer> {
    private final int value;
    public Integer(int value) {
        this.value = value;
    }
    // ๊ธฐํƒ€ ๋ฉ”์„œ๋“œ๋“ค...
}

 

Integer ํด๋ž˜์Šค์˜ ์‹ค์ œ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ int ๊ฐ’์„ ํฌ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

 

 

Boxing(๋ฐ•์‹ฑ), Unboxing(์–ธ๋ฐ•์‹ฑ)

 

Boxing๊ณผ Unboxing์€ Java์—์„œ primitive type๊ณผ ํ•ด๋‹น wrapper class ๊ฐ„์˜ ๋ณ€ํ™˜ ๊ณผ์ •์„ ์˜๋ฏธํ•˜๋Š”๋ฐ 

Java 5๋ถ€ํ„ฐ๋Š” Autoboxing๊ณผ Auto-unboxing์„ ์ง€์›ํ•จ

 

 

๋ฐ•์‹ฑ

 

 

int primitiveValue = 10;
Integer wrappedValue = new Integer(primitiveValue); // ๋ช…์‹œ์  ๋ฐ•์‹ฑ

 

๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋‹นํ•˜๋Š” ๋ž˜ํผ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ•์‹ฑ์ž„

 

์–ธ๋ฐ•์‹ฑ

 

 

Integer wrappedValue = new Integer(20);
int primitiveValue = wrappedValue.intValue(); // ๋ช…์‹œ์  ์–ธ๋ฐ•์‹ฑ

 

๋ž˜ํผํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ํ•ด๋‹นํ•˜๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์–ธ๋ฐ•์‹ฑ์ž„

 

์ž๋™ ๋ฐ•์‹ฑ (Autoboxing)

 

int primitiveValue = 10;
Integer wrappedValue = primitiveValue; // ์ž๋™ ๋ฐ•์‹ฑ

 

์ž๋™ ๋ฐ•์‹ฑ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ํ•ด๋‹น ๋ž˜ํผ ํด๋ž˜์Šค ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž„

 

Integer wrappedValue = Integer.valueOf(primitiveValue);

 

์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด๋ถ€์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด ๋ณ€ํ™˜ํ•จ

 

์ถ”๊ฐ€์ ์œผ๋กœ Integer.valueOf()๋Š” int -> Integer ๋‚˜ String -> Integer ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ -128~127 ์‚ฌ์ด์˜ ๊ฐ’์— ๋Œ€ํ•ด ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•จ

 

private static class IntegerCache {
    static final Integer[] cache;
    
    static {
        // -128๋ถ€ํ„ฐ 127๊นŒ์ง€์˜ Integer ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ cache ๋ฐฐ์—ด์— ์ €์žฅ
        cache = new Integer[256];
        for (int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
    }
}



Integer ํด๋ž˜์Šค ๋‚ด๋ถ€์ ์œผ๋กœ IntegerCache๋ผ๋Š” ์ •์  ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ์ด ํด๋ž˜์Šค๋Š” JVM์ด ์‹œ์ž‘๋  ๋•Œ ํ•ด๋‹น ๋ฒ”์œ„์˜ Integer ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ ๋ฐฐ์—ด์— ์ €์žฅํ•ด๋‘ 

 

public static Integer valueOf(int i) {
    if (i >= -128 && i <= 127) {
        return IntegerCache.cache[i + 128];
    }
    return new Integer(i);
}

 

=> ์ด ๋ฒ”์œ„ ๋‚ด์˜ ๊ฐ’๋“ค์€ ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ ์บ์‹ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ด

 

 

์ž๋™ ์–ธ๋ฐ•์‹ฑ(Auto-unboxing)

 

Integer wrappedValue = new Integer(20);
int primitiveValue = wrappedValue; // ์ž๋™ ์–ธ๋ฐ•์‹ฑ

 

์ž๋™ ์–ธ๋ฐ•์‹ฑ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ž˜ํผ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ํ•ด๋‹น ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž„

 

int primitiveValue = wrappedValue.intValue();

 

์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด๋ถ€์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด ๋ณ€ํ™˜ํ•จ

 

์‚ฌ์šฉ ์˜ˆ์‹œ์™€ ์ฐจ์ด์ 

 

1. Collection์—์„œ์˜ ์‚ฌ์šฉ

 

// ์ž˜๋ชป๋œ ์‚ฌ์šฉ
ArrayList<int> numbers = new ArrayList<int>(); // ์ปดํŒŒ์ผ ์˜ค๋ฅ˜

// ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(1); // ์ž๋™ ๋ฐ•์‹ฑ ๋•๋ถ„์— int 1์ด Integer๋กœ ๋ณ€ํ™˜๋˜์–ด ์ €์žฅ๋จ

 

 

ArrayList, HashMap ๋“ฑ์˜ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฐ์ฒด๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์›์‹œํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

 

 

2. ๋ฉ”์„œ๋“œ์™€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋Šฅ

 

// ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜
int value = Integer.parseInt("123");

// ์ •์ˆ˜์˜ 16์ง„์ˆ˜ ํ‘œํ˜„ ์–ป๊ธฐ
String hexString = Integer.toHexString(255); // "ff" ๋ฐ˜ํ™˜

// ์ตœ๋Œ€๊ฐ’, ์ตœ์†Œ๊ฐ’ ์‚ฌ์šฉ
int maxValue = Integer.MAX_VALUE;

 

Integer ํด๋ž˜์Šค๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•จ

 

3. ๋น„๊ต ์—ฐ์‚ฐ

 

int a = 5;
int b = 5;
System.out.println(a == b); // true, ๊ฐ’ ๋น„๊ต

Integer c = new Integer(5);
Integer d = new Integer(5);
System.out.println(c == d); // false, ์ฐธ์กฐ ๋น„๊ต
System.out.println(c.equals(d)); // true, ๊ฐ’ ๋น„๊ต

 

Integer ๊ฐ์ฒด ๋น„๊ต ์‹œ '==' ์—ฐ์‚ฐ์ž๋Š” ์ฐธ์กฐ๋ฅผ ๋น„๊ตํ•˜๋ฏ€๋กœ ๊ฐ’ ๋น„๊ต๋ฅผ ์›ํ•œ๋‹ค๋ฉด equals() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ

 

Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
System.out.println(a == b); // true

Integer c = Integer.valueOf(200);
Integer d = Integer.valueOf(200);
System.out.println(c == d); // false

 

=> ์œ„์—์„œ ๋‹ค๋ค˜๋“ฏ์ด Integer.valueOf()๊ฐ€  -128~127๊นŒ์ง€์˜ ๊ฐ’์— ๋Œ€ํ•ด ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ์— ํ•ด๋‹น ๋ฒ”์œ„์˜ Integer์—์„œ  '==' ๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ true๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ

 

(a์™€ b ๋ชจ๋‘ valueOf(100)์„ ํ†ตํ•ด ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ ์ƒ์„ฑ๋œ ๋™์ผํ•œ Integer ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•จ)

 

 

๐Ÿ“Œ ์‚ฌ์šฉ ์ง€์นจ

์„ฑ๋Šฅ(๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ)์ด ์ค‘์š”ํ•˜๊ฑฐ๋‚˜ ๋‹จ์ˆœ ๊ณ„์‚ฐ์—์„œ๋Š” int๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  

null ๊ฐ’์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด๋กœ ๋‹ค๋ค„์•ผ ํ•  ๊ฒฝ์šฐ integer๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ
(์ปฌ๋ ‰์…˜์—์„œ๋Š” integer ์‚ฌ์šฉ์ด ํ•„์ˆ˜)

 

๋ฐ˜์‘ํ˜•