ν΄λμ€μ λ§μ°¬κ°μ§λ‘, λ©μλλ μ λ€λ¦μΌλ‘ λ§λ€ μ μλ€. μ λ€λ¦ λ©μλ 3κ°μ§λ₯Ό μ΄ν΄λ³΄λ©΄μ μ΄λ»κ² μ λ€λ¦ λ©μλλ₯Ό λ§λλμ§ μμ보μ.
1. 맀κ°λ³μν νμ μ λ°λ μ μ μ νΈλ¦¬ν° λ©μλ πΌ
맀κ°λ³μν νμ μ λ°λ μ μ μ νΈλ¦¬ν° λ©μλλ λ³΄ν΅ μ λ€λ¦μ΄λ€. (Collectionsμ μκ³ λ¦¬μ¦ λ©μλλ λͺ¨λ μ λ€λ¦μ΄λ€.)
μ°μ , μ λ€λ¦μ μ¬μ©νμ§ μμ λ©μλλ₯Ό μ΄ν΄λ³΄μ
public class Union {
public static Set union(Set s1, Set s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
}
ν΄λΉ λ©μλλ μλμ μμμμ μ΄ν΄λ³Ό μ μλ κ²μ²λΌ μμ νμ§ μλ€.
public static void main(String[] args) {
Set names = Set.of("amenable", "immortal", "choi");
Set numbers = Set.of(1, 2, 3);
Set all = union(names, numbers);
for(Object o : all){
System.out.println((String)o); // ClassCastException
}
}
κ·Έλ¬λ―λ‘ μ΄κ²μ μ λ€λ¦ λ©μλλ‘ λ°κΏλ³΄μ. λ°©λ²μ λ€μκ³Ό κ°λ€.
- μμ νμ μ νμ 맀κ°λ³μλ‘ λͺ μνλ€.
- λ©μλ μμμλ μ΄ νμ 맀κ°λ³μλ§ μ¬μ©νκ² μμ νλ€.
- νμ 맀κ°λ³μλ€μ μ μΈνλ νμ 맀κ°λ³μ λͺ©λ‘μ λ©μλμ μ νμμ λ°ν νμ μ¬μ΄μ λ£λλ€.
public class Union {
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
return result;
}
}
μ λ€λ¦ λ©μλλ₯Ό μ¬μ©νλ©΄ λ¬Έμ κ° λλ μν©(λ°νμ μλ¬κ° λ°μνλ κ²)μ μ»΄νμΌ νμμ μ μ μλ€.
public static void main(String[] args) {
Set<String> names = Set.of("amenable", "immortal", "choi");
Set<Integer> numbers = Set.of(1, 2, 3);
Set all = union(names, numbers); // μ»΄νμΌ μλ¬
}
λν, μ§μ νλ³ννμ§ μμλ μ΄λ€ μ€λ₯λ κ²½κ³ μμ΄ μ»΄νμΌλλ€.
public static void main(String[] args) {
Set<String> groupA = Set.of("amenable", "immortal", "choi");
Set<String> groupB = Set.of("perseverance", "sunny");
Set<String> all = union(groupA, groupB);
for(String o : all){
System.out.println(o);
}
}
νμ μ μμΌλμΉ΄λ νμ μ μ¬μ©νλ©΄ λ μ μ°νκ² κ°μ ν μ μλλ°, μ΄κ²μ λ€μ μμ΄ν μΈ μμ΄ν 31μμ μ΄ν΄λ³΄λλ‘ νμ.
2. μ λ€λ¦ μ±κΈν΄ ν©ν°λ¦¬ π»
λλλ‘ λΆλ³ κ°μ²΄λ₯Ό μ¬λ¬ νμ μΌλ‘ νμ©ν μ μκ² λ§λ€μ΄μΌ ν λκ° μλ€.
μ¬λ°λ₯΄μ§ μμ μ½λ(μ¬λ¬ νμ μ νμ©ν μ μλ κ²μ΄ μλ κ²½μ°)λ λ€μκ³Ό κ°λ€. (μμ λ λͺ¨λ μμλ₯Ό μκΈ° μμ μΌλ‘ λμμν€λ ν¨μμΈ νλ±ν¨μλ₯Ό μ΄μ©ν μ½λλ€.)
public class GenericSingletonFactory {
public static Function<String, String> stringIdentityFunction() {
return (t) -> t;
}
public static Function<Number, Number> integerIdentityFunction() {
return (t) -> t;
}
}
----------
public static void main(String[] args) {
String[] names = {"amenable", "immortal", "choi"};
Function<String, String> sameNames = stringIdentityFunction();
for (String s : names) {
System.out.println(sameNames.apply(s));
}
Number[] numbers = { 1, 2.0, 3L };
Function<Number, Number> sameNumbers = integerIdentityFunction();
for(Number n : numbers){
System.out.println(sameNumbers.apply(n));
}
}
νμ§λ§, μλ°μ μ λ€λ¦μ΄ μ€μ²΄νλλ κ² μλλΌ μκ±°λκΈ° λλ¬Έμ λΆλ³ κ°μ²΄ νλλ₯Ό μ΄λ€ νμ μΌλ‘λ 맀κ°λ³μν ν μ μλ€.
μμ²ν νμ λ§€κ° λ³μμ λ§κ² λ§€λ² κ·Έ κ°μ²΄ νμ μ λ°κΏμ£Όλ μ μ ν©ν°λ¦¬λ₯Ό μ΄μ©νλ©΄ λλ€. μ΄ ν¨ν΄μ μ λ€λ¦ μ±κΈν΄ ν©ν°λ¦¬ ν¨ν΄μ΄λΌκ³ νλ€.
public class GenericSingletonFactory {
private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;
// μ
λ ₯ κ°μ μμ μμ΄ κ·Έλλ‘ λ°ννλ νλ±ν¨μμ΄λ―λ‘,
// Tκ° μ΄λ€ νμ
μ΄λ UnaryOperator<T>λ₯Ό μ¬μ©ν΄λ νμ
μμ νλ€.
@SuppressWarnings("unchecked")
public static <T> UnaryOperator<T> identityFunction() {
return (UnaryOperator<T>) IDENTITY_FN;
}
}
----------
public static void main(String[] args) {
String[] names = {"amenable", "immortal", "choi"};
Function<String, String> sameNames = identityFunction();
for (String s : names) {
System.out.println(sameNames.apply(s));
}
Number[] numbers = { 1, 2.0, 3L };
Function<Number, Number> sameNumbers = identityFunction();
for(Number n : numbers){
System.out.println(sameNumbers.apply(n));
}
}
3. μ¬κ·μ νμ νμ π·
μκΈ° μμ μ΄ λ€μ΄κ° ννμμ μ¬μ©νμ¬ νμ 맀κ°λ³μμ νμ© λ²μλ₯Ό νμ ν μ μλ 'μ¬κ·μ νμ νμ (Recursive Type Bound)μ μμ보μ.
μ¬κ·μ νμ νμ μ μ£Όλ‘ νμ μ μμ°μ μμλ₯Ό μ νλ Comparable μΈν°νμ΄μ€μ ν¨κ» μ°μΈλ€.
public class RecursiveTypeBound {
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;
}
}
----------
public static void main(String[] args) {
List<String> argList = Arrays.asList("amenable", "immortal");
System.out.println(max(argList)); // immortal
}
νμ νμ μΈ <E extends Comparable<E>>λ "λͺ¨λ νμ Eλ μμ κ³Ό λΉκ΅ν μ μλ€"λΌκ³ μ½μ μ μλ€. μνΈ λΉκ΅ κ°λ₯νλ€λ λ»μ μμ£Ό μ ννκ² ννν κ²μ΄λ€.
ν΄λΉ κΈμ λ°±κΈ°μ λμ 'μ΄νν°λΈ μλ° μλ²½ 곡λ΅'μ μ°Έκ³ νμμ΅λλ€.