String interning

String interning(๋ฌธ์ž์—ด ์ธํ„ฐ๋‹) ์ด๋ž€

In computer science, string interning is a method of storing only one copy of each distinct string value, which must be immutable.[1] Interning strings makes some string processing tasks more time- or space-efficient at the cost of requiring more time when the string is created or interned. The distinct values are stored in a string intern pool.

์œ„ํ‚ค์— ์œ„์™€ ๊ฐ™์ด ์ž˜ ์„ค๋ช…๋˜๊ณ  ์žˆ๋‹ค. ํ•ต์‹ฌ๋งŒ ์•„๋ž˜์— ์“ฐ์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋ฌธ์ž์—ด ์ดํ„ฐ๋‹์ด๋ž€ ๋ถˆ๋ณ€์˜ ์œ ์ผ ๋ฌธ์ž์—ด๋กœ ๊ฐ ๋ฌธ์ž์—ด copy ๋ฅผ ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฌธ์ž์—ด์„ ์ธํ„ฐ๋‹ ํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ž์—ด์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋จ์— ์žˆ์–ด์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„, ๊ณต๊ฐ„ ๋ณต์žก๋„ ์ธก๋ฉด์—์„œ ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๊ฐ๊ฐ์˜ ๊ตฌ๋ถ„๋˜๋Š” ๊ฐ’์€ ๋ฌธ์ž์—ด ํ’€์— ์ €์žฅ๋œ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด์„œ ๋ฌธ์ž์—ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฌธ์ž์—ด ํ’€์— ์บ์‹ฑ์ฒ˜๋Ÿผ ์ €์žฅํ•ด๋†จ๋‹ค๊ฐ€ ๋™์ผํ•œ ๋ฌธ์ž์—ด์ด ํ•„์š”ํ•  ๋•Œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋ฌธ์ž์—ด์— ๊ทธ๊ฒƒ์ด ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

        String hi1 = "hi";
        String hi2 = new String("hi");
        String hi3 = "hi";

        System.out.println(hi1 == hi2); // false
        System.out.println(hi2 == hi3); // false
        System.out.println(hi3 == hi1); // true

new String ์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด ์ธํ„ฐ๋‹์„ ๋ฌด์‹œํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ hi1 ๊ณผ hi2 ์€ ๊ฐ์ฒด๋Š” ๋™๋“ฑํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ฐธ์กฐ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๋™์ผ์„ฑ์ด ๊นจ์ง€๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ hi3์˜ ๊ฒฝ์šฐ "hi" ๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ h1 ๊ณผ ๋™์ผํ•˜๊ณ  h1 ์ƒ์„ฑ์‹œ ์ธํ„ฐ๋‹ ๋œ ๋ฌธ์ž์—ด์„ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋˜์–ด์„œ h3๊ณผ h1์˜ ์ฐธ์กฐ๊ฐ’์€ ๊ฐ™์•„์ง„๋‹ค.

๋ฌธ์ž์—ด ์ธํ„ฐ๋‹์ด ์ฃผ๋Š” ์„ฑ๋Šฅ ํšจ์œจ์„ ํ™•์ธํ•ด๋ณด์ž

์•„๋ž˜ ์ฝ”๋“œ๋กœ๋Š” 76~77ms ์ด ๋‚˜์˜ค๊ณ  ์žˆ๋‹ค. ๋ฌธ์ž์—ด ํ’€์—์„œ ๊บผ๋‚ด ์“ฐ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ผ๋ถ€๋Ÿฌ ๋งŒ๋“ค๊ฒŒ ํ–ˆ๋‹ค.

public class Main {
    public static void main(String[] args) {

        long startTime = System.currentTimeMillis();
        String hi1 = "hi";
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            String hi2 = new String("hi");
        }
        long endTime = System.currentTimeMillis();

        System.out.println(endTime - startTime);
    }
}

๋ฐ˜๋ฉด์— ์•„๋ž˜ ์ฝ”๋“œ๋Š” 1ms ์ด ์ฐํžŒ๋‹ค. ๊ทธ๋ƒฅ ์ˆซ์ž๋งŒ์œผ๋กœ ์†๋„๊ฐ€ 70๋ฐฐ ์ด์ƒ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค.

public class Main {
    public static void main(String[] args) {

        long startTime = System.currentTimeMillis();
        String hi1 = "hi";
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            String hi2 = "hi";
        }
        long endTime = System.currentTimeMillis();

        System.out.println(endTime - startTime);
    }
}

Last updated