μ λ€λ¦
- μλ° 5λΆν° μ¬μ© κ°λ₯
- κ°μ²΄λ₯Ό κΊΌλΌ λλ§λ€ νλ³νν νμ μμ
- 컬λ μ μ΄ λ΄μ μ μλ νμ μ μ»΄νμΌλ¬μ μλ €μ€ π μ»΄νμΌλ¬λ μμμ νλ³ν μ½λλ₯Ό μΆκ°
- ν΄λμ€μ μΈν°νμ΄μ€ μ μΈμ νμ 맀κ°λ³μκ° μ¬μ©λ¨ π μ λ€λ¦ ν΄λμ€ or μ λ€λ¦ μΈν°νμ΄μ€ = μ λ€λ¦ νμ
- 맀κ°λ³μν νμ = List<String> π Stringμ μ κ· νμ 맀κ°λ³μ E (List<E>)μ ν΄λΉνλ μ€μ νμ 맀κ°λ³μ
26. Raw νμ μ μ¬μ©νμ§ λ§κΈ°
raw νμ μ΄λ μ λ€λ¦ νμ μμ νμ 맀κ°λ³μλ₯Ό μ ν μ¬μ©νμ§ μμ λλ₯Ό λ§ν¨
ex). List<E>μ raw νμ μ Listμ
π κ²°λ‘ λΆν° λ§νμλ©΄, μ€λ₯κ° λ°μνκ³ νμ°Έ λ€μΈ λ°νμμμΌ μμμ± μ μκΈ° λλ¬Έ !
β³οΈ 컬λ μ μ raw νμ μ μ¬μ©ν κ²½μ°
// Stamp μΈμ€ν΄μ€λ§ μ·¨κΈ
private final Collection stamps = ...;
// μ€μλ‘ λμ μ λ£μ
stamps.add(new Coin(...));
for(Iterator i = stamps.iterator(); i.hasNext();){
Stamp stamp = (Stamp) i.next(); // ClassCastException λμ§
stamp.cancel();
}
β³οΈ 맀κ°λ³μνλ 컬λ μ νμ π νμ μμ μ± ν보
private final Collection<Stamp> stamps = ...;
μ»΄νμΌλ¬λ stampsμ Stampμ μΈμ€ν΄μ€λ§ λ£μ΄μΌ ν¨μ μΈμ§νλ―λ‘ stampsμ μλ±ν νμ
μ μΈμ€ν΄μ€λ₯Ό λ£μΌλ € νλ©΄ stamps.add(new Coin());
μ»΄νμΌ μ€λ₯ λ°μ
π€·βοΈ κ·ΈλΌ μ raw νμ μ΄ μλκ±΄κ° ?
π λ°λ‘ νΈνμ± λλ¬Έ !
μ λ€λ¦ μμ΄ μ§ μ½λλ₯Ό λͺ¨λ μμ©νλ©΄μ μ λ€λ¦μ μ¬μ©νλ μλ‘μ΄ μ½λμ λ§λ¬Όλ € λμκ°κ² ν΄μΌλ§ νκΈ° λλ¬Έμ
public static void main(String[] args){
List<String> strings = new ArrayList<>();
unsafeAdd(strings, Integer.valueOf(42));
String s = strings.get(0); // μ»΄νμΌλ¬κ° μλμΌλ‘ νλ³ν μ½λλ₯Ό λ£μ΄μ€
}
private static void unsafeAdd(List list, Object o){
list.add(o);
}
μμ μ½λλ μ»΄νμΌμ λμ§λ§ raw νμ μΈ Listλ₯Ό μ¬μ©νμ¬ κ²½κ³ ([unchecked] unchecked call to add(E) as a member of the raw type List)κ° λ°μνλ€.
μ΄λλ‘ μ€ννλ©΄ strings.get(0)μ κ²°κ³Όλ₯Ό νλ³ννλ € ν λ ClassCastExceptionμ λμ Έ μ€ν¨νκ² λλ€.
Listλ₯Ό 맀κ°λ³μν νμ μΈ List<Object>λ‘ λ°κΎΈκ³ μ»΄νμΌνλ©΄ μ»΄νμΌ μ‘°μ°¨ λμ§ μλλ€.
κ·Έ μ΄μ λ μ λ€λ¦μ νμ νμ κ·μΉ λλ¬Έμ΄λ€.
List<String>μ raw νμ μΈ Listμ νμ νμ μ΄μ§λ§, List<Object>μ νμ νμ μ μλκΈ° λλ¬Έμ΄λ€.
β³οΈ μ λ€λ¦ νμ
μ μ°κ³ μΆμ§λ§ μ€μ νμ
맀κ°λ³μκ° λ¬΄μμΈμ§ μ κ²½ μ°κ³ μΆμ§ μλ€λ©΄ λ¬Όμν(?) μ¬μ©νκΈ°
π λΉνμ μ μμΌλμΉ΄λ νμ
static int numElementsInCommon(Set<?> s1, Set<?> s2) { ... }
- νμ μμ νλ©° μ μ°
- Collection<?>μλ (null μΈμλ) μ΄λ€ μμλ λ£μ μ μμ
Collection<?> collection = new ArrayList<String>();
collection.add("Hello"); // μ»΄νμΌ μ€λ₯
collection.add(123); // μ»΄νμΌ μ€λ₯
collection.add(null); // νμ©λ¨
// μ½κΈ°λ κ°λ₯
Object element = collection.iterator().next();
β΄οΈ Raw νμ μ μ¬μ©νλ μμΈ
- class 리ν°λ΄
- List.class, String[].class, int.class νμ©
- List<String>.class, List<?>.class νμ© X
- instanceof μ°μ°μ
- λ°νμμλ μ λ€λ¦ νμ μ λ³΄κ° μ§μμ§λ―λ‘ instanceof μ°μ°μλ λΉνμ μ μμΌλμΉ΄λ νμ μ΄μΈμ 맀κ°λ³μν νμ μλ μ μ© λΆκ°
- raw νμ κ³Ό λΉνμ μ μμΌλμΉ΄λ νμ λͺ¨λ λκ°μ΄ λμ
if(o instanceof Set){ // raw νμ
Set<?> s = (Set<?>) o; // μμΌλμΉ΄λ νμ
...
}
27. λΉκ²μ¬ κ²½κ³ μ κ±°νκΈ°
- κ²½κ³ λ₯Ό μ κ±°ν μ μμ§λ§ νμ
μμ νλ€κ³ νμ ν μ μλ€λ©΄ @SuppressWarnings("unchecked") μ΄λ
Έν
μ΄μ
μ λ¬μ κ²½κ³ μ¨κΈ°κΈ°
π κ°λ₯ν ν μ’μ λ²μμ μ μ© (λ³μ μ μΈ, μμ£Ό 짧μ λ©μλ, μμ±μ) -> ν΄λμ€ μ 체 μ μ© X - κ²½κ³ λ₯Ό μ¨κΈ°κΈ°λ‘ ν κ·Όκ±°λ₯Ό μ£ΌμμΌλ‘ λ¨κΈ°κΈ°
28. λ°°μ΄λ³΄λ€λ 리μ€νΈ μ¬μ©νκΈ°
β³οΈ λ°°μ΄κ³Ό μ λ€λ¦ νμ μ μ°¨μ΄
- λ°°μ΄
- κ³΅λ³ (ν¨κ» λ³ν)
- Subκ° Superμ νμνμ μ΄λΌλ©΄ λ°°μ΄ Sub[]λ λ°°μ΄ Super[]μ νμ νμ μ΄ λ¨
- new List<E>[], new List<String>[], new E[] λ μ»΄νμΌν λ μ λ€λ¦ λ°°μ΄ μμ± μ€λ₯ λ°μ
- λ°νμμλ νμ μμ νμ§λ§, μ»΄νμΌ νμμλ X
- μ λ€λ¦
- λΆκ³΅λ³ (ν¨κ» λ³ν X)
- μλ‘ λ€λ₯Έ νμ Type1κ³Ό Type2κ° μμ λ, List<Type1>μ List<Type2>μ νμ νμ λ μλκ³ μμ νμ λ μλ
- μμμ νμ μ λ³΄κ° μκ±°λμ΄ λ°νμμλ λ¬΄μ¨ νμ μΈμ§ μ μ μμ
- μ»΄νμΌ νμμλ νμ μμ νμ§λ§, λ°νμμλ μμ X
π μμ κ°μ μ°¨μ΄λ‘ λ°°μ΄κ³Ό μ λ€λ¦μ μ μ΄μ°λ¬μ§μ§ λͺ»ν¨
λ°°μ΄λ‘ νλ³νν λ μ λ€λ¦ λ°°μ΄ μμ± μ€λ₯λ λΉκ²μ¬ νλ³ν κ²½κ³ κ° λ¨λ κ²½μ° λλΆλΆμ λ°°μ΄μΈ E[] λμ 컬λ μ μΈ List<E>λ₯Ό μ¬μ©νλ©΄ ν΄κ²°λ¨
29. μ΄μμ΄λ©΄ μ λ€λ¦ νμ μΌλ‘ λ§λ€κΈ°
30. μ΄μμ΄λ©΄ μ λ€λ¦ λ©μλλ‘ λ§λ€κΈ°
public static <E> Set<E> union(Set<E> s1, Set<E> s2){
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
return result;
}
π λ§μ½ <E>λ₯Ό λ©μλ μμ μ μΈνμ§ μλλ€λ©΄, μ»΄νμΌλ¬λ Eκ° λ¬΄μμ μλ―Ένλμ§ μ μ μμ
β³οΈ μ¬κ·μ νμ νμ
// 컬λ μ
μμ μ΅λκ° λ°ν
// λͺ¨λ νμ
Eλ μμ κ³Ό λΉκ΅ν μ μμ
public static <E extends Comparable<E>> E max(Collection<E> c){
if(c.isEmpty())
throw new IllegalArgumentException("컬λ μ
μ΄ λΉμ΄μμ΅λλ€");
E result = null;
for(E e : c)
if(result == null || e.compareTo(result) > 0)
result = Objects.requireNonNull(e);
return result;
}
π μκΈ° μμ μ΄ λ€μ΄κ° ννμμ μ¬μ©νμ¬ νμ 맀κ°λ³μμ νμ© λ²μ νμ
'Java > π Effective Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[πEffective Java] μ΄κ±° νμ κ³Ό μ΄λ Έν μ΄μ δΈ (1) | 2024.11.18 |
---|---|
[π Effective Java] μ΄κ±° νμ κ³Ό μ΄λ Έν μ΄μ δΈ (0) | 2024.11.10 |
[π Effective Java] ν΄λμ€μ μΈν°νμ΄μ€ δΈ (1) | 2024.10.06 |
[π Effective Java] ν΄λμ€μ μΈν°νμ΄μ€ δΈ (2) | 2024.10.05 |
[π Effective Java] ν΄λμ€μ μΈν°νμ΄μ€ δΈ (1) | 2024.09.25 |