β Genericsλ?
β μ λ€λ¦ ν΄λμ€ μ μ
<T>λ₯Ό λΆμ΄λ©΄ Tλ 'νμ
λ§€κ°λ³μ'κ° λ©λλ€.<E>λ₯Ό μ¬μ©ν μλ μμ΅λλ€.class Box<T> {
private T content;
public Box(T content) {
this.content = content;
}
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
// μ λ€λ¦ λ©μλ μμ (Eλ λ©μλ μ μ© νμ
)
public <E> void printContent(E extraInfo) {
System.out.println("Content: " + content + ", Extra: " + extraInfo);
}
}
βΉοΈ Wrapper
Box<int> box = new Box<>();
int => Integer;
double => Double;
float => Float;
char => Character;
primitive typeμ΄ genericsλ₯Ό μ¬μ©νλ €λ©΄ Wrapperκ° μμμ§ Objectλ₯Ό μμλ°μ νμ
μΌλ‘ κ°μΈμ£Όμ΄μΌ νλ€.
βοΈ μ λ€λ¦ λ©μλ μ€μ΅
displayArray()λ₯Ό μ¬μ©ν΄ λ€μν νμ
μ λ°°μ΄μ μΆλ ₯ν΄λ΄
λλ€.class Box {
public static <T> void displayArray(T[] array) {
for(T element : array) {
System.out.println(element);
}
}
}
public class Main {
public static void main(String[] args) {
Integer[] numbers = {1, 2, 3, 4, 5};
String[] words = {"apple", "banana", "cherry"};
Box.displayArray(numbers);
Box.displayArray(words);
}
}
βΉοΈ μ λ€λ¦μ΄ μλ€λ©΄?
π Generics ν΅μ¬ μμ½ μ 리
| νλͺ© | μ€λͺ |
|---|---|
| κ°λ | νμ μ μΌλ°νν΄ μ½λ μ¬μ¬μ©μ±κ³Ό μμ μ±μ λμ΄λ κΈ°λ₯ |
| λν ν€μλ | <T>, <E>, <K, V> λ± νμ
λ§€κ°λ³μ μ¬μ© |
| μ μ© λμ | ν΄λμ€, λ©μλ, μΈν°νμ΄μ€ λͺ¨λ μ¬μ© κ°λ₯ |
| μ₯μ | μ»΄νμΌ μ νμ 체ν¬, μ€λ³΅ μ½λ μ κ±°, νμ μμ μ± ν₯μ |
| μ λ€λ¦ ν΄λμ€ | class Box<T> ννλ‘ μ μΈνμ¬ λ€μν νμ
μ²λ¦¬ |
| μ λ€λ¦ λ©μλ | public <T> void method(T param) ννλ‘ μ μΈ |
| νμ μΆλ‘ | λ©μλ νΈμΆ μ μ λ¬λ μΈμ νμ μΌλ‘ μλ μ μΆλ¨ |
| νμ μ ν | <T extends Number>μ²λΌ μν μ ν κ°λ₯ |
β μμΌλμΉ΄λλ?
?λ μ΄λ€ νμ
μ΄λ μ¬ μ μμμ μλ―Έν©λλ€.List<?> β μ무 νμ
μ΄λ λ°μ μ μμList<? extends Number> β Number λλ κ·Έ νμ νμ
λ§ νμ©βΉοΈ 곡λ³μ±κ³Ό λΆκ³΅λ³μ±
Integer[]μ Object[]λ‘ μ¬μ© κ°λ₯ β 곡λ³(covariant): νμ νμ
λ°°μ΄μ μμ νμ
λ°°μ΄λ‘ μ²λ¦¬ κ°λ₯List<Integer>λ List<Object>λ‘ μ¬μ©ν μ μμ β λΆκ³΅λ³(invariant): μ λ€λ¦μ νμ
μ΄ μ νν μΌμΉν΄μΌ ν¨public static void printArray(Object[] arr) {
for (Object o : arr) System.out.println(o);
}
β λΆκ³΅λ³ μμ
List<Integer>λ₯Ό List<Object>λ‘ λ°κΎΈλ €κ³ ν΄μ μ»΄νμΌ μ€λ₯κ° λ°μν©λλ€.List<Integer> list = Arrays.asList(1, 2, 3);
List<Object> objList = list; // μ€λ₯!
βοΈ printElements λ©μλ
List<?>λ μ΄λ€ νμ
μ 리μ€νΈλ λ°μ μ μμ΅λλ€.public static void printElements(List<?> list) {
for (Object o : list) {
System.out.println(o);
}
}
βοΈ sumList λ©μλ
List<? extends Number>λ Integer, Double λ± μ«μ νμ
리μ€νΈλ₯Ό λ°μ μ μμ΅λλ€.doubleValue()λ‘ λ³νν΄ ν©κ³λ₯Ό κ³μ°ν©λλ€.public static double sumList(List<? extends Number> list) {
double sum = 0;
for (Number n : list) {
sum += n.doubleValue();
}
return sum;
}
public static void main(String[] args) {
List<Integer> intList = Arrays.asList(10, 20, 30);
System.out.println("ν©κ³: " + sumList(intList));
}
π μμΌλμΉ΄λ μμ½ μ 리
| νν | μ€λͺ |
|---|---|
<?> | λͺ¨λ νμ νμ© (μ½κΈ°λ§ κ°λ₯, μ°κΈ°λ λΆκ°) |
<? extends T> | T λλ νμ νμ νμ© (μ½κΈ°λ§ κ°λ₯) |
<? super T> | T λλ μμ νμ νμ© (μ°κΈ° κ°λ₯, μ½κΈ°λ Objectλ‘) |
List<T> | μ νν Tλ§ νμ© (μ½κΈ°/μ°κΈ° λͺ¨λ κ°λ₯) |
β Streamμ΄λ?
β 리μ€νΈ μμ± λ° μ€νΈλ¦Ό μμ
stream() λ©μλλ‘ μμ±ν©λλ€.List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = numbers.stream();
β λ©μλ 체μ΄λ
numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
β filter() λ©μλ
numbers.stream()
.filter(n -> n % 2 == 0)
β mapToInt() λ©μλ
Integer κ°μ λνΌ νμ
μ κΈ°λ³Έν intλ‘ λ°κΏ IntStreamμ λ§λλλ€.Integer::intValueμ²λΌ λ©μλ μ°Έμ‘°λ₯Ό μ°λ©΄ λ κ°κ²°νκ² ννν μ μμ΅λλ€..mapToInt(Integer::intValue)
β sum()μΌλ‘ ν©κ³ ꡬνκΈ°
sum()μ IntStreamμ μ΅μ’
μ°μ°μΌλ‘, λͺ¨λ μμλ₯Ό λν κ²°κ³Όλ₯Ό λ°νν©λλ€..sum();
β
μ 체 μμ μ½λ
리μ€νΈμμ μ§μλ§ κ³¨λΌμ κ·Έ ν©μ ꡬνλ μ 체 μ½λμ
λλ€.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println("Sum of even numbers: " + sum);
β average()λ‘ νκ· κ΅¬νκΈ°
List<Double> values = Arrays.asList(10.0, 20.0, 30.0);
double avg = values.stream()
.mapToDouble(Double::doubleValue)
.average()
.orElse(0.0);
π Stream μ£Όμ λ©μλ μμ½
| λ©μλ | μ€λͺ |
|---|---|
| stream() | 컬λ μ (List λ±)μ μ€νΈλ¦ΌμΌλ‘ λ³ν |
| filter() | 쑰건μ λ§λ μμλ§ κ±Έλ¬λ (μ€κ° μ°μ°) |
| mapToInt() | Integerλ₯Ό κΈ°λ³Έν intλ‘ λ³ννμ¬ IntStream μμ± |
| mapToDouble() | Doubleμ doubleλ‘ λ³ννμ¬ DoubleStream μμ± |
| sum() | μ«μ ν©κ³ κ³μ° (μ΅μ’ μ°μ°) |
| average() | νκ· κ³μ°, κ²°κ³Όλ OptionalDoubleλ‘ λ°νλ¨ (μ΅μ’ μ°μ°) |
| orElse() | Optional κ°μ΄ μμ λ κΈ°λ³Έκ° λ°ν |