πŸ“š μ°Έκ³ ν•œ μ±…

 

: 좜처 예슀24 ν™ˆνŽ˜μ΄μ§€

 

 

 

- 기본적인 κ°œλ…μ„ μ •λ¦¬ν•˜κ³  μΆ”κ°€μ μœΌλ‘œ κΆκΈˆν•œ 것듀을 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€ -

 

 

πŸ₯ πŸ₯ πŸ₯

 


 

βœ”οΈ   μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우_ 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( )λ©”μ„œλ“œλ„ μ΄μš©ν•  수 μžˆλ‹€.

+ Recent posts