|
| 1 | +# item 6. λΆνμν κ°μ²΄ μμ±μ νΌνλΌ |
| 2 | + |
| 3 | +[λ°±κΈ°μ λ κ°μ](https://www.youtube.com/watch?v=0yUxPUXS1pM&list=PLfI752FpVCS8e5ACdi5dpwLdlVkn0QgJJ&index=6) |
| 4 | + |
| 5 | +[code1](https://github.com/keesun/study/blob/master/effective-java/item6.md) |
| 6 | + |
| 7 | +[code2](https://github.com/WegraLee/effective-java-3e-source-code/tree/master/src/effectivejava/chapter2/item6) |
| 8 | + |
| 9 | +--- |
| 10 | + |
| 11 | +## 1. μ¬μ¬μ©μ±μ λν κ΄μ |
| 12 | +λκ°μ κΈ°λ₯μ κ°μ²΄λ₯Ό λ§€λ² μμ±ν기보λ€λ κ°μ²΄ νλλ₯Ό μ¬μ¬μ©νλ νΈμ΄ μ’λ€ |
| 13 | + |
| 14 | +νΉν λΆλ³ κ°μ²΄λ μΈμ λ μ¬μ¬μ©ν μ μλ€ |
| 15 | + |
| 16 | +μλμ κ°μ΄ μμ±μλ₯Ό ν΅ν΄ String κ°μ²΄λ₯Ό λ§€λ² λ§λ€μ§ λ§μλΌ |
| 17 | +```java |
| 18 | +String s = new String("bikini"); // λ°λΌ νμ§ λ§ κ² |
| 19 | +String s = "bikini"; |
| 20 | +``` |
| 21 | + |
| 22 | +μμ±μλ₯Ό ν΅ν΄ String κ°μ²΄λ₯Ό λ§λ€κ² λλ©΄ μΈλ°μμ΄ String μΈμ€ν΄μ€λ₯Ό λ°λ³΅ν΄μ λ§λ€κ² λλ€ |
| 23 | + |
| 24 | +Javaμ κ°μλ¨Έμ μ λκ°μ λ¬Έμμ΄ λ¦¬ν°λ΄μ λν΄μλ λμΌ μ½λλ₯Ό μ¬μ©νλ μ¬μ¬μ©μ±μ΄ 보μ₯λλ€ |
| 25 | + |
| 26 | +μμ±μλ₯Ό ν΅ν΄ μμ±νλ κ² λμ μ μ μ ν©ν 리 λ§€μλλ₯Ό μ 곡νλ λΆλ³ ν΄λμ€μμλ μ¬μ¬μ© ν μ μλ κ°μ²΄ μμ±μ ν μ μλ€ |
| 27 | + |
| 28 | +μ°¨μ΄μ μ΄λΌλ©΄ μμ±μλ λ§€λ² μλ‘μ΄ κ°μ²΄λ₯Ό λ§λ€μ§λ§ ν©ν 리 λ©μλλ ν΄λμ€ λ΄λΆμ νλ² λ§λ€μ΄μ μΊμ±ν΄λκ³ μ¬μ©ν μ μλ€ (미리 λ§λ€μ΄ λμκ² μλ€λ λΆλΆ) |
| 29 | + |
| 30 | +```java |
| 31 | +public class Main { |
| 32 | + /** |
| 33 | + * The {@code Boolean} object corresponding to the primitive |
| 34 | + * value {@code true}. |
| 35 | + */ |
| 36 | + public static final Boolean TRUE = Boolean.TRUE; |
| 37 | + |
| 38 | + /** |
| 39 | + * The {@code Boolean} object corresponding to the primitive |
| 40 | + * value {@code false}. |
| 41 | + */ |
| 42 | + public static final Boolean FALSE = Boolean.FALSE; |
| 43 | + |
| 44 | + public static void main(String[] args) { |
| 45 | + Boolean result = Main.valueOf(true); |
| 46 | + System.out.println(result); |
| 47 | + } |
| 48 | + |
| 49 | + public static Boolean valueOf(boolean b) { |
| 50 | + return b ? Main.TRUE : Main.FALSE; |
| 51 | + } |
| 52 | +} |
| 53 | + |
| 54 | +``` |
| 55 | + |
| 56 | +μμ± λΉμ©μ΄ λΉμΌ κ°μ²΄κ° λ°λ³΅ν΄μ μ¬μ©νκ² λλ€λ©΄ μΊμ±ν΄μ μ¬μ¬μ©νλ κ±Έ κΆμ₯νλ€ |
| 57 | + |
| 58 | +μμ± λΉμ©μ΄ λΉμΈλ€λΌλ κ²μ? (μ΄μ μμ±μλ€ λ΄μ© μ°Έκ³ ) |
| 59 | +1. μμ€ν
μ μμμ λ§μ΄ λ¨Ήλ λΆλΆ |
| 60 | + 1. λ©λͺ¨λ¦¬ |
| 61 | + 2. λμ€ν¬ μ¬μ©λ |
| 62 | + 3. λ€νΈμν¬μ λμν |
| 63 | +2. λ°μ΄ν°μ ν¬κΈ°κ° ν¬κ±°λ κ°μ²΄ λ΄λΆμ μ¬λ¬ κ°μ²΄λ€μ ν¬ν¨νλ κ²½μ°λ λ¨μ μμ±/μλ©Έμ΄ μλ μ°κ΄κ΄κ³κ° 볡μ‘ν λΆλΆ |
| 64 | + 1. ν¬κΈ°κ° μμ£Ό ν° Array |
| 65 | + 2. Database Connection |
| 66 | + 3. I/O μμ
μ νμλ‘ νλ Object |
| 67 | +3. (μ±
μ λμ€λ) Expression Objectμ Pattern |
| 68 | + |
| 69 | +```java |
| 70 | +// μ΄λ κ² νλ©΄ λ λλ¦¬λ€ |
| 71 | +static boolean isRomanNumeralSlow(String s) { |
| 72 | + return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" |
| 73 | + + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); |
| 74 | +} |
| 75 | + |
| 76 | +// 미리 μ»΄νμΌ ν΄λμ κ°μ²΄λ₯Ό λΆλ¬ μ¬μ©νλ λ°©μμΌλ‘ κ°μ νλ€ |
| 77 | +private static final Pattern ROMAN = Pattern.compile( |
| 78 | + "^(?=.)M*(C[MD]|D?C{0,3})" |
| 79 | + + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); |
| 80 | + |
| 81 | +static boolean isRomanNumeralFast(String s) { |
| 82 | + return ROMAN.matcher(s).matches(); |
| 83 | +} |
| 84 | +``` |
| 85 | + |
| 86 | +String.matchesκ° κ°μ₯ μ½κ² μ κ· ννμμ λ§€μΉκ° λλμ§ νμΈνλ λ°©λ²μ΄κΈ΄ νμ§λ§ μ±λ₯μ΄ μ€μν μν©μμ λ°λ³΅μ μΌλ‘ μ¬μ©νκΈ°μ μ μ νμ§ μλ€ |
| 87 | + |
| 88 | +## 2. λΆλ³ κ°μ²΄λ₯Ό μ¬μ¬μ©ν λ μνν λΆλΆ |
| 89 | + |
| 90 | +λΆλ³ κ°μ²΄μΈ κ²½μ°μ μμ νκ² μ¬μ¬μ©νλ κ²μ΄ λ§€μ° λͺ
ννλ€ νμ§λ§ λͺλͺ κ²½μ°μ λΆλͺ
νμ§ μμ κ²½μ°κ° μλ€. μ΄λν°λ₯Ό μλ‘ λ€λ©΄, μ΄λν°λ μΈν°νμ΄μ€λ₯Ό ν΅ν΄μ λ€μ μλ κ°μ²΄λ‘ μ°κ²°ν΄μ£Όλ κ°μ²΄λΌ μ¬λ¬κ° λ§λ€ νμκ° μλ€. |
| 91 | + |
| 92 | +Map μΈν°νμ΄μ€κ° μ 곡νλ keySetμ Mapμ΄ λ€μ μλ Set μΈν°νμ΄μ€μ λ·°λ₯Ό μ 곡νλ€. keySetμ νΈμΆν λλ§λ€ μλ‘μ΄ κ°μ²΄κ° λμ¬κ±° κ°μ§λ§ μ¬μ€ κ°μ κ°μ²΄λ₯Ό 리ν΄νκΈ° λλ¬Έμ λ¦¬ν΄ λ°μ Set νμ
μ κ°μ²΄λ₯Ό λ³κ²½νλ©΄, κ²°κ΅μ κ·Έ λ€μ μλ Map κ°μ²΄λ₯Ό λ³κ²½νκ² λλ€. |
| 93 | + |
| 94 | +```java |
| 95 | +public class UsingKeySet { |
| 96 | + public static void main(String[] args) { |
| 97 | + Map<String, Integer> menu = new HashMap<>(); |
| 98 | + menu.put("Burger", 8); |
| 99 | + menu.put("Pizza", 9); |
| 100 | + |
| 101 | + Set<String> names1 = menu.keySet(); |
| 102 | + Set<String> names2 = menu.keySet(); |
| 103 | + |
| 104 | + // μ¬μ¬μ©νλ μ μμμ μ¬μ©νλ MapμΌ κ²½μ° λ€λ₯Έ μͺ½μλ μν₯μ μ€ μ μλ€ |
| 105 | + names1.remove("Burger"); |
| 106 | + System.out.println(names2.size()); // 1 |
| 107 | + System.out.println(menu.size()); // 1 |
| 108 | + } |
| 109 | +} |
| 110 | +``` |
| 111 | + |
| 112 | +## 3. μ무μκ°μμ΄ μ¬μ©νλ©΄ λ¬Έμ λλ λΆλΆμΈ μ€ν λ°μ±/μΈλ°μ± |
| 113 | + |
| 114 | +λΆνμν κ°μ²΄λ₯Ό μμ±νλ λ λ€λ₯Έ λ°©λ²μΌλ‘ μ€ν λ°μ±μ΄ μλ€. μ€ν λ°μ±μ νλ‘κ·Έλλ¨Έκ° ν리미ν°λΈ νμ
κ³Ό λ°μ€ νμ
μ μμ΄ μΈ μ μκ² ν΄μ£Όκ³ λ°μ±κ³Ό μΈλ°μ±μ μλμΌλ‘ ν΄μ€λ€. |
| 115 | + |
| 116 | +μ€ν λ°μ±μ ν리미ν°λΈ νμ
κ³Ό λ°μ€ νμ
μ κ²½κ³κ° μ보μ΄κ² ν΄μ£Όμ§λ§ κ·Έλ λ€κ³ κ·Έ κ²½κ³λ₯Ό μμ μ£Όμ§ μλλ€. |
| 117 | + |
| 118 | +```java |
| 119 | +public class AutoBoxingExample { |
| 120 | + public static void main(String[] args) { |
| 121 | + long start = System.currentTimeMillis(); |
| 122 | + Long sum = 0l; |
| 123 | + for (long i = 0 ; i <= Integer.MAX_VALUE ; i++) { |
| 124 | + sum += i; |
| 125 | + } |
| 126 | + System.out.println(sum); |
| 127 | + System.out.println(System.currentTimeMillis() - start); |
| 128 | + } |
| 129 | +} |
| 130 | +``` |
| 131 | +μ μ½λμμ sum λ³μμ νμ
μ LongμΌλ‘ λ§λ€μκΈ° λλ¬Έμ λΆνμν Long κ°μ²΄λ₯Ό 2μ 31 μ κ³±κ° λ§νΌ λ§λ€κ² λκ³ λλ΅ 6μ΄ μ‘°κΈ λκ² κ±Έλ¦°λ€. νμ
μ ν리미ν°λΈ νμ
μΌλ‘ λ°κΎΈλ©΄ 600 λ°λ¦¬μ΄λ‘ μ½ 10λ°° μ΄μμ μ°¨μ΄κ° λλ€. |
| 132 | + |
| 133 | +λΆνμν μ€ν λ°μ±μ νΌνλ €λ©΄ λ°μ€ νμ
보λ€λ ν리미ν°λΈ νμ
μ μ¬μ©ν΄μΌ νλ€. |
| 134 | + |
| 135 | +## 4. νλ‘κ·Έλλ¨Έμ ν΅μ°°λ ₯μ΄ νμν λΆλΆ |
| 136 | + |
| 137 | +κ°μ²΄μμ±μ λΉμΈλ νΌν΄μΌ νλ€λ‘ μ€ν΄νλ©΄ μλλ€. νΉν JVMμμλ λ³λ€λ₯Έ μΌμ νμ§ μλ μμ κ°μ²΄μ λν΄μλ ν° λΆλ΄μ΄ λμ§ μλλ€κ³ νλ€ |
| 138 | + |
| 139 | +νλ‘κ·Έλ¨μ λͺ
νμ±, κ°κ²°μ±, κΈ°λ₯μ μν΄μλ κ°μ²΄λ₯Ό μΆκ°λ‘ λ§λ€ μλ μμ΄μΌ νλ€ |
| 140 | + |
| 141 | +λ κ°μ²΄ μμ±μ ν¨μ¨μ μΌλ‘ ν΄λ³΄κ² λ€κ³ μ¬μν κ²λ€λ λ€ μΊμ±νκ±°λ μ체 ν(pool)μ λ§λ€μ΄μ μ μ§λ³΄μνκΈ° μ΄λ €μ΄ 볡μ‘ν νλ‘κ·Έλ¨μ λ§λλ κ²λ νΌν΄μΌ νλ λΆλΆμ΄λ€ (JVMμκ² μμν λΆλΆμ μμν΄λΌ κ°λΉμ§ 컬λ ν°λ₯Ό μ λ’°νμ) |
| 142 | + |
| 143 | +[Item50]λ°©μ΄μ 볡μ¬(defensive copy) μ λλΉλλ λ΄μ©μ΄κΈ° λλ¬Έμ κ°μ²΄ μμ±μ ν΄μΌνλ κ²½μ°μ νμ§ μκ³ κΈ°μ‘΄ κ²μ μ¬μ¬μ©ν΄μΌ νλ λΆλΆμ κ°λ°μμ μλμ λ¬λ €μλ€ (νΉμ μ±λ₯ ν
μ€νΈλ₯Ό μ§μ ν΄μ λΉκ΅ν΄λ³΄μλΌ) |
| 144 | + |
| 145 | +μλ‘ λ§λ μμ±μκ° νμν κ²½μ°μ μ¬μ¬μ© κ°λ₯ν λΆλ³ κ°μ²΄λ₯Ό μ¬μ©νλ ꡬλΆμ ν μ μμ΄μΌ νλ€ |
0 commit comments