π 1. λ€μ€μ μμ λ¬Έμ
컬λ μ μ 'μ§ν©, 리μ€νΈ, κ·Έ μΈ'λ‘ κ΅¬λΆνλ νλ‘κ·Έλ¨μ΄ μλ€κ³ νμ.
public class CollectionClassifier {
public static String classify(Set<?> s) {
return "μ§ν©";
}
public static String classify(List<?> s) {
return "μ§ν©";
}
public static String classify(Collection<?> s) {
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, μ€λ²λ‘λ©)λ λ©μλλ€ μ€ μ΄λ λ©μλλ₯Ό νΈμΆν μ§κ° μ»΄νμΌνμμ μ ν΄μ§κΈ° λλ¬Έμ΄λ€. 'HashSet, ArrayList, HashMap'νμ μΌλ‘ λ©μλλ₯Ό νΈμΆνλ κ² μλλΌ forλ¬Έμ μλ 'Collection'νμ μΌλ‘ λ©μλλ₯Ό νΈμΆνλ€. μ¦, νμ μ΄ λ§€λ² λ¬λΌμ§λ λ°νμ κΈ°μ€μΌλ‘ νΈμΆνλ κ²μ΄ μλ μ»΄νμΌνμ κΈ°μ€μΌλ‘ νΈμΆνλ€λ κ²μ΄λ€.
ν΄λΉ λ΄μ©μ΄ μ΅μνμ§ μμ μ΄μ λ μ¬μ μ(overriding, μ€λ²λΌμ΄λ©) λλ¬Έμ΄λ€.
class Wine {
String name() {
return "ν¬λμ£Ό";
}
}
class SparklingWine extends Wine {
@Override
String name() {
return "λ°ν¬μ± ν¬λμ£Ό";
}
}
class Champagne extends Wine {
@Override
String name() {
return "μ΄νμΈ";
}
}
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());
}
}
μ΄ νλ‘κ·Έλ¨μμλ "ν¬λμ£Ό", "λ°ν¬μ± ν¬λμ£Ό", "μ΄νμΈ"μ΄ μΆλ ₯λλ€.
κ·Έ μ΄μ λ μ¬μ μν λ©μλ(μ€λ²λΌμ΄λ©)λ λμ μΌλ‘ μ νλκ³ , λ€μ€μ μν λ©μλ(μ€λ²λ‘λ©)λ μ μ μΌλ‘ μ νλκΈ° λλ¬Έμ΄λ€.
컬λ μ μ λΆλ₯νλ νλ‘κ·Έλ¨μ λ€μκ³Ό κ°μ λ°©λ²μΌλ‘ μ°λ¦¬κ° μνλ λμμ μννκ² ν μ μλ€.
public static String classify(Collection<?> c) {
return c instanceof Set ? "μ§ν©" :
c instanceof List ? "리μ€νΈ" " "κ·Έ μΈ";
}
π 2. λ€μ€μ μμ λ¬Έμ μμ
λ€μ€μ μ λ¬Έμ μ μμλ€μ μ‘°κΈ λ μ΄ν΄λ³΄μ.
π 1. μ λ€λ¦κ³Ό μ€ν λ°μ±μ λ°λ₯Έ λ¬Έμ
μλ° μΈμ΄μ μ λ€λ¦κ³Ό μ€ν λ°μ±μ λν κ²°κ³Ό List μΈν°νμ΄μ€κ° μ·¨μ½ν΄μ‘λ€.
public static void main(String[] args) {
Set<Integer> set = new TreeSet<>();
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
for(int i = -3; i < 3; i++) {
set.add(i);
list1.add(i);
list2.add(i);
}
for(int i = 0; i < 3; i++) {
set.remove(i);
list1.remove(i);
list2.remove((Integer) i);
}
System.out.println(set);
// [-3, -2, -1]
System.out.println(list1);
// [-2, 0, 2]
System.out.println(list2);
// [-3, -2, -1]
}
list2κ° μλ€κ³ μκ°νλ©΄ list1μμλ setκ³Ό λμΌνκ² κ° "0", "1", "2"λ₯Ό μ κ±°νμ¬ "[-3, -2, -1]"μ μ»μ κ±°λΌκ³ μκ°νμ κ²μ΄λ€. νμ§λ§, list1μ κ²½μ° remove(Object)κ° μλ remove(int index)λ‘ λ€μ€μ μλ λ©μλλ₯Ό μ ννμ¬ μ°¨λ‘λ‘ 0λ²μ§Έ, 1λ²μ§Έ, 2λ²μ§Έ μμλ₯Ό μ κ±°νμ¬ "[-2, 0, 2]"κ° λ¨κ² λλ κ²μ΄λ€. μμν λλ‘ μ¬μ©νλ €λ©΄ list2μ²λΌ 'list2.remove((Integer) i)'λ₯Ό μ¬μ©ν΄μΌ νλ€.
π 2. λλ€μ λ©μλ μ°Έμ‘°μ λ°λ₯Έ λ¬Έμ
μλ° 8μμ λμ ν λλ€μ λ©μλ μ°Έμ‘° μμ λ€μ€μ μ μμ νΌλμ ν€μ λ€.
// 1λ². Threadμ μμ±μ νΈμΆ
new Thread(System.out::println).start();
// 2λ². ExecutorServiceμ submit λ©μλ νΈμΆ
ExecutorService exec = Executors.newCachedThreadPool();
exec.submit(System.out::println);
1λ²κ³Ό 2λ²μ΄ λΉμ·ν΄ 보μ΄μ§λ§, 2λ²μμ μ»΄νμΌ μ€λ₯κ° λλ€. κ·Έ μ΄μ λ submit λ€μ€ μ μ λ©μλ μ€μλ Callable<T>λ₯Ό λ°λ λ©μλκ° μκΈ° λλ¬Έμ΄λ€.
2λ²μ κ²½μ° 1λ²κ³Ό κ°μ΄ Runnableμ λ°μΌλ €κ³ νμλλ° Callable<T>μ λ°λ λ©μλλ κ°μ΄ μλ κ²½μ°λ€. 'System.out::println'μ voidλ₯Ό λ°ννλλ° Callableμ κ²½μ°λ λ°νκ°μ΄ μμ΄μΌ νκΈ° λλ¬Έμ μ»΄νμΌ μλ¬κ° λ°μνλ κ²μ΄λ€.
π 3. λ€μ€μ μ λ¬Έμ μ ν΄κ²°μ±
μ§κΈκΉμ§ μ΄ν΄λ³Έ κ²μ²λΌ λ€μ€μ μλ₯Ό μ¬μ©νλ©΄ μ¬λ¬ κ°μ§ λ¬Έμ κ° λ°μν μ μλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν ν΄κ²°μ± λ€μ μ΄ν΄λ³΄μ.
π 1. λ€μ€μ μκ° νΌλμ μΌμΌν€λ μν©μ νΌνμ.
μμ νκ³ λ³΄μμ μΌλ‘ κ°λ €λ©΄ 맀κ°λ³μ μκ° κ°μ λ€μ€μ μλ λ§λ€μ§ λ§μμΌ νλ€.
π 2. κ°λ³μΈμ(varargs)λ₯Ό μ¬μ©νλ λ©μλλΌλ©΄ λ€μ€μ μλ₯Ό μμ νμ§ λ§μμΌ νλ€.
π 3. λ€μ€μ μνλ λμ λ©μλ μ΄λ¦μ λ€λ₯΄κ² μ§μ.
java.io.ObjectOutputStream ν΄λμ€μ²λΌ λ€μ€μ μνλ λμ λ©μλ μ΄λ¦μ λ€λ₯΄κ² μ§μ΄μ€ μ μλ€.
- writeBoolean(boolena)
- writeInt(int)
- writeLong(long)
- readBoolean()
- readInt()
- readLong()
π 4. μ μ ν©ν°λ¦¬λ₯Ό νμ©νμ.
μμ±μμ κ²½μ° μ΄λ¦μ λ€λ₯΄κ² μ§μ μ μλ€. μ΄λ¬ν κ²½μ°μλ μ μ ν©ν°λ¦¬λ₯Ό μ΄μ©ν μ μλ€.
ν΄λΉ κΈμ Joshua Bloch λμ 'Effective Java 3/E'λ₯Ό μ°Έκ³ νμμ΅λλ€.