Effective Java - Item 6
λκ°μ κΈ°λ₯μ κ°μ²΄λ₯Ό μ¬λ¬ λ² μμ±νλ κ²λ³΄λ€ μ¬μ¬μ©νλ κ²μ΄ μ±λ₯ ν₯μμ λμμ΄ λ μ μλ€. νΉν λΆλ³ κ°μ²΄λ μΈμ λ μ¬μ¬μ©ν μ μλ€.
1
2
3
String s1 = new String(βhomework!β); // νμ§ λ§μμΌ ν μ½λ
String s2 = "homework!";
ν΄λΉ μ½λμ s1, s2λ κ²°κ³Όμ μΌλ‘ κ°μ κΈ°λ₯μ νλ€.
s1μ κ²½μ° βhomework!β μμ²΄κ° ν΄λΉ μμ±μλ‘ λ§λ€μ΄ λ΄λ €λ String μΈμ€ν΄μ€μ μμ ν κ°μ§λ§, new String()
μΌλ‘ κ°μΈ μ€νλ λλ§λ€ String μΈμ€ν΄μ€κ° μλ‘ μμ±λλ€.
ν΄λΉ μ½λκ° λΉλ²ν νΈμΆλλ λ©μλ μμ μ‘΄μ¬νλ€λ©΄ μΈλ°μλ String μΈμ€ν΄μ€κ° μλ°±λ§ κ°μ© λ§λ€μ΄μ§ μλ μλ€.
λ°λ©΄ s2μ κ°μ κ²½μ°μλ λ¬Έμμ΄ λ¦¬ν°λ΄μ μ¬μ¬μ©νλ―λ‘ κ°μ JVMμ λμΌν λ¬Έμμ΄ λ¦¬ν°λ΄μ΄ μ‘΄μνλ€λ©΄ μ¬μ¬μ©μ΄ κ°λ₯νλ€.
μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μ¬μ©νλ κ²½μ°μλ λΆνμν κ°μ²΄ μμ±μ νΌν μ μλ€.
β νμ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ Boolean(String)
μμ±μ λμ κΈ°μ‘΄μ μΊμ±ν κ°μ²΄λ₯Ό λ°νν΄μ£ΌλBoolean.valueOf(String)
ν©ν°λ¦¬ λ©μλλ₯Ό μ¬μ©
λν λ°μ΄ν° λ² μ΄μ€ 컀λ₯μ κ³Ό κ°μ΄ μμ± λΉμ©μ΄ λΉμΌ κ°μ²΄κ° λ°λ³΅ν΄μ νμν κ²½μ°μλ μΊμ±μ ν΅ν΄ μ¬μ¬μ© ν΄μΌ νλ€. λ€λ§ μμ μ΄ μμ±ν΄μΌ νλ κ°μ²΄κ° λΉμΌ κ°μ²΄μΈμ§λ₯Ό λ§€λ² λͺ ννκ² μ
μλ μλ€.
μλ₯Ό λ€μ΄, μλμ κ°μ΄ String.matches()
λ©μλλ μ κ·ννμμΌλ‘ λ¬Έμμ΄ ννλ₯Ό νμΈνλ κ°μ₯ μ¬μ΄ λ°©λ²μ΄μ§λ§, μ±λ₯μ΄ μ€μν μν©μμ λ°λ³΅ν΄ μ¬μ©νκΈ°μλ μ ν©νμ§ μλ€.
1
2
3
4
static boolean isRomanNumeral(String s) {
return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}
β matches()
λ©μλ λ΄λΆμμ μ μνλ Pattern μΈμ€ν΄μ€λ λ§€λ² μλ‘ μμ±λμ΄ ν λ² μ°κ³ λ²λ €μ Έ 곧λ°λ‘ κ°λΉμ§ 컬λ μ
μ λμμ΄ λλ€.
String ν΄λμ€μ matches()
λ©μλκ° λ°ννλ Patternμ λΆλ³ ν΄λμ€(final class) μ΄κ³ , μμ± λΉμ©μ΄ λΉμΈκΈ° λλ¬Έμ μ¬μ¬μ©νκΈ°λ₯Ό κΆμ₯νλ€. Pattern μ μ
λ ₯λ°μ μ κ· ννμμ ν΄λΉνλ μ ν μν λ¨Έμ (finite state machine)μ λ§λ€κΈ° λλ¬Έμ μΈμ€ν΄μ€ μμ± λΉμ©μ΄ λλ€.
1
2
3
4
5
6
7
8
9
public class RomanNumerals {
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 isRomanNumeral(String s) {
return ROMAN.matcher(s).matches();
}
}
β Pattern μΈμ€ν΄μ€λ₯Ό static final
νλλ‘ κΊΌλ΄κ³ μ΄λ¦μ μ§μ νμ¬ μ΄λ€ μ½λμΈμ§ λͺ
ννκ² μ μ μλ€.
μ±λ₯μ κ°μ νκΈ° μν΄μλ νμν μ κ·ννμμ νννλ Pattern μΈμ€ν΄μ€λ₯Ό ν΄λμ€ μ΄κΈ°ν κ³Όμ μμ μ§μ μμ±νμ¬ μΊμ±νκ³ , λμ€μ λ©μλκ° νΈμΆλ λλ§λ€ ν΄λΉ μΈμ€ν΄μ€λ₯Ό μ¬μ¬μ©νλλ‘ ν΄μΌνλ€.
λ€λ§, κ°μ λ isRomanNumeral λ°©μμ ν΄λμ€κ° μ΄κΈ°νλ ν λ©μλλ₯Ό ν λ²λ νΈμΆνμ§ μλλ€λ©΄ ROMAN νλλ μΈλ°μμ΄ μ΄κΈ°νλ κΌ΄μ΄λ€. λ©μλκ° μ²μ νΈμΆλ λ νλλ₯Ό μ΄κΈ°ννλ μ§μ° μ΄κΈ°ν(lazy initialzation)λ‘ λΆνμν μ΄κΈ°νλ₯Ό λ§μ μλ μμ§λ§, μ½λκ° λ³΅μ‘ν΄μ§λ κ²μ λΉν΄ μ±λ₯μ ν¬κ² κ°μ λμ§ μμ λκ° λ§λ€.
λ λ€λ₯Έ λΆνμν κ°μ²΄λ₯Ό λ§λ€μ΄λ΄λ μμλ‘ μ€ν λ°μ±(auto boxing)μ λ€ μ μλ€.
βμ€ν λ°μ±(auto boxing)
μλ° μ»΄νμΌλ¬κ° primitive data typeμ κ·Έμ μμνλ wrapper classλ‘ μλ λ³ν μμΌμ£Όλ κ², μλ₯Ό λ€λ©΄ intλ₯Ό Integerλ‘, doubleμ Doubleλ‘ λ³ννλ€.
1
2
3
4
5
6
7
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
β λͺ¨λ μμ μ μμ μ΄ν©μ ꡬνλ λ©μλ
μ μ½λμμ sumμ LongμΌλ‘ μ μΈν¨μ λ°λΌ λΆνμν Long μΈμ€ν΄μ€κ° κ³μν΄μ μμ±λλ€.
λ¨μν sumμ νμ μ longμΌλ‘λ§ λ°κΏμ€λ μ€ν λ°μ±μ΄ μΌμ΄λμ§ μκ³ , λΆνμν μΈμ€ν΄μ€ μμ±μ΄ μ€μ΄ μ±λ₯μ΄ μ’μμ§λ€.
μλ―ΈμμΌλ‘λ λ³λ€λ₯Ό κ²μ΄ μμ§λ§ μ±λ₯μ μμ΄μλ λ€λ₯΄κΈ° λλ¬Έμ λ°μ±λ κΈ°λ³Έ νμ 보λ€λ κΈ°λ³Έ νμ μ μ¬μ©νκ³ μλμΉ μμ μ€ν λ°μ±μ΄ μ¨μ΄λ€μ§ μλλ‘ μ£Όμν΄μΌνλ€.