2023. 1. 18. 14:36ใJAVA/Effective JAVA
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("")์ ์ฌ์ฉํ์ง ๋ง๊ณ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํด ๊ธฐ์กด์ ๋์ผํ ๋ฌธ์์ด์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค!!
๊ฐ์ ๊ฐ์ ๋จธ์ ์์์๋ ๋๊ฐ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋๊ฐ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํจ์ด ๋ณด์ฅ๋๋ค.
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๋ก ๋น๊ตํด๋ณด๋ฉด ์บ์ฑํ์ฌ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ํจ์ฌ ๋น ๋ฅธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
isRomanNumberSlow()์์ matches()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
String.matches๋ ์ ๊ทํํ์์ผ๋ก ๋ฌธ์์ด ํํ๋ฅผ ํ์ธํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ด์ง๋ง, ์ฑ๋ฅ์ด ์ค์ํ ์ํฉ์์๋ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ์ง ์๋ค. ์คํ ๊ฒฐ๊ณผ ์ฐจ์ด๋ฅผ ๋ณด๊ธฐ๋ง ํด๋ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋๊น isRomanNumeralFas()๋ณด๋ค ํจ์ฌ ๋๋ฆฐ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ฐ๋ผ์ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ค๋ฉด ํ์ํ ์ ๊ทํํ์์ ํํํ๋ 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๊ฐ์ง ๊ฒฝ์ฐ(๋ฌธ์์ด ์์ฑ, ์คํ ๋ฐ์ฑ, ์ ๊ท์) ์๋ ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ๊ตณ์ด ์์ฑํ์ง ๋ง๊ณ ์ฌ์ฌ์ฉํ์~ ๋ผ๋ ๊ฒ์ด๋ค.