item 52 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- λ€μμ 컬λ μ μ μ§ν©, 리μ€νΈ, κ·Έ μΈλ‘ ꡬλΆνκ³ μ λ§λ νλ‘κ·Έλ¨μ΄λ€.
// μ½λ 52-1 컬λ μ
λΆλ₯κΈ° - μ€λ₯! μ΄ νλ‘κ·Έλ¨μ 무μμ μΆλ ₯ν κΉ? (312μͺ½)
public class CollectionClassifier {
public static String classify(Set<?> s) {
return "μ§ν©";
}
public static String classify(List<?> lst) {
return "리μ€νΈ";
}
public static String classify(Collection<?> c) {
return "κ·Έ μΈ";
}
public static void main(String[] args) {
Collection<?>[] collections = {
new HashSet<String>(),
new ArrayList<BigInteger>(),
new HashMap<String, String>().values()
};
for (Collection<?> c : collections)
System.out.println(classify(c));
}
}
- μ€μ λ‘ μ€νν΄λ³΄λ©΄ "κ·Έ μΈ"λ§ μΈλ² μ°λ¬μ μΆλ ₯νλ€.
- λ€μ€μ μ (overloading, μ€λ²λ‘λ©)λ μΈ classify μ€ μ΄λ λ©μλλ₯Ό νΈμΆν μ§κ° μ»΄νμΌ νμμ μ ν΄μ§κΈ° λλ¬Έμ΄λ€.
- μ»΄νμΌ νμμλ forλ¬Έ μμ cλ νμ Collection<?> νμ μ΄λ€. λ°νμμλ λ§€λ² λ¬λΌμ§μ§λ§, νΈμΆν λ©μλλ₯Ό μ ννλ λ°λ μν₯μ μ£Όμ§ λͺ»νλ€.
- μ»΄νμΌ νμμ 맀κ°λ³μ νμ μ κΈ°μ€μΌλ‘ νμ μΈ λ²μ§Έ λ©μλμΈ classify(Collection<?>)λ§ νΈμΆνλ κ²μ΄λ€.
μ΄μ²λΌ μ§κ΄κ³Ό μ΄κΈλλ μ΄μ λ μ¬μ μν λ©μλλ λμ μΌλ‘ μ νλκ³ λ€μ€μ μν λ©μλλ μ μ μΌλ‘ μ νλκΈ° λλ¬Έμ΄λ€.
λ©μλλ₯Ό μ¬μ μνλ€λ©΄ ν΄λΉ κ°μ²΄μ λ°νμ νμ μ΄ μ΄λ€ λ©μλλ₯Ό νΈμΆν μ§μ κΈ°μ€μ΄ λλ€.
λ©μλ μ¬μ μλ μμ ν΄λμ€κ° μ μν κ²κ³Ό λκ°μ μκ·Έλμ²μ λ©μλλ₯Ό νμ ν΄λμ€μμ λ€μ μ μν κ²μ λ§νλ€.
λ©μλλ₯Ό μ¬μ μ ν λ€μ 'νμ ν΄λμ€μ μΈμ€ν΄μ€'μμ κ·Έ λ©μλλ₯Ό νΈμΆνλ©΄ μ¬μ μν λ©μλκ° μ€νλλ€. μ»΄νμΌ νμμ κ·Έ μΈμ€ν΄μ€μ νμ μ΄ λ¬΄μμ΄μλλ μκ΄μλ€.
// μ¬μ μλ λ©μλ νΈμΆ λ©μ»€λμ¦ (313μͺ½, μ½λ 52-2μ μΌλΆ)
class Wine {
String name() { return "ν¬λμ£Ό"; }
}
class SparklingWine extends Wine {
@Override String name() { return "λ°ν¬μ± ν¬λμ£Ό"; }
}
class Champagne extends SparklingWine {
@Override String name() { return "μ΄νμΈ"; }
}
// wine ν΄λμ€μ μ μλ name λ©μλλ νμ ν΄λμ€μΈ SparklingWine, Champagneμμ μ¬μ μλλ€.
// "ν¬λμ£Ό", "λ°ν¬μ± ν¬λμ£Ό", "μ΄νμΈ"μ μ°¨λ‘λ‘ μΆλ ₯νλ€.
// forλ¬Έμμμ μ»΄νμΌ νμ νμ
μ΄ λͺ¨λ wineμΈ κ²μ 무κ΄νκ² νμ 'κ°μ₯ νμμμ μ μν' μ¬μ μ λ©μλκ° μ€νλλ κ²μ΄λ€.
public class Overriding {
public static void main(String[] args) {
List<Wine> wineList = List.of(
new Wine(), new SparklingWine(), new Champagne());
for (Wine wine : wineList)
System.out.println(wine.name());
}
}
μ νμ μ»΄νμΌ νμμ, μ€μ§ 맀κ°λ³μμ μ»΄νμΌνμ νμ μ μν΄ μ΄λ€μ§λ€.
μ½λ 52-1μ CollectionClassifier μμμ νλ‘κ·Έλ¨μ μλ μλλ 맀κ°λ³μμ λ°νμ νμ μ κΈ°μ΄ν΄ μ μ ν λ€μ€μ μ λ©μλλ‘ μλ λΆλ°°νλ κ²μ΄μλ€. μ½λ 52-2μ Wine μμμμ name λ©μλμ λκ°μ΄ λ§μ΄λ€.
κ°λ³ μΈμλ₯Ό μ¬μ©νλ λ©μλλΌλ©΄ λ€μ€μ μλ₯Ό μμ νμ§ λ§μμΌ νλ€.(μμ΄ν 53μ μμΈ μ°Έκ³ )
- λ€μ€μ μνλ λμ λ©μλ μ΄λ¦μ λ€λ₯΄κ² μ§μ΄μ£Όλ κΈΈλ νμ μ΄λ € μμΌλ λ§μ΄λ€.
ObjectOutputStream μμ
- μ΄ ν΄λμ€μ write λ©μλλ λͺ¨λ κΈ°λ³Έ νμ κ³Ό μΌλΆ μ°Έμ‘° νμ μ© λ³νμ κ°μ§κ³ μλ€. κ·Έλ°λ° λ€μ€μ μκ° μλ λͺ¨λ λ©μλμ λ€λ₯Έ μ΄λ¦μ μ§μ΄μ£Όλ κΈΈμ ννλ€.
- writeBoolean(boolean), writeInt(int), writeLong(long) κ°μ μμ΄λ€.
- μ΄ λ°©μμ΄ λ€μ€μ μλ³΄λ€ λλ λ λ€λ₯Έ μ μ read λ©μλμ μ΄λ¦κ³Ό μ§μ λ§μΆκΈ° μ’λ€λ κ²μ΄λ€. ObjectInputStream ν΄λμ€μ read λ©μλλ μ€μ λ‘λ readBoolean(boolean), readInt(int), readLong(long) μ΄λ κ² λμ΄ μλ€.
μμ±μμ μ΄λ¦μ λ€λ₯΄κ² μ§μ μ μμΌλ λλ²μ§Έ μμ±μλΆν°λ 무쑰건 λ€μ€μ μκ° λλ€.
- μ μ ν©ν°λ¦¬λΌλ λμμ νμ©ν μ μλ κ²½μ°κ° λ§λ€.
- λν μμ±μλ μ¬μ μ ν μ μμΌλ λ€μ€μ μμ μ¬μ μκ° νΌμ©λ κ±±μ μ λ£μ΄λ¬λ λλ€.
- μ¬λ¬ μμ±μκ° κ°μ μμ 맀κ°λ³μλ₯Ό λ°μμΌ νλ κ²½μ°λ₯Ό μμ ν νΌν΄κ° μλ μμ ν λ κ·Έλ΄ λλ₯Ό λλΉν΄ μμ λμ± μ λ°°μλλ©΄ λμμ΄ λ κ²μ΄λ€.
맀κ°λ³μ μκ° κ°μ λ€μ€μ μ λ©μλκ° λ§λλΌλ κ·Έμ€ μ΄λ κ²μ΄ μ£Όμ΄μ§ 맀κ°λ³μ μ§ν©μ μ²λ¦¬ν μ§κ° λͺ νν ꡬλΆλλ€λ©΄ ν·κ°λ¦΄ μΌμ μμ κ²μ΄λ€.
μ¦ λ§€κ°λ³μ μ€ νλ μ΄μμ΄ "κ·Όλ³Έμ μΌλ‘ λ€λ₯΄λ€" λ©΄ ν·κ°λ¦΄ μΌμ΄ μλ€. κ·Όλ³Έμ μΌλ‘ λ€λ₯΄λ€λ 건 λ νμ μ κ°μ μλ‘ μ΄λ μͺ½μΌλ‘λ νλ³νν μ μλ€λ λ»μ΄λ€. μ΄ μ‘°κ±΄λ§ μΆ©μ‘±νλ©΄ μ΄λ λ€μ€μ μ λ©μλλ₯Ό νΈμΆν μ§κ° 맀κ°λ³μλ€μ λ°νμ νμ λ§μΌλ‘ κ²°μ λλ€.
- μλ° 4κΉμ§λ λͺ¨λ κΈ°λ³Έ νμ μ΄ λͺ¨λ μ°Έμ‘° νμ κ³Ό κ·Όλ³Έμ μΌλ‘ λ¬λμ§λ§ μλ° 5μμ μ€ν λ°μ±μ΄ λμ λλ©΄μ ννλ‘λ μλκ° λ§μ λ΄λ Έλ€.
ν΅μ¬ μ 리
μΌλ°μ μΌλ‘ 맀κ°λ³μ μκ° κ°μ λλ λ€μ€μ μλ₯Ό νΌνλκ² μ’λ€.
νΉν μμ±μλΌλ©΄ μ΄ μ‘°μΈμ λ°λ₯΄κΈ°κ° λΆκ°λ₯ν μμλ€. κ·Έλ΄ λλ ν·κ°λ¦΄ λ§ν 맀κ°λ³μλ νλ³ννμ¬ μ νν λ€μ€μ μ λ©μλκ° μ νλλλ‘ ν΄μΌ νλ€.
μ΄κ²μ΄ λΆκ°λ₯νλ©΄ μ컨λ κΈ°μ‘΄ ν΄λμ€λ₯Ό μμ ν΄ μλ‘μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌν λλ κ°μ κ°μ²΄λ₯Ό μ
λ ₯λ°λ λ€μ€ μ μ λ©μλλ€μ΄ λͺ¨λ λμΌνκ² λμνλλ‘ λ§λ€μ΄μΌ νλ€.