π μ°Έκ³ ν μ±
- κΈ°λ³Έμ μΈ κ°λ μ μ 리νκ³ μΆκ°μ μΌλ‘ κΆκΈν κ²λ€μ μ 리νμ΅λλ€ -
π₯ π₯ π₯
βοΈ μ λ€λ¦μ μ¬μ©νμ§ μλ κ²½μ°_ 585p
• κ°μ²΄λ₯Ό μ μ₯νλ ν΄λμ€
class Onion { }
class Goods1 {
private Onion onion = new Onion();
public Onion get() {
return onionl
}
public void set(Onion onion) {
this.onion = onion;
}
}
Goods1 g1 = new Goods1();
g1.setOnion(new Onion());
Onion onion = (Onion)g1.get();
Onion ν΄λμ€μ Onion ν΄λμ€λ₯Ό λ΄μ μ μλ Goods1 ν΄λμ€κ° μλ€. Goods1μ Onion ν΄λμ€λ§ λ΄μ μ μμΌλ Onionμ΄ μλ λ€λ₯Έ κ²μ λ΄κ³ μΆμ΄μ§λ©΄ μλ‘μ΄ ν΄λμ€λ₯Ό μμ±ν΄μΌνλ€. νμ§λ§ μ΄λ€ μ½λλ νλμ ν΄λμ€μ λ€μν ν΄λμ€λ₯Ό λ΄κ³ μΆμ μλ μλ€.
• Objectλ‘ μ μν ν΄λμ€
class Onion {}
class Radish {}
class Goods {
private Object object = new Object();
public Object get() {
return object;
}
public void set(Object object) {
this.object = object;
}
}
Goods g1 = new Goods();
g1.set(new Onion());
Onion onion = (Onion)g1.get();
Goods g2 = new Goods();
g2.set(new Radish());
Radish radish = (Radish)g2.get();
Onionκ³Ό Radishλ λͺ¨λ Object νμ μ μμμ΄λ€. μλνλ©΄ μλ°μμ λͺ¨λ ν΄λμ€μ μ΅μμ λΆλͺ¨λ Objectλ₯Ό μμλ°κΈ° λλ¬Έμ΄λ€. μμ μ½λλ set( ) λ©μλλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μ μ₯νκ³ , get( ) λ©μλλ₯Ό ν΅ν΄ μ μ₯λ κ°μ κΊΌλΈλ€.
맨 μ²μ μ λλ¦ μμ΄ κ°μ²΄λ₯Ό μ μ₯ν ν΄λμ€μ μμλ₯Ό μ΄ν΄λ³΄μ. κ°μ²΄λ₯Ό μ μ₯ν λ g1.setOnionμ΄λΌκ³ μ μλ€. νμ§λ§ Objectλ‘ μ μν μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ g1.set(new Onion());μΌλ‘ Onionμ΄ Object νμ μΌλ‘ μ μ₯λμ΄μλ€. μ΄ μ μμ λ μ½λμ μ°¨μ΄λ₯Ό νμΈν μ μλ€.
Object νμ μΌλ‘ μ μ₯νμΌλ getμμλ Object νμ μΌλ‘ κΊΌλΌ κ² κ°μ§λ§ μ¬μ€ κ·Έλ μ§ μλ€. κΊΌλΌ λλ κ°μ²΄λ₯Ό μ¬μ©νκΈ° μν΄ Onionκ³Ό Radish κ°μ²΄λ‘ λ€μ΄ μΊμ€ν ν΄μΌ νλ€. λ§μ½ μλͺ» μΊμ€ν μ΄ λ κ²½μ° ClassCastException μ€ν μμΈκ° λ°μνλ©° νλ‘κ·Έλ¨μ΄ μ’ λ£λλ€. μ΄λ₯Ό μ½ν νμ 체ν¬λΌκ³ νλ€.
βοΈ μ λ€λ¦ λ¬Έλ²_ 591p
• μ λ€λ¦
: ν΄λμ€ λ΄λΆμμ μ¬μ©ν λ°μ΄ν° νμ μ μΈλΆμμ μ§μ νλ κΈ°λ²
• κ°ν νμ 체ν¬
: μλͺ»λ μΊμ€ν μ ν λ λ¬Έλ² μ€λ₯λ₯Ό λ°μμμΌ μλͺ»λ μΊμ€ν μΌλ‘ λ°μν μ μλ λ¬Έμ λ₯Ό μ¬μ μ μλ°©
• μ λ€λ¦ νμ λ³μμ κ΄λ‘μ νκΈ° λ° μλ―Έ
T | νμ (Type) |
K | ν€(Key) |
V | κ°(Value) |
N | μ«μ(Number) |
E | μμ(Element) |
class KeyValue<K, V> {
private K key;
private V value;
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public void setValue(V value) {
this.value = value;
}
}
KeyValue<String, Integer> kv1 = new KeyValue<>();
kv1.setKey("μ¬κ³Ό");
kv1.setValue(1000);
String key1 = kv1.getKey();
int value1 = kv1.getValue();
System.out.println("key: " + key1 + "value: " + value1);
KeyValue<String, Void> kv2 = new KeyValue<>();
kv2.setKey("ν€ κ°λ§ μ¬μ©");
String key2 = kv2.getKey();
System.out.println("key: " + key2);
kv1κ³Ό kv2μ νμ μ΄ λ€λ₯΄κ² μ€μ ν μ μλ μ΄μ λ μ λ€λ¦ ν΄λμ€λ ν΄λμ€λ₯Ό μ μνλ μμ μ νμ μ μ§μ νλ κ²μ΄ μλ κ°μ²΄λ₯Ό μμ±νλ μμ μ νμ μ μ§μ νκΈ° λλ¬Έμ΄λ€. κ·Έλμ νλμ μ λ€λ¦ ν΄λμ€λ‘ λ€μν νμ μ κ°μ μ μ₯ λ° κ΄λ¦¬ν μ μλ κ°μ²΄λ₯Ό μμ±ν μ μλ κ²μ΄λ€.
Object νμ μ νλμ μ λ€λ¦μ κ°μ₯ ν° μ°¨μ΄μ μ setter λ©μλλ₯Ό μ¬μ©ν λ μ λ ₯ νμ μ μ νν νμΈν μ μκ³ , λ€μ΄μΊμ€ν μ νμ§ μμλ ν΄λΉ νμ μΌλ‘ μμμ 리ν΄λλ€λ κ²μ΄λ€. λ§μ½ kv2μ setKeyμ λ¬Έμμ΄μ΄ μλ μ«μλ₯Ό λμ νκ±°λ getν λ Stringμ΄ μλ λ€λ₯Έ νμ μΌλ‘ κΊΌλ΄λ κ²½μ° κ°ν νμ 체ν¬λ‘ μΈν΄ λ¬Έλ² μ€λ₯ λ°μμ΄ μΌμ΄λλ€.
μ½λλ₯Ό μ΄ν΄λ³΄μ KeyValue<String, Integer> kv1 = new KeyValue<>();μμ KeyValue<String, Integer> kv1 = new KeyValue<String, integer>();μΌλ‘ μμ±ν΄λ λλ€. κ·Έλ¬λ μ λ€λ¦ νμ μ νμ μΌμͺ½ νκ³Ό λμΌνκΈ° λλ¬Έμ μλ΅ν μ μλ€. μμ μ½λμμλ μ λ€λ¦ νμ λ³μλ₯Ό 2κ° κ°μ§ κ²½μ°λ‘ μμ±λμλλ°, λ§μ½ νλμ νμ λ§ νμν κ²½μ° Voidλ₯Ό μ μΌλ©΄ λλ€.
βοΈ μ λ€λ¦ λ©μλ_ 597p
• μ λ€λ¦ λ©μλ
: μΌλ° ν΄λμ€ λ΄λΆμ νΉμ λ©μλλ§ μ λ€λ¦μΌλ‘ μ μΈν κ²½μ°
class GenericMethods{
public <K,V> method1(K k, V v) {
System.out.println(k + ":" + v);
}
}
GenericMethods gm = new GenericMethods();
gm.<String, Integer>method1("κ΅μ΄", 80);
gm.method1("κ΅μ΄", 80);
μΌλ° ν΄λμ€ GenericMethods λ΄μ μ λ€λ¦ λ©μλλ‘ 2κ°μ μ λ€λ¦ νμ λ³μλ₯Ό μ¬μ©νκ³ μλ€. μ°Έμ‘°κ°μ²΄ gmμ νμ©ν μ½λλ₯Ό 보면 μ€μ μ λ€λ¦ νμ μ΄ μ΄λ€ νμ μ΄μ§ μ μν΄λ μ½λμ μλ΅ν μ½λλ₯Ό λ³Ό μ μλ€. μ λ ₯λ§€κ°λ³μλ₯Ό ν΅ν΄ μ λ€λ¦ νμ μ΄ μ΄λ€ νμ μΈμ§ μ μ μκΈ° μλ΅ν΄λ 무κ΄νλ€. λ€λ§ μ λ ₯λ§€κ°λ³μ μμ²΄κ° μκ±°λ μ λ ₯λ§€κ°λ³μμμ μ λ€λ¦ νμ λ³μλ₯Ό μ¬μ©νμ§ μλ public static <T> void doSomething() μ΄λ° μμ μ½λμ κ²½μ° μ λ ₯κ°μΌλ‘ μμΈ‘ν μ μκΈ° λλ¬Έμ μλ΅μ΄ λΆκ°νλ€.
• μ λ€λ¦ Object νμ
public <T> void method(T t) {
System.out.println(t.equals("μλ
"));
}
μμ μ½λλ νμ μ μ νμ΄ μλ μ½λλ€. μ΄λ° κ²½μ° μ»΄νμΌ μ Tλ₯Ό Objectλ‘ κ°μ£Όνμ¬ Objectμ μ μλ λ©μλ hashcode, eqauls, toString λ±λ§ μ¬μ©κ°λ₯νλ€. μ΄λ κ² λλ©΄ μ λ€λ¦ λ©μλμ νμ© λ²μκ° λ§€μ° μ’μμ§κ²λλ€.
μλμ μ 리λκ² μ§λ§, κ·Έλμ μ΄λ° κ²½μ° λ λκ² νμ©νκΈ° μν΄ μ λ€λ¦ νμ μ λ²μλ₯Ό μ ννλ€. νμ¬ μ½λμμ t.equalsκ° μλ t.lengthμΈ String λ©μλλ₯Ό μ¬μ©νκ³ μΆμ κ²½μ° <T>λ₯Ό <T extends String>μΌλ‘ λ³κ²½νλ©΄ String ν΄λμ€μ μλ λ©μλλ μ¬μ©κ°λ₯ν΄μ§λ€.
βοΈ μ λ€λ¦ νμ λ²μ μ ν_ 602p
• μ λ€λ¦ ν΄λμ€ νμ λ²μ μ ν
class A {}
class B extends A {}
class C extends B {}
class D <T extends B> {
private T t;
public T get() {
return t;
}
public void set(T t) {
this.t = t;
}
}
D<B> d2 = new D<>();
D<C> d3 = new D<>();
D d4 = new D();
d2.set(new B());
d2.set(new C());
d3.set(new C());
d4.set(new B());
d4.set(new C());
μ λ€λ¦ ν΄λμ€μ νμ μ ννλ λ°©λ²μ μ λ€λ¦ νμ μΌλ‘ λμ λ μ μλ μ΅μμ ν΄λμ€λ₯Ό extends ν€μλμ ν¨κ» μ μνλ κ²μ΄λ€. κ·Έλμ <μ λ€λ¦ νμ λ³μ extends μμ ν΄λμ€>μ ννλ‘ μ¬μ©νλ©° μ΄λ extendsλ μμνλΌλ μλ―Έκ° μλ μ΅μμ ν΄λμ€ νΉμ μΈν°νμ΄μ€λ‘ μ§μ νλ€λΌλ μλ―Έλ‘ κ°μ§λ€. μ½λμμλ <T extends B> λ‘ μμ±νμΌλ©° A <- B <- Cμ μμ ꡬ쑰λ₯Ό κ°κ³ μλ€.
μ λ€λ¦ ν΄λμ€ Dλ₯Ό μ΄ν΄λ³΄μ. ν΄λμ€ Dλ ν΄λμ€ B λλ ν΄λμ€ Bμ μμ ν΄λμ€λ§ μ€λλ‘ μ ννλ€. κ·Έλ λ€λ κ²μ Aλ μ νμ κ±Έλ € D<A> d1 = new D<>(); κ°μ²΄ μμ±μ΄ λΆκ°νλ€λ μλ―Έμ΄λ€. d2λ μ λ€λ¦ νμ μΌλ‘ Bλ₯Ό μ§μ νμ¬ Bμ C κ°μ²΄κ° μ λ ₯κ°λ₯νλ€. κ·Έλ°λ° d3λ C νμ μΌλ‘ μ§μ νκΈ° λλ¬Έμ Cμ μμν΄λμ€ Bκ°μ²΄λ₯Ό μ λ ₯ν μ μλ€. d4λ νμ μ μ§μ νμ§ μμμ§λ§ λͺ¨λ νμ μ μ΅μμ ν΄λμ€κ° <B> νμ μ΄λ―λ‘ μ λ€λ¦ νμ μΌλ‘ λμ λμλ€. κ·Έλμ d4λ Bμ C κ°μ²΄κ° μ λ ₯κ°λ₯νλ€.
• μ λ€λ¦ λ©μλ νμ λ²μ μ ν
class A {}
class B extends A {}
class C extends B {}
class D extends C {}
class Goods <T> {
private T t;
public T get() {
return t;
}
public void set(T t) {
this.t = t;
}
}
void methods(Goods<A> g) {}
void methods(Goods<?> g) {}
void methods(Goods<? extends B> g) {}
void methods(Goods<? super B> g) {}
extendsλ μκΉμ κ°μ΄ ν΄λΉ ν΄λμ€μ μμ ν΄λμ€λ§ κ°λ₯νλ€. κ·ΈλΌ μ½λμμ BλΌκ³ μ νμμΌλ B ν΄λμ€μ Bμ μμ ν΄λμ€μΈ κ°μ²΄κ° λ€μ΄κ° κ²μ΄λ€. superλ ν΄λΉ ν΄λμ€μ λΆλͺ¨ ν΄λμ€μΈ κ°μ²΄λ§ κ°λ₯νλ―λ‘ B λλ Bμ λΆλͺ¨ ν΄λμ€λ§ κ°λ₯ν κ²μ΄λ€.
μμꡬ쑰λ₯Ό μ΄ν΄λ³΄λ©΄ A <- B <- C <- Dκ° λλ€. Goods<A>λ AμΈ κ°μ²΄λ§ κ°λ₯νκ³ Goods<?> λͺ¨λ νμ μΈ κ°μ²΄κ° κ°λ₯νκΈ°μ A, B, C, D νμ μ΄ λͺ¨λ ? μ리μ μ¬ μ μλ€. Goods<? extends B>λ B λλ Bμ μμ ν΄λμ€μΈ κ°μ²΄λ§ κ°λ₯νκΈ°μ B, C, D νμ μ΄ κ°λ₯νλ©° Goods<? super B>λ B λλ Bμ λΆλͺ¨ ν΄λμ€μΈ κ°μ²΄λ§ κ°λ₯ν΄μ A, Bκ° μ λ€λ¦ νμ μΌλ‘ μ§μ λ μ μλ€.
βοΈ μ λ€λ¦μ μμ_ 612p
• μ λ€λ¦ ν΄λμ€μ μμ
class Parent {
<T extends Number void print(T t) {
System.out.println(t);
}
}
class Child extends Parents {
}
Parent p = new Parent();
p.<Integer>print(10);
p.print(10);
Child c = new Child();
c.<Double>print(5.8);
c.print(5.8);
λΆλͺ¨ν΄λμ€κ° μ λ€λ¦ ν΄λμ€μΈ κ²½μ° μμ ν΄λμ€λ μ λ€λ¦ ν΄λμ€κ° λμ΄ μ λ€λ¦ νμ λ³μλ₯Ό μμ ν΄λμ€κ° κ·Έλλ‘ λ¬Όλ €λ°κ² λλ€. λν μμ ν΄λμ€μμ μ λ€λ¦ νμ λ³μλ₯Ό μΆκ°ν΄ μ μν μλ μλ€. κ·Έλ¬λ―λ‘ μμ ν΄λμ€μ μ λ€λ¦ νμ λ³μμ κ°μλ μΈμ λ λΆλͺ¨μ κ°κ±°λ κ·Έ μ΄μμΌ κ²μ΄λ€.
μ½λλ₯Ό 보면 λΆλͺ¨ ν΄λμ€μ μ΅μμ μ λ€λ¦ νμ μ΄ Numberλ‘ μ νλμ΄ μλ€. Number ν΄λμ€λ booleanκ³Ό charμ μ μΈν Byte, Short, Integer, Long, Float, Doubleμ΄ μλ€. μμ ν΄λμ€λ Number ν΄λμ€ λ΄μ μλ 6κ°μ§ μλ£νμ μ¬μ©ν μ μμΌλ©° λΆλͺ¨ ν΄λμ€κ° κ°μ§κ³ μλ print( )λ©μλλ μ΄μ©ν μ μλ€.