2023. 3. 21. 09:39γJAVA/Effective JAVA
[μ΄νν°λΈ μλ°] Item30. μ΄μμ΄λ©΄ μ λ€λ¦ λ©μλλ‘ λ§λ€λΌ.
[μ΄νν°λΈ μλ°] Item29. μ΄μμ΄λ©΄ μ λ€λ¦ νμ μΌλ‘ λ§λ€λΌ. (tistory.com)
[μ΄νν°λΈ μλ°] Item29. μ΄μμ΄λ©΄ μ λ€λ¦ νμ μΌλ‘ λ§λ€λΌ.
[μ΄νν°λΈ μλ°] Item29. μ΄μμ΄λ©΄ μ λ€λ¦ νμ μΌλ‘ λ§λ€λΌ. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIA
hyejin.tistory.com
ν΄λμ€μ κ°μ΄ λ©μλλ μ λ€λ¦μΌλ‘ λ§λ€ μ μλλ°, λ§€κ°λ³μν νμ μ λ°λ μ μ μ νΈλ¦¬ν° λ©μλλ λ³΄ν΅ μ λ€λ¦μ΄λ€.
ex) Collectionsμ binarySearch, sort λ±μ λ©μλλ λͺ¨λ μ λ€λ¦μ΄λ€.
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 guys = Set.of("ν°", "λ₯", "ν΄λ¦¬");
Set stooges = Set.of(1, 2, 3);
Set all = union(guys, stooges);
for (Object o : all)
{
System.out.println("o = " + (String) o);
}
}
}
λ€μ union λ©μλλ λ μ§ν©μ ν©μ§ν©μ λ°ννλλ° μ΄λ λ¬Έμ κ° μλ λ©μλμ΄λ€.
μ»΄νμΌ μλ¬λ μμ§λ§ μ΄λ₯Ό μ€νν΄λ³΄λ©΄ λ°νμ μλ¬κ° λ°μνλ κ²μ νμΈν μ μλ€.
λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ λ©μλ μ μΈμμ μΈ μ§ν©(μ λ ₯ 2κ°, λ°ν 1κ°)μ μμ νμ μ νμ λ§€κ°λ³μλ‘ λͺ μνκ³ , λ©μλ μμμ μ΄ νμ λ§€κ°λ³μλ§ μ¬μ©νκ² μμ νλ©΄ λλ€.
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> guys = Set.of("ν°", "λ₯", "ν΄λ¦¬");
Set<String> stooges = Set.of("λ리", "λͺ¨μ", "컬리");
// Set<Integer> stooges = Set.of(1, 2, 3);
Set<String> all = union(guys, stooges); // <Integer> λ κ°μ νμ
μ λ£μΌλΌκ³ νκΈ° λλ¬Έμ error
for (String o : all)
{
System.out.println("o = " + o);
}
}
}
νμ λ§€κ°λ³μλ€μ μ μΈνλ νμ λ§€κ°λ³μ λͺ©λ‘μ λ©μλμ μ νμμ λ°ν νμ μ¬μ΄μ μ¨λ€.
μ λ€λ¦ λ©μλλ κ²½κ³ μμ΄ μ΄μ μ»΄νμΌ λκ³ , νμ μμ νλ©°, μ°κΈ°λ μ½λ€λ μ₯μ μ΄ μλ€.
union λ©μλλ μ§ν© 3κ°(μ λ ₯ 2κ°, λ°ν 1κ°)μ νμ μ΄ λͺ¨λ κ°μμΌ νλ€. (μ΄λ νμ μ μμΌλ μΉ΄λλ₯Ό μ¬μ©νλ©΄ μ’ λ μ μ°νκ² μ¬μ©ν μ μλ€.)
μ λ€λ¦ μ±κΈν΄ ν©ν°λ¦¬
λλλ‘ λΆλ³ κ°μ²΄λ₯Ό μ¬λ¬ νμ μΌλ‘ νμ©ν μ μκ² λ§λ€μ΄μΌ ν λκ° μλ€.
μ λ€λ¦μ λ°νμμ νμ μ λ³΄κ° μκ±°λλ―λ‘ νλμ κ°μ²΄λ₯Ό μ΄λ€ νμ μΌλ‘λ λ§€κ°λ³μνν μ μλ€.
νμ§λ§ μ΄λ κ² νλ €λ©΄ μμ²ν νμ λ§€κ°λ³μμ λ§κ² λ§€λ² κ·Έ κ°μ²΄μ νμ μ λ°κΏμ£Όλ μ μ ν©ν°λ¦¬λ₯Ό λ§λ€μ΄μΌ νλ€.
μ΄λ¬ν ν¨ν΄μ μ λ€λ¦ μ±κΈν΄ ν©ν°λ¦¬λΌκ³ νλ€.
public class GenericSingletonFactory
{
public static Function<String, String> stringIndentityFunction()
{
return (t) -> t;
}
public static Function<Number, Number> integerIdentityFunction()
{
return (t) -> t;
}
public static void main(String[] args)
{
String[] strings = { "μΌλ² ", "λλ§", "λμΌλ‘ " };
Function<String, String> sameString = stringIndentityFunction();
for (String string : strings)
{
System.out.println("sameString = " + sameString.apply(string));
}
Number[] numbers = { 1, 2.0, 3L };
Function<Number, Number> sameNumber = integerIdentityFunction();
for (Number number : numbers)
{
System.out.println("sameNumber = " + sameNumber.apply(number));
}
}
}
-> μ΄ ν΄λμ€λ νλ±ν¨μλ₯Ό λ΄μ ν΄λμ€λ‘ μ§κΈμ μ λ€λ¦ μ¬μ©νκΈ° μ μΌλ‘ νλ±ν¨μλ₯Ό νμ λ³λ‘ νλμ© λ§λ€μ΄μΌ νμ§λ§,
public class GenericSingletonFactory
{
// μ λ€λ¦ μ±κΈν€ ν©ν°λ¦¬ ν¨ν΄
private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;
@SuppressWarnings("unchecked")
public static <T> UnaryOperator<T> identityFunction()
{
return (UnaryOperator<T>) IDENTITY_FN;
}
public static void main(String[] args)
{
String[] strings = { "μΌλ² ", "λλ§", "λμΌλ‘ " };
UnaryOperator<String> sameString = identityFunction();
for (String string : strings)
{
System.out.println("sameString = " + sameString.apply(string));
}
Number[] numbers = { 1, 2.0, 3L };
UnaryOperator<Number> sameNumber = identityFunction();
for (Number number : numbers)
{
System.out.println("sameNumber = " + sameNumber.apply(number));
}
}
}
μκ±° λ°©μμ μ¬μ©ν λμ μ λ€λ¦ μ±κΈν΄ νλλ§ μΆ©λΆν μ¬μ©ν μ μλ€.
public static <T> UnaryOperator<T> identityFunction()
{
return (UnaryOperator<T>) IDENTITY_FN;
}
μ¬κΈ°μ IDENDITY_FNμ UnaryOperator<T>λ‘ νλ³ννλ©΄ λΉκ²μ¬ νλ³ν κ²½κ³ κ° λ°μνλ€.
Tκ° μ΄λ€ νμ μ΄λ UnaryOpeartor<Object>λ UnaryOperator<T>κ° μλκΈ° λλ¬Έμ΄λ€.
κ·Έλ°λ° μμ μμ λ νλ±ν¨μλ‘ μ λ ₯ κ°μ μμ μμ΄ κ·Έλλ‘ λ°ννκ³ μκΈ° λλ¬Έμ Tκ° μ΄λ€ νμ μ΄λ UnaryOperator<T>λ₯Ό μ¬μ©ν΄λ νμ μμ νλ€.
λ°λΌμ @SuppressWarning μ΄λ Έν μ΄μ μ μΆκ°ν΄μ κ²½κ³ λ₯Ό μ¨κΈΈ μ μλ€.
μ¬κ·μ νμ νμ recursive type bound
: μκΈ° μμ μ΄ λ€μ΄κ° ννμμ μ¬μ©νμ¬ νμ λ§€κ°λ³μμ νμ© λ²μλ₯Ό νμ ν μ μλ€.
public class RecursiveTypeBound
{
// μ¬κ·μ νμ
νμ μ μ¬μ©ν΄ 컬λ μ
μμ μ΅λκ°μ λ°ννλ€.
public static <E extends Comparable<E>> E max(Collection<E> collection)
{
if (collection.isEmpty()) {
throw new IllegalArgumentException();
}
E result = null;
for (E e : collection)
{
if (result == null || e.compareTo(result) > 0)
{
result = Objects.requireNonNull(e);
}
}
return result;
}
public static void main(String[] args)
{
List<String> argList = List.of("hyejin", "park");
System.out.println("max(argList) = " + max(argList));
}
}
<E extends Comparable<E>> : λͺ¨λ νμ Eλ μμ κ³Ό λΉκ΅ν μ μλ€.
π μ 리
ν΄λΌμ΄μΈνΈμμ μ λ ₯ λ§€κ°λ³μμ λ°νκ°μ λͺ μμ μΌλ‘ νλ³νν΄μΌ νλ λ©μλλ³΄λ€ μ λ€λ¦ λ©μλκ° λ μμ νλ©° μ¬μ©νκΈ° μ½λ€.
λ©μλλ νμ κ³Ό λ§μ°¬κ°μ§λ‘ νλ³ν μμ΄ μ¬μ©ν μ μλ νΈμ΄ μ’μΌλ©°, κ·Έλ κ² νλ €λ©΄ κ±°μ μ λ€λ¦ λ©μλκ° λμ΄μΌ νλ€.
λ°λΌμ νμ κ³Ό λ§μ°¬κ°μ§λ‘ νλ³νμ ν΄μ€μΌ νλ κΈ°μ‘΄ λ©μλλ μ λ€λ¦νκ² λ§λ€μ!!!