1. 곡λ³, λΆκ³΅λ³, λ°κ³΅λ³μ κ°λ π
λ³μ±(Variance)μ΄λ νμ μ κ³μΈ΅ κ΄κ³μμ μλ‘ λ€λ₯Έ νμ κ°μ μ΄λ ν κ΄κ³κ° μλμ§λ₯Ό λνλ΄λ κ²μ΄λ€.
λ³μ±μ 3κ°μ§ μ’ λ₯μΈ κ³΅λ³(Covariant), λΆκ³΅λ³(Invariant), λ°κ³΅λ³(Contravariant)μ λ€μκ³Ό κ°μ νΉμ±μ κ°μ§λ€.
κ³΅λ³ | Sκ° Tμ νμ νμ μ΄λ©΄, S[]λ T[]μ νμ νμ μ΄λ€. |
λΆκ³΅λ³ | List<S>μ List<T>λ κ΄κ³κ° μλ€. |
λ°κ³΅λ³ | Sκ° Tμ νμ νμ μ΄λ©΄, T[]λ S[]μ νμ νμ μ΄λ€. |
2. μ λ€λ¦μ 곡λ³μ±μ΄ μλ€. β
μλ°μμ λ°°μ΄μ 곡λ³μ΄κ³ , μ λ€λ¦μ λΆκ³΅λ³μ΄λ€.
μ¦, κ°μ²΄ νμ μ κ΄κ³μμ Aκ° Bμ νμ νμ μΌ λ, λ°°μ΄ A[]λ B[]μ νμ νμ μ΄μ§λ§ List<A>sms List<B>μ νμ νμ μ΄ μλλ€.
public static void main(String[] args) {
// λ°°μ΄μ 곡λ³
Object[] covariance = new Integer[10];
// μ λ€λ¦μ λΆκ³΅λ³
List<Object> invariance = new List<Integer>;
}
3. λΆκ³΅λ³μ λ¬Έμ μ π§Ί
λ°°μ΄κ³Ό 리μ€νΈμ κ°μ print λ©μλλ₯Ό μ΄μ©ν΄μ μΆλ ₯νλ€κ³ ν΄λ³΄μ. λ°°μ΄μ κ²½μ° μλμ κ°μ΄ λ€νμ±μ νΉμ§μ μ΄μ©νμ¬ printλ©μλλ₯Ό λ§λ€ μ μλ€.
public static void print(Object[] arr) {
for(Object i : arr) {
System.out.println(i);
}
}
public static void main(String[] args) {
String[] strings = {"1", "2", "3"};
print(strings);
Integer[] integers = {1, 2, 3};
print(integers);
}
νμ§λ§, μ λ€λ¦μ κ²½μ° λΆκ³΅λ³μ΄κΈ° λλ¬Έμ λ°°μ΄κ³Ό κ°μ νμμΌλ‘ μ½λλ₯Ό μμ±νλ©΄ μ»΄νμΌ μλ¬κ° λλ€.
public static void print(List<Object> arr) {
for(Object i : arr) {
System.out.println(i);
}
}
public static void main(String[] args) {
List<String> strings = List.of("1", "2", "3");
print(strings); // μ»΄νμΌ μλ¬
List<Integer> integers = List.of(1, 2, 3);
print(integers); // μ»΄νμΌ μλ¬
}
κ·Έλμ λ€μκ³Ό κ°μ΄ κ°μ²΄ μ§ν₯μ νΉμ§μ μ ν μ΄μ©νμ§ λͺ»ν μνλ‘ μ½λλ₯Ό μμ±ν΄μΌ νλ€.
public static void printString(List<String> arr) {
for(Object i : arr) {
System.out.println(i);
}
}
public static void printInteger(List<Integer> arr) {
for(Object i : arr) {
System.out.println(i);
}
}
public static void main(String[] args) {
List<String> strings = List.of("1", "2", "3");
printString(strings);
List<Integer> integers = List.of(1, 2, 3);
printInteger(integers);
}
4. νμ μ μμΌλμΉ΄λ πΏ
μμμ μ΄ν΄λ³Έ λΆκ³΅λ³μ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μ μ λ€λ¦μ <? extends T>, <? super T>λΌλ νμ μ μμΌλμΉ΄λλ₯Ό μ 곡νλ€.
μν κ²½κ³ μμΌλ μΉ΄λ | <? extends T> | 곡λ³μ± μ μ© |
νν κ²½κ³ μμΌλ μΉ΄λ | <? super T> | λ°κ³΅λ³μ± μ μ© |
π 1. κ³΅λ³ - μν κ²½κ³ μμΌλμΉ΄λ
public class MyArrayList<T> {
Object[] element = new Object[3];
int index = 0;
// λ΄λΆ λ°°μ΄μ inμ μΆκ°
public MyArrayList(Collection<? extends T> in) {
for(T elem : in) {
element[index++] = elem;
}
}
@Override
public String toString() {
return Arrays.toString(element);
}
}
----------
public static void main(String[] args) {
MyArrayList<String> names = new MyArrayList<>(List.of("amenable", "choi", "perseverance"));
System.out.println(names); // [amenable, choi, perseverance]
}
π 2. λ°κ³΅λ³ - νν κ²½κ³ μμΌλμΉ΄λ
public class MyArrayList<T> {
Object[] element = new Object[3];
int index = 0;
...
// outμ λ΄λΆ λ°°μ΄μ μΆκ°
public void clone(Collection<? super T> out) {
for(Object elem : element) {
out.add((T) elem);
}
}
}
public static void main(String[] args) {
MyArrayList<String> names = new MyArrayList<>(List.of("amenable", "choi", "perseverance"));
List<Object> temp = new ArrayList<>();
names.clone(temp);
System.out.println(temp); // [amenable, choi, perseverance]
}
5. PECS (Producer-Extends, Consumer-Super) π
μν κ²½κ³ μμΌλμΉ΄λ(<? extends T>)μ νν κ²½κ³ μμΌλμΉ΄λ(<? super T>)λ μΈμ μ΄λ€ κ±Έ μ¬μ©ν΄μΌ ν κΉ?
μμ°μ(Producer)λ extendsλ₯Ό μ¬μ©νκ³ , μλΉμ(Consumer)λ superλ₯Ό μ¬μ©νλ©΄ λλ€. μ΄κ²μ΄ PECS(Producer-Extends, Consumer-Super) 곡μμ΄λ€.
μμμ μν κ²½κ³ μμΌλμΉ΄λμ νν κ²½κ³ μμΌλμΉ΄λμ μμ μμ μ΄λ―Έ PECSλ₯Ό μ μ©νμλ€. μ½λλ₯Ό λ€μ νλ² νμΈν΄ 보면μ PECSλ₯Ό μ΄ν΄ν΄ 보λλ‘ νμ.
public class MyArrayList<T> {
Object[] element = new Object[3];
int index = 0;
// μμ°μ(Producer) - extends
// λ΄λΆ λ°°μ΄μ inμ μΆκ°
public MyArrayList(Collection<? extends T> in) {
for(T elem : in) {
element[index++] = elem;
}
}
// μλΉμ(Consumer) - super
// outμ λ΄λΆ λ°°μ΄μ μΆκ°
public void clone(Collection<? super T> out) {
for(Object elem : element) {
out.add((T) elem);
}
}
@Override
public String toString() {
return Arrays.toString(element);
}
}
----------
public static void main(String[] args) {
MyArrayList<String> names = new MyArrayList<>(List.of("amenable", "choi", "perseverance"));
List<Object> temp = new ArrayList<>();
names.clone(temp);
}
ν΄λΉ κΈμ
Hyo Kim λμ '[Java] μλ° μ λ€λ¦ λΆκ³΅λ³ / κ³΅λ³ / λ°κ³΅λ³ μ²μ λ€μ΄λ΄ λλ€.',
BeforB λμ '[Java] μ λ°°μ΄μ Convariant(곡λ³)μ΄κ³ μ λ€λ¦μ Invariant(λΆκ³΅λ³)μΌκΉ?',
Inpa λμ 'μλ° μ λ€λ¦μ 곡λ³μ± & μμΌλ μΉ΄λ μλ²½ μ΄ν΄'
λ₯Ό μ°Έκ³ νμμ΅λλ€.
'π JAVA > μ£Όμ κ°λ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μΈν°νμ΄μ€(Interface) (0) | 2023.06.13 |
---|---|
μΆμ ν΄λμ€(Abstract Class) (2) | 2023.06.11 |
νλ³ν(μΊμ€ν , Casting) - μ μΊμ€ν (Up-Casting), λ€μ΄μΊμ€ν (Down-Casting) (0) | 2023.05.24 |
μ λ€λ¦(Generics) - κΈ°λ³Έ κ°λ (0) | 2023.05.13 |
λνΌ ν΄λμ€ (Wrapper Class) (0) | 2023.05.09 |