๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] ๋ฐ•์‹ฑ(Boxing), ์–ธ๋ฐ•์‹ฑ(Unboxing)์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ ์ด์Šˆ

์ถœ์ฒ˜

ChatGPT


1. ๋ฐ•์‹ฑ(Boxing)๊ณผ ์–ธ๋ฐ•์‹ฑ(Unboxing)์ด๋ž€?

๋ฐ•์‹ฑ Boxing

์›์‹œ ํƒ€์ž… ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ์— ๋Œ€์‘ํ•˜๋Š” ๋ ˆํผ ํด๋ž˜์Šค ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •. ์˜ˆ๋ฅผ ๋“ค์–ด, int๋ฅผ Integer๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

์–ธ๋ฐ•์‹ฑ Unboxing

๋ž˜ํผ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ์›์‹œ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •. ์˜ˆ๋ฅผ ๋“ค์–ด, Integer ๊ฐ์ฒด๋ฅผ int ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

์ž๋ฐ”์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์ด ์ž๋™์œผ๋กœ ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ† ๋ฐ•์‹ฑ(Auto-Boxing)๊ณผ ์˜คํ† ์–ธ๋ฐ•์‹ฑ(Auto-Unboxing)์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

 

์˜ˆ์‹œ

int num = 10;  // ์›์‹œ ํƒ€์ž…
Integer boxedNum = num;  // ์˜คํ† ๋ฐ•์‹ฑ: int -> Integer
int unboxedNum = boxedNum;  // ์˜คํ† ์–ธ๋ฐ•์‹ฑ: Integer -> int

 

2. ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ด์Šˆ

1. ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ GC(๊ฐ€๋น„์ง€ ์ปฌ๋ž™์…˜) ์˜ค๋ฒ„ํ—ค๋“œ

๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

๋ฐ•์‹ฑ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์€ ๊ฐ์ฒด๊ฐ€ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, int ๊ฐ’์„ Integer ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ์šด Integer ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด ์ถ”๊ฐ€์ ์ธ ๊ฐ์ฒด ์ƒ์„ฑ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ํŠนํžˆ ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋งŽ์€ ์ˆ˜์˜ ๋ฐ•์‹ฑ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ Garbage Collection

๋ฐ•์‹ฑ๋œ ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๊ฐ€ ์—†์–ด์ง€๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋Œ€์ƒ์ด ๋œ๋‹ค. ๋งŽ์€ ์ˆ˜์˜ ๋ฐ•์‹ฑ๋œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธ๋˜๋ฉด, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋” ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์–ด ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

 

2. ์—ฐ์‚ฐ ์„ฑ๋Šฅ ์ €ํ•˜

์ถ”๊ฐ€ ์—ฐ์‚ฐ

๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์€ ์ถ”๊ฐ€์ ์ธ ์—ฐ์‚ฐ์„ ์š”๊ตฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Integer ๊ฐ์ฒด๋ฅผ int๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์–ธ๋ฐ•์‹ฑ ๊ณผ์ •์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€์„œ ์‹ค์ œ int ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๋ฐ˜๋ณต์ ์œผ๋กœ ์ด ์ž‘์ด ์ˆ˜ํ–‰๋˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

 

3. ์บ์‹ฑ(Caching) ์˜ค๋ฒ„ํ—ค๋“œ

์ž๋ฐ”๋Š” -128์—์„œ 127 ์‚ฌ์ด์˜ Integer ๊ฐ์ฒด๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹ฑ์„ ํ•œ๋‹ค. ์ด ๋ฒ”์œ„ ๋‚ด์˜ ๊ฐ’์€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ๋œ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, ์บ์‹œ ๋ฒ”์œ„ ๋ฐ”๊นฅ์˜ ๊ฐ’๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

1. ์›์‹œ ํƒ€์ž… ๋ฐฐ์—ด ์‚ฌ์šฉ

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์›์‹œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๋Œ€์‹  ์›์‹œ ํƒ€์ž… ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์— ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

int[] numbers = new int[100];  // ์›์‹œ ํƒ€์ž… ๋ฐฐ์—ด

 

2. Stream API์˜ IntStream, LongStream, DoubleStream ์‚ฌ์šฉ

์ž๋ฐ” 8 ์ด์ƒ์—์„œ๋Š” Stream API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์›์‹œ ํƒ€์ž…์„ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•œ๋‹ค. IntStream, LongStream, DoubleStream ๋“ฑ์€ ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์„ ํ”ผํ•˜๋ฉด์„œ ์›์‹œ ํƒ€์ž…์˜ ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

IntStream.range(1, 100).forEach(System.out::println);

 

3. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ ˆํผ ํด๋ž˜์Šค ๋Œ€์‹  ์›์‹œ ํƒ€์ž… ์‚ฌ์šฉ

๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ๋ž˜ํผ ํด๋ž˜์Šค (Integer, Double ๋“ฑ) ๋Œ€์‹  ์›์‹œ ํƒ€์ž…(int, double ๋“ฑ)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์— ๋” ์œ ๋ฆฌํ•˜๋‹ค

 

4. ์ปฌ๋ ‰์…˜์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ ˆํผ ํƒ€์ž… ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ธฐ

์ปฌ๋ ‰์…˜์ด๋‚˜ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์— ์ˆ˜๋งŽ์€ ์›์‹œ ํƒ€์ž… ๊ฐ’์„ ๋ž˜ํ•‘ํ•ด์„œ ์ €์žฅํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ์ปฌ๋ ‰์…˜์˜ ์‚ฌ์šฉ์„ ์ค„์ด๊ฑฐ๋‚˜, ์›์‹œ ํƒ€์ž… ์ „์šฉ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

4. ์‹ค์ œ์ ์ธ ์˜ˆ์‹œ ์ฝ”๋“œ

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์ œ๋„ค๋ฆญ List๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Integer ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ์™€ ์›์‹œ ํƒ€์ž… ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ด๋‹ค.

import java.util.ArrayList;
import java.util.List;

public class BoxingExample {
    public static void main(String[] args) {
        // ์ œ๋„ค๋ฆญ List์™€ ๋ž˜ํผ ํด๋ž˜์Šค Integer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
        List<Integer> numbers = new ArrayList<>();
        long start = System.nanoTime();
        for (int i = 0; i < 1_000_000; i++) {
            numbers.add(i);  // ์˜คํ† ๋ฐ•์‹ฑ ๋ฐœ์ƒ
        }
        long end = System.nanoTime();
        System.out.println("Time taken with List<Integer>: " + (end - start) + " ns");

        // ์›์‹œ ํƒ€์ž… ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
        int[] numbersArray = new int[1_000_000];
        start = System.nanoTime();
        for (int i = 0; i < 1_000_000; i++) {
            numbersArray[i] = i;  // ์˜คํ† ๋ฐ•์‹ฑ ์—†์Œ
        }
        end = System.nanoTime();
        System.out.println("Time taken with int[]: " + (end - start) + " ns");
    }
}

 

์œ„ ์˜ˆ์ œ์—์„œ List<Integer>๋Š” ์˜คํ† ๋ฐ•์‹ฑ์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด, ์›์‹œ ํƒ€์ž… ๋ฐฐ์—ด์ธ int[]๋Š” ์„ฑ๋Šฅ์ด ๋” ์šฐ์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ int[]๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๋‹ค.