[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item6. ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•˜๋ผ.

2023. 1. 18. 14:36ใ†JAVA/Effective JAVA

728x90
item06. ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•˜๋ผ. 

โ—๏ธ ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ ๊ทธ๋ƒฅ ๊ฐ์ฒด ์ƒ์„ฑ์€ ํ”ผํ•˜๋ผ! ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์ด๋‹ค. 

 

 

 

1) ๋ฌธ์ž์—ด

public static void main(String[] args) {
    String hello = "hello";
    String hello2 = new String("hello"); // ์ด ๋ฐฉ๋ฒ•์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ! -> ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ 
    String hello3 = "hello";

    System.out.println("hello == hello2 = " + (hello == hello2));
    System.out.println("hello == hello3 = " + (hello == hello3));
}

๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ณดํ†ต ์ฒซ๋ฒˆ์งธ, ์„ธ๋ฒˆ์งธ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

๊ทผ๋ฐ ํ˜น์‹œ๋‚˜ new String()์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ๋ฐ”๊ฟ”์•ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

 

hello == hello3 ๋น„๊ตํ•ด ๋ณด๋ฉด ๊ฒฐ๊ณผ๊ฐ€ true๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ 

์™œ๋ƒํ•˜๋ฉด hello์™€ hello3์€ ์‚ฌ์‹ค์ƒ ๋™์ผํ•œ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ new String ์œผ๋กœ ํ•ด์„œ ๊ตณ์ด ์ƒˆ๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค!! 

(์ฆ‰, hello == hell2์˜ ๊ฒฐ๊ณผ๋Š” false)

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ new String("")์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•ด ๊ธฐ์กด์— ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!! 

 

์ถœ์ฒ˜ https://www.digitalocean.com/community/tutorials/what-is-java-string-pool

๊ฐ™์€ ๊ฐ€์ƒ ๋จธ์‹  ์•ˆ์—์„œ๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•จ์ด ๋ณด์žฅ๋œ๋‹ค. 

 

 

2) ์ •๊ทœ์‹, Pattern

: ์ƒ์„ฑ ๋น„์šฉ์ด ๋น„์‹ผ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณตํ•ด์„œ ์ƒ์„ฑํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์บ์‹ฑํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

public class RomanNumerals {

    static boolean isRomanNumeralSlow(String s) {
        return s.matches("^(?=.)M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
    }

    // ๊ฐ’ ๋น„์‹ผ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์„œ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค.
    private static final Pattern ROMAN = Pattern.compile("^(?=.)M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");

    static boolean isRomanNumeralFast(String s) {
        return ROMAN.matcher(s).matches();
    }

    public static void main(String[] args) {
        boolean result = false;
        long start = System.nanoTime();
        for (int i = 0; i < 10; i++) {
            result = isRomanNumeralSlow("MCMLXXVI");
        }
        long end = System.nanoTime();
        System.out.println("(end - start) = " + (end - start));
        System.out.println("result = " + result);
    }
}

result์˜ ๊ฒฐ๊ณผ๋ฅผ isRomanNumeralSlow์™€ isRomanNumeralFast๋กœ ๋น„๊ตํ•ด๋ณด๋ฉด ์บ์‹ฑํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ๋น ๋ฅธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

isRomanNumeralSlow()

isRomanNumberSlow()์—์„œ matches()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. 

String.matches๋Š” ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ์—” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ์‹คํ–‰ ๊ฒฐ๊ณผ ์ฐจ์ด๋ฅผ ๋ณด๊ธฐ๋งŒ ํ•ด๋„ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ isRomanNumeralFas()๋ณด๋‹ค ํ›จ์”ฌ ๋Š๋ฆฐ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

isRomanNumeralFast()

๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋ ค๋ฉด ํ•„์š”ํ•œ ์ •๊ทœํ‘œํ˜„์‹์„ ํ‘œํ˜„ํ•˜๋Š” Pattern ์ธ์Šคํ„ด์Šค๋ฅผ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ ์ง์ ‘ ์บ์‹ฑํ•ด๋‘๊ณ  ์ด์ œ isRomanNumeralFast() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋งˆ๋‹ค ์ด ์ธ์Šคํ„ด์Šค(ROMAN)๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. 

 

 

๐Ÿฅ Pattern

: ์ •๊ทœ ํ‘œํ˜„์‹์ด ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค. ์ •๊ทœ ํ‘œํ˜„์‹์— ๋Œ€์ƒ ๋ฌธ์ž์—ด์„ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜, ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค์ด๋‹ค. 

 

 

 

3) ์˜คํ† ๋ฐ•์‹ฑ auto boxing

์šฐ์„  ์˜คํ† ๋ฐ•์‹ฑ์ด๋ž€ ๊ธฐ๋ณธํƒ€์ž… (primitive type) ์„ ๊ทธ์— ์ƒ์‘ํ•˜๋Š” ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธํƒ€์ž… Wapper type๋กœ ์ƒํ˜ธ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ  

ex) int -> Integer 

์–ธ๋ฐ•์‹ฑ์€ ๋ฐ˜๋Œ€๋กœ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธํƒ€์ž…์„ primitive type์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ  

ex) Integer -> int, Long -> long 

 

public class Sum {
    private static long sum() {
        long sum = 0L;
        for (long i = 0; i <= Integer.MAX_VALUE; i++) {
            sum += i; // sum์ด Long์ธ ๊ฒฝ์šฐ i ์—์„œ ์˜คํ† ๋ฐ•์‹ฑ์ด ๊ณ„์† ์ผ์–ด๋‚˜์„œ ์†๋„๊ฐ€ ๋Š๋ฆฌ๊ฒŒ ๋œ๋‹ค.
        }
        return sum;
    }

    public static void main(String[] args) {
        long start = System.nanoTime();
        long x = sum();
        long end = System.nanoTime();

        System.out.println(((end - start) / 1_000_000.) + "ms.");
        System.out.println("x = " + x);
    }
}

long sum์ด ์•„๋‹Œ Long sum์ด์—ˆ์„ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ ํƒ€์ž…(long i)๊ณผ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธํƒ€์ž…(Long sum)์ด ์„ž์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์ด ์ด๋ฃจ์–ด์ ธ์„œ ํ›จ์”ฌ ์†๋„๊ฐ€ ๋Š๋ฆฌ๊ฒŒ ๋œ๋‹ค. 

์˜คํ† ๋ฐ•์‹ฑ์ด ์ผ์–ด๋‚œ ๊ฒฝ์šฐ
์˜คํ† ๋ฐ•์‹ฑ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

 

๋”ฐ๋ผ์„œ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…๋ณด๋‹ค๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ณ , ์˜๋„์น˜ ์•Š์€ ์˜คํ† ๋ฐ•์‹ฑ์ด ์ˆจ์–ด๋“ค์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์ž!! 

 

 

โœ๏ธ item06์—์„œ ํ•ต์‹ฌ? ํฌ์ธํŠธ๋Š” ์šฐ์„  ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•˜๋ผ! ์ธ๋ฐ ์—ฌ๊ธฐ์„œ ์˜คํ•ดํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  ๊ฐ์ฒด ์ƒ์„ฑ์ด ์ƒ์„ฑ ๋น„์šฉ์ด ๋น„์‹ธ๋‹ˆ๊นŒ ํ”ผํ•˜๋ผ! ๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์œ„์—์„œ ์ œ์‹œํ•œ 3๊ฐ€์ง€ ๊ฒฝ์šฐ(๋ฌธ์ž์—ด ์ƒ์„ฑ, ์˜คํ† ๋ฐ•์‹ฑ, ์ •๊ทœ์‹) ์—๋Š” ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๊ตณ์ด ์ƒ์„ฑํ•˜์ง€ ๋ง๊ณ  ์žฌ์‚ฌ์šฉํ•˜์ž~ ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90