μΆμ²
ChatGPT
μ λ€λ¦μ μ‘΄μ¬ μ΄μ
1. νμ μμ μ± κ°ν
μ λ€λ¦μ μ¬μ©νλ©΄ μ»΄νμΌλ¬κ° μ»΄νμΌ μμ μ μλͺ»λ νμ μ¬μ©μ κ²μΆν μ μλ€. μ΄λ₯Ό ν΅ν΄ λ°νμ μμΈλ₯Ό μ£Όλ¦¬κ³ , νμ λ³ν(casting)μ κ΄ν μ€λ₯λ₯Ό λ°©μ§νλ€.
2. μ½λ μ¬μ¬μ©μ±
λμΌν μ½λκ° λ€μν λ°μ΄ν° νμ κ³Ό ν¨κ» μ¬μ©λ μ μμ΄, μ€λ³΅λ μ½λλ₯Ό μ€μ΄κ³ μ μ§λ³΄μμ±μ λμΈλ€.
3. κ°λ μ± ν₯μ
μ λ€λ¦μ μ¬μ©νλ©΄ λͺ νν νμ μ 보λ₯Ό μ¬κ³΅ν΄ μ½λμ κ°λ μ±μ λμΌ μ μλ€.
μ λ€λ¦ μ₯μ
1. μ»΄νμΌ μμ μ νμ 체ν¬
μ λ€λ¦μ μ¬μ©νλ©΄ μ»΄νμΌ μμ μμ νμ μ 체ν¬νλ©°, λ°νμμ λ°μν μ μλ ClassCastExceptionκ³Ό κ°μ μμΈλ₯Ό μ€μΌ μ μλ€.
2. νμ λ³νμ νμμ± μ κ±°
μ λ€λ¦μ μ¬μ©νλ©΄ κ°μ²΄λ₯Ό μ½μ νκ±°λ μΆμΆν λ νμ λ³νμ μλμΌλ‘ ν νμκ° μμ΄ μ½λκ° κ°κ²°ν΄μ§κ³ , νμ λ³νμμ λ°μν μ μλ μ€λ₯λ₯Ό λ°©μ§ν μ μλ€.
3. μ½λ μ¬μ¬μ©μ±
μ λ€λ¦ ν΄λμ€λ₯Ό λ§λ€λ©΄ λ€μν νμ μ λν΄ μ¬μ¬μ©ν μ μμ΄, μ€λ³΅λ μ½λλ₯Ό μ€μΌ μ μλ€.
μ λ€λ¦ λ¨μ
1. νμ μκ±° Types Erasure
Java μ λ€λ¦μ λ°νμμ νμ μ λ³΄κ° μκ±°λλ―λ‘, λ°νμμλ μ λ€λ¦ νμ μ 보λ₯Ό μ¬μ©ν μ μλ€. μ΄λ‘ μΈν΄ νΉμ μν©μμ μλνμ§ μμ κ²°κ³Όλ₯Ό μ΄λν μ μλ€.
2. κΈ°λ³Έ λ°μ΄ν° νμ μ¬μ© μ ν
μ λ€λ¦μ int, char λ± κΈ°λ³Έ λ°μ΄ν° νμ (primitive type)μ μ§μ μ¬μ©ν μ μλ€. λμ Integer, Characterμ κ°μ λνΌ ν΄λμ€λ₯Ό μ¬μ©ν΄μΌ νλ€.
3. 볡μ‘ν μ λ€λ¦ νμ μ μΈ
μ λ€λ¦ νμ μ΄ λ³΅μ‘ν΄μ§λ©΄ μ½λμ κ°λ μ±μ΄ λ¨μ΄μ§ μ μλ€.
μ¬μ© μ μ£Όμν΄μΌ ν μ
1. μ λ€λ¦ νμ μ νμ 맀κ°λ³μλ λ°νμμ μκ±°λλ€. λ°λΌμ λ°νμμ νμ μ 보μ μ κ·Όνλ €λ μλλ 무μλ―Ένλ€. μλ₯Ό λ€μ΄, μ λ€λ¦ λ°°μ΄ μμ±μ νμ©λμ§ μλλ€.('new T[]'μ κ°μ νν)
2. κΈ°λ³Έ λ°μ΄ν° νμ μ¬μ© λΆκ° : μ λ€λ¦μμλ κΈ°λ³Έ λ°μ΄ν° νμ (μ : int, char)μ μ¬μ©ν μ μλ€. λμ Integer, Characterμ κ°μ λ νΌ ν΄λμ€λ₯Ό μ¬μ©ν΄μΌ νλ€.
3. μ λ€λ¦ νμ μΊμ€ν μ£Όμ : μ λ€λ¦ νμ μ κ°μ²΄λ₯Ό raw typeμΌλ‘ μΊμ€ν ν λλ κ²½κ³ κ° λ°μν μ μμΌλ©°, μ΄λ λ°νμ μμΈλ₯Ό μ λ°ν μ μλ€.
μμ μ½λ
import java.util.ArrayList;
import java.util.List;
// μ λ€λ¦ ν΄λμ€λ₯Ό μ μν©λλ€.
class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
public class GenericExample {
public static void main(String[] args) {
// Integer νμ
μΌλ‘ μ λ€λ¦ ν΄λμ€ μ¬μ©
Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
Integer intValue = integerBox.getContent();
System.out.println("Integer value: " + intValue);
// String νμ
μΌλ‘ μ λ€λ¦ ν΄λμ€ μ¬μ©
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello Generics");
String strValue = stringBox.getContent();
System.out.println("String value: " + strValue);
// μ λ€λ¦ 리μ€νΈλ₯Ό μ¬μ©νλ μμ
List<String> stringList = new ArrayList<>();
stringList.add("Apple");
stringList.add("Banana");
for (String fruit : stringList) {
System.out.println(fruit);
}
// μ λ€λ¦ λ©μλλ₯Ό μ¬μ©νλ μμ
System.out.println("Max of 3, 7, 5 is: " + getMax(3, 7, 5));
}
// μ λ€λ¦ λ©μλ μ μ
public static <T extends Comparable<T>> T getMax(T x, T y, T z) {
T max = x;
if (y.compareTo(max) > 0) {
max = y;
}
if (z.compareTo(max) > 0) {
max = z;
}
return max;
}
}
- Box ν΄λμ€: Box<T>λ μ λ€λ¦ ν΄λμ€λ‘, νλμ νμ 맀κ°λ³μ Tλ₯Ό μ¬μ©νλ€. μ΄ ν΄λμ€λ νμ μ μμ ν λ°©μμΌλ‘ κ°μ²΄λ₯Ό μ μ₯νκ³ λ°νν μ μλ€.
- μ λ€λ¦ 리μ€νΈ: List<String>μ μ λ€λ¦ νμ μ 리μ€νΈλ€. μ΄ λ¦¬μ€νΈλ String νμ λ§μ μ μ₯ν μ μμΌλ©°, νμ μμ μ±μ μ 곡νλ€.
- μ λ€λ¦ λ©μλ: getMax λ©μλλ μ λ€λ¦ λ©μλλ‘, <T extends Comparable<T>> νμ 맀κ°λ³μλ₯Ό μ¬μ©νμ¬ λΉκ΅ κ°λ₯ν νμ λ§ μ¬μ©ν μ μλλ‘ μ ννλ€. μ΄λ T νμ μ μΈ κ°μ μΈμλ₯Ό λ°μ κ°μ₯ ν° κ°μ λ°ννλ€.
μ λ€λ¦ νμ μ κ²½κ³ Generic Type Bounds
1. κΈ°λ³Έ κ°λ
μ λλ¦ νμ κ²½κ³λ μ λ€λ¦ ν΄λμ€λ λ©μλλ₯Ό μ μν λ νμ νλΌλ―Έν°μ νμ©ν μ μλ μμ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό μ§μ νλ κ²μ μλ―Ένλ€. μ¦, μ λ€λ¦ νμ μ νλΌλ―Έν°κ° νΉμ νμ μ΄κ±°λ νΉμ νμ μ μλΈνμ μ΄μ΄μΌ νλ€λ μ νμ μ€μ νλ κ²μ΄λ€.
μ λ€λ¦ νμ μ κ²½κ³λ ν¬κ² λ κ°μ§λ‘ λλ μ μλ€.
- μν κ²½κ³ Upper Bound : νμ νλΌλ―Έν°κ° νΉμ νμ μ νμ ν΄λμ€(μλΈν΄λμ€)μ¬μΌ ν¨μ μ μνλ€.
- νν κ²½κ³ Lower Bounde : νμ νλΌλ―Έν°κ° νΉμ νμ μ μμ ν΄λμ€(μνΌν΄λμ€)μ¬μΌ ν¨μ μ μνλ€.
1. μν κ²½κ³ Upper Bound
μν κ²½κ³λ μ λ€λ¦ νμ νλΌλ―Έν°κ° νΉμ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό μμλ°κ±°λ, κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬννλ νμ μ΄μ΄μΌ νλ€λ μ νμ μλ―Ένλ€.
- λ¬Έλ² : <T extends μμνμ >
μμ
'<T extends Number>'λ μ λ€λ¦ νμ Tκ° Number ν΄λμ€μ΄κ±°λ Numberμ νμ ν΄λμ€(Integer, Doubel, Float λ±)μ¬μΌ νλ€λ μλ―Έμ΄λ€.
public class Box<T extends Number> {
private T value;
public Box(T value) {
this.value = value;
}
public double square() {
return value.doubleValue() * value.doubleValue();
}
}
μ μ½λμμ Box ν΄λμ€λ Number νμ μ μμ ν΄λμ€(λλ μΈν°νμ΄μ€)λ₯Ό κ°μ§ νμ λ§μ νμ©νλ€. Number ν΄λμ€μ νμ νμ μΈ Integer, Double λ±μ μ¬μ©ν μ μμ§λ§, String λ± λ€λ₯Έ νμ μ μ¬μ©ν μ μλ€.
2. νν κ²½κ³ Lower Bound
νν κ²½κ³λ μ λ€λ¦ νμ νλΌλ―Έν°κ° νΉμ ν΄λμ€μ μμ ν΄λμ€μ¬μΌ νλ€λ μ νμ μλ―Ένλ€. νν κ²½κ³λ μ£Όλ‘ μμΌλμΉ΄λ(? super Type)μ ν¨κ» μ¬μ©λλ€.
- λ¬Έλ² : <T super νμ νμ > (μΌλ°μ μΈ μ λ€λ¦ μ μΈμμλ μ§μ μ¬μ©νμ§ μκ³ , λ©μλ 맀κ°λ³μμμ μμΌλμΉ΄λ ννλ‘ μ¬μ©)
μμ
'<? super νμ νμ >'λ μ λ€λ¦ νμ νλΌλ―Έν°κ° Integer ν΄λμ€μ΄κ±°λ Integerμ μμ ν΄λμ€μ¬μΌ νλ€λ μλ―Έμ΄λ€.
public static void addIntegers(List<? super Integer> list) {
list.add(1);
list.add(2);
}
μ μ½λμμ List<? super Integer>λ Integer νμ λλ κ·Έ μμ νμ μ μμλ‘ κ°μ§ μ μλ 리μ€νΈλ₯Ό μλ―Ένλ€. μ΄λ 리μ€νΈμ μμ νκ² Integer λλ κ·Έ νμ νμ μ κ°μ²΄λ₯Ό μΆκ°ν μ μλλ‘ νλ€.
2. μ λ€λ¦ νμ κ²½κ³κ° μ‘΄μ¬νλ μ΄μ
1. νμ μμ μ± λ³΄μ₯
νμ κ²½κ³λ μ»΄νμΌλ¬κ° μ λ€λ¦ νμ μ΄ νμ©ν μ μλ νμ μ μ ννμ¬ νμ μμ μ±μ 보μ₯ν μ μλλ‘ νλ€. μλ₯Ό λ€μ΄, μν κ²½κ³λ₯Ό μ¬μ©νλ©΄ μλͺ»λ νμ μ΄ μ¬μ©λλ κ²μ λ°©μ§νκ³ , νν κ²½κ³λ₯Ό νμ©νλ©΄ νμ μμ μ±μ μ μ§νλ©΄μ νΉμ νμ μ μΈμ€ν΄λ§μ μΆκ°ν μ μλ€.
μμ
λ§μ½ μ λ€λ¦ νμ μ κ²½κ³λ₯Ό μ§μ νμ§ μμΌλ©΄, μλͺ»λ νμ μ΄ μ¬μ©λμ΄ λ°νμμ ClassCastExceptionμ΄ λ°μν μ μλ€. κ²½κ³λ₯Ό μ§μ νλ©΄ μ»΄νμΌλ¬κ° μ΄ κ°μ μ€λ₯λ₯Ό 미리 λ°©μ§ν μ μλ€.
public <T extends Number> void process(T value) {
double result = value.doubleValue() * 2; // Numberμ λ©μλ μ¬μ© κ°λ₯
System.out.println(result);
}
μ μμ μμ T νμ νλΌλ―Έν°λ Numberμ νμ νμ μ΄λ―λ‘, Number ν΄λμ€μ μ μλ doubleValue() λ©μλλ₯Ό μμ νκ² νΈμΆν μ μλ€.
2. μ λ€λ¦ λ©μλμ μ μ°μ± μ¦κ°
μ λ€λ¦ νμ μ μνμ΄λ νν κ²½κ³λ₯Ό μ§μ νλ©΄, μ λ€λ¦ λ©μλμ μ¬μ© λ²μμ μ μ°μ±μ ν¬κ² ν₯μμν¬ μ μλ€. κ²½κ³κ° μλ κ²½μ°λ³΄λ€ λ λ§μ νμ μ μμ νκ² μ²λ¦¬ν μ μλ€.
μμ
μν κ²½κ³λ₯Ό μ¬μ©νμ¬ μ λ€λ¦ λ©μλλ₯Ό μ€κ³νλ©΄, κ·Έ λ©μλλ λ λ§μ νμ μ λ°μλ€μΌ μ μμΌλ©°, λ©μλ λ΄λΆμμ νΉμ νμ μ μ’ μμ μΈ κΈ°λ₯μ μμ νκ² μ¬μ©ν μ μλ€.
public static <T extends Comparable<T>> T findMax(T a, T b) {
return (a.compareTo(b) > 0) ? a : b;
}
μ μμ μμ findMax λ©μλλ Comparable μΈν°νμ΄μ€λ₯Ό ꡬννλ λͺ¨λ νμ μ λν΄ μ¬μ©ν μ μλ€. νμ νλΌλ―Έν° Tμ μν κ²½κ³λ₯Ό μ€μ ν¨μΌλ‘μ¨, λ©μλ λ΄λΆμμ compareTo λ©μλλ₯Ό μμ νκ² νΈμΆν μ μκ² λλ€.
3. μ½λ μ¬μ¬μ©μ±κ³Ό μ μ§λ³΄μμ± ν₯μ
μ λ€λ¦ νμ κ²½κ³λ₯Ό μ¬μ©νλ©΄, μ½λ μ¬μ¬μ©μ±μ λμΌ μ μμΌλ©°, μ μ§λ³΄μμ±μ ν₯μμν¬ μ μλ€. μ λ€λ¦ ν΄λμ€λ λ©μλκ° νΉμ νμ μ μ’ μμ μ΄μ§ μκΈ° λλ¬Έμ, λ€μν νμ μ μ§μνλ λ μΌλ°μ μΈ μ½λλ₯Ό μμ±ν μ μλ€.
μμ
μ¬λ¬ λ°μ΄ν° νμ μ λν΄ λμΌν λ‘μ§μ μ μ©ν΄μΌ νλ κ²½μ°, μ λ€λ¦ νμ κ²½κ³λ₯Ό μ¬μ©νμ¬ μ€λ³΅ μ½λλ₯Ό μ€μ΄κ³ , μ¬μ¬μ© κ°λ₯ν λ©μλλ₯Ό μμ±ν μ μλ€.
public static <T extends Number> double sum(List<T> list) {
double sum = 0.0;
for (T number : list) {
sum += number.doubleValue();
}
return sum;
}
μ μμ μμ sum λ©μλλ Numberμ νμ ν΄λμ€(Integer, Double, Float, λ±)λ‘ κ΅¬μ±λ 리μ€νΈμ λν΄ μ¬μ©ν μ μμΌλ©°, λ€μν νμ μ 리μ€νΈμ λν΄ λμΌν ν©μ° λ‘μ§μ μ¬μ¬μ©ν μ μλ€.
4. νμ μμ μ±μ μ μ§νλ©° λ³μ±(Variance) μ²λ¦¬ κ°λ₯
- κ΄λ ¨ κΈ -> [Java] λ³μ± Variance
μ λ€λ¦ νμ μ κ²½κ³λ λ³μ±μ μ§μνλ λ°μλ μ€μν μν μ νλ€. μν κ²½κ³μ νν κ²½κ³λ₯Ό μ΄μ©νμ¬ κ³΅λ³μ±(Covariance)μ λ°κ³΅λ³μ±(Contravariance)λ₯Ό μ²λ¦¬ν μ μλ€.
- μν κ²½κ³(? extends T): 곡λ³μ± μ²λ¦¬λ₯Ό μν΄ μ¬μ©λλ€. μλ₯Ό λ€μ΄, λ©μλ 맀κ°λ³μμμ μ λ€λ¦ νμ μ μμ κ²½κ³λ₯Ό μ μνμ¬, ν΄λΉ νμ μ νμ νμ κ°μ²΄λ€μ μμ νκ² λ€λ£° μ μλ€.
- νν κ²½κ³(? super T): λ°κ³΅λ³μ± μ²λ¦¬λ₯Ό μν΄ μ¬μ©λλ€. λ©μλ 맀κ°λ³μμμ μ λ€λ¦ νμ μ νμ κ²½κ³λ₯Ό μ μνμ¬, ν΄λΉ νμ μ μμ νμ κ°μ²΄λ€μ μμ νκ² λ€λ£° μ μλ€.
'λΉ κ΅¬λ© μ±μ°κΈ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java][JVM] StackOverflowErrorμ μμΈκ³Ό ν΄κ²° λ°©λ² (0) | 2024.08.27 |
---|---|
[Java] μμΈ, μλ¬ (0) | 2024.08.27 |
[Java] λ³μ± Variance (0) | 2024.08.27 |
[Java] μ μ λ€λ¦μ μμ νμ μ μ¬μ©ν μ μλκ° (0) | 2024.08.27 |
[Java] λ°μ±(Boxing), μΈλ°μ±(Unboxing)μΌλ‘ μΈν΄ λ°μν μ μλ μ±λ₯ μ΄μ (0) | 2024.08.27 |