๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”

๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•˜๋ผ - [2์žฅ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด(์•„์ดํ…œ6)]

Amenable 2022. 11. 29. 00:15

  ํ•ด๋‹น ์žฅ์—์„œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ•˜๋Š” 3๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๋งํ•ด์ฃผ๊ณ  ์žˆ๋‹ค. ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด์ž.

 

1. ๋ฌธ์ž์—ด

public static void main(String[] args){
    String hello1 = "hello";
    String hello2 = new String("hello");
    String hello3 = "hello";
    
    System.out.println(hello1 == hello2); // false // ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค 
    System.out.println(hello1.equals(hello2)); // true // ๊ฐ™์€ ๋ฌธ์ž์—ด
    System.out.println(hello1 == hello3); // true // ๊ฐ™์€ ์ธ์Šคํ„ด์Šค
    System.out.println(hello1.equals(hello3)); // true // ๊ฐ™์€ ๋ฌธ์ž์—ด
}

  hello1๊ณผ hello2๊ฐ€ ๊ฐ™์€ ๋ฌธ์ž์—ด์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. JVM์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฌธ์ž์—ด์„ ํ’€(pool)์—์„œ ์บ์‹ฑํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์ฐธ์กฐ๋ผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ž์—ด์„ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— new String("hello")์ฒ˜๋Ÿผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. 

 

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

public class RomanNuberals{
    static boolean isRomanNumberalSlow(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();
    }
}

  isRomanNumberSlow์—์„œ "^(?=.)M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"๋ผ๋Š” ์ •๊ทœํ‘œํ˜„์‹(ํŒจํ„ด)์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ํŒจํ„ด์„ ์ปดํŒŒ์ผํ•˜๊ณ  ํŒจํ„ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๊ณผ์ •์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

  ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ๋™์ผํ•œ ํŒจํ„ด์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ์ด ๋œ๋‹ค๋ฉด ROMAN์ฒ˜๋Ÿผ ํ•„๋“œ๋กœ ์„ ์–ธ์„ ํ•ด์„œ ์‚ฌ์šฉ์„ ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. (isRomanNumeralFast ์ฐธ๊ณ )

 

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

  ์˜คํ† ๋ฐ•์‹ฑ(auto boxing)์ด๋ž€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ฐ•์‹ฑ ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์„ž์–ด ์“ธ ๋•Œ ์ž๋™์œผ๋กœ ์ƒํ˜ธ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์กฐ๊ธˆ ๋” ์ •ํ™•ํžˆ๋Š” primitive ํƒ€์ž…(int, long, boolean)์—์„œ reference ํƒ€์ž…(Integer, Long, Boolean)์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ๋Š” ๋ฐ•์‹ฑ, ๊ทธ ๋ฐ˜๋Œ€๋Š” ์–ธ๋ฐ•์‹ฑ์ด ์ผ์–ด๋‚œ๋‹ค. 

public static long sum(){
    Long sum = 0L;
    for(long i = 0; i <= Integer.MAX_VALUE; i++){
        sum += i;
    }
    return sum;
}

  ์œ„์˜ ์ฝ”๋“œ์—์„œ ๋ถˆํ•„์š”ํ•œ Long ์ธ์Šคํ„ด์Šค๊ฐ€ (Integer.MAX_VALUE+1) ๊ฐœ๋งŒํผ ๊ณ„์†ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๋งŒ์•ฝ 'long sum = 0L;'๋กœ ์„ ์–ธ์„ ํ•œ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ์˜คํ† ๋ฐ•์‹ฑ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

  ์ด์ƒ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” 3๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  "๊ฐ์ฒด ์ƒ์„ฑ์€ ๋น„์‹ธ๋‹ˆ ํ”ผํ•ด์•ผ ํ•œ๋‹ค."๋กœ ์˜คํ•ดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ๋ช…ํ™•์„ฑ, ๊ฐ„๊ฒฐ์„ฑ, ๊ธฐ๋Šฅ์„ ์œ„ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ข‹์€ ์ผ์ด๋‹ค.

 

ํ•ด๋‹น ๊ธ€์€ ๋ฐฑ๊ธฐ์„  ๋‹˜์˜ '์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” ์™„๋ฒฝ ๊ณต๋žต'์„ ์ˆ˜๊ฐ•ํ•˜๊ณ  ์ž‘์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋Œ“๊ธ€์ˆ˜0