item 62 SeungminLee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
item 62
λ€λ₯Έ νμ μ΄ μ μ νλ€λ©΄ λ¬Έμμ΄ μ¬μ©μ νΌνλΌ
ν΅μ¬μ 리
λ°λ‘ λ¬Έμμ΄μ μ°κΈ° 보λ€λ λ°μ΄ν°μ λ μ ν©ν νμ μ μ°Ύμμ£Όκ±°λ μλ‘ μμ±μ νμ. νΈνκΈ° μν΄ λ¬Έμμ΄μ μ¬μ©νλ©΄ κ²°κ΅ λ λ²κ±°λ½κ³ , λ μ μ°νκ³ , λλ¦¬κ³ μ€λ₯ κ°λ₯μ±λ 컀μ§λ€. λ¬Έμμ΄μ μ°κΈ° μ μ λ μ ν©ν νμ μ μλμ§ κΈ°λ³Ένμ , μ΄κ±° νμ , νΌν© νμ μ λ€μ ν λ² μκ°ν΄λ³΄μ.
λ¬Έμμ΄μ λ€λ₯Έ κ° νμ μ λμ νκΈ°μ μ ν©νμ§ μλ€.
λ¬Έμμ΄μ ν μ€νΈλ₯Ό νννλλ‘ μ€κ³λμκ³ , κ·Έ μΌμ μμ£Ό λ©μ§κ² ν΄λΈλ€. κ·Έλ°λ° λ¬Έμμ΄μ΄ μλ ννκ³ μλ°κ° μ μ§μμ ν΄μ£Όλ€λ³΄λ μλ μλνμ§ μμ μ©λλ‘ μ°μ΄λ κ²½ν₯μ΄ μλ€. λνμ μΈ μλ‘ λ§μ μ¬λλ€μ΄ νμΌ, λ€νΈμν¬, ν€λ³΄λ μ λ ₯μΌλ‘ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ λ μ£Όλ‘ λ¬Έμμ΄μ μ¬μ©νλλ° μ΄λ μ μ νμ§ μμ λ°©μμ΄λ€.
λ°μ λ°μ΄ν°κ° μμΉνμ΄λΌλ©΄ int, float λ± μ λΉν μμΉ νμ μΌλ‘ λ³ννλκ² μ’κ³ , μ/μλμ€ μ§λ¬Έμ΄λΌλ©΄ μ΄κ±°νμ μ΄λ booleanμΌλ‘ λ³ννλκ² μ’λ€. κΈ°λ³Έ νμ μ΄λ μ°Έμ‘° νμ μ΄λ μ μ ν κ° νμ μ΄ μλ€λ©΄ κ·Έκ²μ μ¬μ©νκ³ , μλ€λ©΄ μλ‘ νλ μμ±νλΌ.
λ¬Έμμ΄μ μ΄κ±° νμ μ λμ νκΈ°μ μ ν©νμ§ μλ€.
(μμ΄ν 24) μμλ₯Ό μ΄κ±°ν λλ λ¬Έμμ΄λ³΄λ€λ μ΄κ±°νμ μ΄ μλ±ν λ«λ€.
// λ¬Έμ μμ
public static final String CHEESE_PIZZA = "cheese pizza"
public static final String CHEESE_BURGER = "cheese burger"
public static final String CHEESE_STICK = "cheese stick"
// μ΄κ±°νμΌλ‘ λ³ν
public enum Cheese { PIZZA, BURGER, STICK }
λ¬Έμμ΄μ νΌν© νμ μ λμ νκΈ°μ μ ν©νμ§ μλ€.
μ¬λ¬ μμκ° νΌν©λ λ°μ΄ν°λ₯Ό νλμ λ¬Έμμ΄λ‘ νννλ κ²μ λμ²΄λ‘ μ’μ§ μμ μκ°μ΄λ€.
String compoundKey = className + "#" + i.next();
- ꡬλΆμμΈ '#' λ¬Έμκ° classNameμ΄λ i.next νΌλμ€λ¬μ΄ κ²°κ³Όλ₯Ό μ΄λνλ€.
- κ° μμλ₯Ό κ°λ³λ‘ μ κ·Όνλ €λ©΄ λ¬Έμμ΄μ νμ±ν΄μΌ ν΄μ λλ¦¬κ³ , μ€λ₯ κ°λ₯μ±κΉμ§ 컀μ§λ€.
- μ μ ν equals, toString, compareTo λ©μλλ₯Ό μ 곡ν μ μμΌλ©°, Stringμ΄ μ 곡νλ κΈ°λ₯μλ§ μμ‘΄ν΄μΌ νλ€.
- μ΄λ° κ²½μ° μ°¨λΌλ¦¬ μ μ© ν΄λμ€λ₯Ό μλ‘ λ§λλ κ² μ’μΌλ©° private μ μ λ§΄λ² ν΄λμ€ ννλ‘ λ§λ λ€.
public class TestClass {
private String dummy;
private static class testInnerClass {
public void printMethod() {}
}
}
λ¬Έμμ΄μ κΆνμ νννκΈ°μ μ ν©νμ§ μλ€.
public class ThreadLocal {
private ThreadLocal() {}
// νμ¬ μ€λ λμ κ°μ ν€λ‘ ꡬλΆν΄μ μ μ₯νλ€.
public static void set(String key, Object value);
// ν€κ° κ°λ¦¬ν€λ νμ¬ μ€λ λμ κ°μ λ°ννλ€.
public static Object get(String key);
}
κ°λ κΆνμ λ¬Έμμ΄λ‘ νννλ κ²½μ°κ° μ’ μ’ μλ€. μμ μ½λλ μ€λ λ μ§μλ³μ κΈ°λ₯μ μ€κ³ν λ κ° μ€λ λκ° μμ λ§μ λ³μλ₯Ό κ°κ² ν΄μ£Όλ μΌμ νλ€. μ΄ μ½λλ keyλΌλ κΆνμ λ¬Έμμ΄λ‘ κ΄λ¦¬νκ³ μλλ° λ¬΄μ¨ λ¬Έμ κ° μμκΉ?
- μ€λ λ ꡬλΆμ© λ¬Έμμ΄ ν€κ° μ μ μ΄λ¦κ³΅κ°μμ 곡μ λκ³ μλ€.
- μ²μμ μλλλ‘ λμνλ €λ©΄ κ° ν΄λΌμ΄μΈνΈκ° κ³ μ ν ν€λ₯Ό μ 곡ν΄μΌ νλ€.
- ν€κ° μ μ곡κ°μμ 곡μ λκ³ μκΈ° λλ¬Έμ μλμ§ μκ² κ°μ ν€λ₯Ό μ°λ©΄ κ°μ λ³μλ₯Ό 곡μ νκ² λλ€.
- κ²°κ΅ ν€λ₯Ό κ°μ§κ³ μλ ν΄λΌμ΄μΈνΈλ€μ΄ λͺ¨λ μ κΈ°λ₯μ νμ§ λͺ»ν κ²μ΄κ³ , μ μμ μΈ ν΄λΌμ΄μΈνΈλ μ¬μ§μ΄ μλμ μΌλ‘ κ°μ ν€λ₯Ό μ¬μ©ν΄ λ€λ₯Έ ν΄λΌμ΄μΈνΈμ κ°μ κ°μ·¨ν μ μλ€.
- λ¬Έμμ΄ λμ μμ‘°ν μ μλ Key classλ₯Ό μ¬μ©ν΄μ ν΄κ²°ν μ μλ€.
ThreadLocal class κ°μ 1
public class ThreadLocal {
private ThreadLocal() {}
public static class Key {
Key() {}
}
// μμ‘°κ° λΆκ°λ₯ν κ³ μ ν€ μμ±
public static Key getKey() {
return new Key();
}
public static void set(Key key, Object value);
public static Object get(Key key);
}
ThreadLocal class κ°μ 2
public final class ThreadLocal {
public ThreadLocal();
public void set(Object value);
public Object get();
}
- 1μμ 곡μ νμ§ μμ κ³ μ keyλ₯Ό μ¬μ©νκΈ° λλ¬Έμ κ°μ 2μμ getκ³Ό setμ keyμ ν΄λμ€ μΈμ€ν΄μ€ λ©μλλ‘ λ°κΏ¨λ€.
- μ΄λ κ² ν¨μΌλ‘ Keyλ λ μ΄μ μ€λ λ μ§μλ³μλ₯Ό ꡬλΆνκΈ° μν ν€κ° μλλΌ Key μμ²΄κ° μ€λ λ μ§μλ³μκ° λλ€.
- κ·Έλμ ν±ν΄λμ€μ ThreadLocalμ λ λ €λ²λ¦¬κ³ Keyλ₯Ό ThreadLocalλ‘ λ°κΏλ²λ Έλ€.
- λ¬Έμ μ : Objectλ₯Ό μ€μ νμ μΌλ‘ casting ν΄μΌ ν΄μ νμ μμ νμ§ μλ€.
- νμ μΈμ΄ννκ² λ§λ€κΈ° μν΄ ThreadLocalμ 맀κ°λ³μν νμ (μ λ€λ¦)μΌλ‘ λ§λ€μ΄λ³΄μ.
ThreadLocal class μ΅μ’ λ³Έ
public final class ThreadLocal<T> {
public ThreadLocal();
public void set(T value);
public T get();
}
β νΌν© νμ μ StringμΌλ‘ νμΉλ λ¬Έμ λ₯Ό ν΄κ²°νκ³ , ν€(String ν€, public static class Key) λ³΄λ€ λΉ λ₯΄κ³ μ°μν μ½λκ° μμ±λμλ€!