관리 메뉴

Tech Log πŸ› οΈ

[java] μ œλ„€λ¦­ λ³Έλ¬Έ

TIL

[java] μ œλ„€λ¦­

sehaan 2023. 3. 7. 02:28

μ œλ„€λ¦­μ΄λž€?

μ–΄λ–€ ν΄λž˜μŠ€μ— 아직 ν˜•νƒœκ°€ 정해지지 μ•Šμ€ ν•„λ“œλ₯Ό μ„ μ–Έν•œλ‹€κ³  κ°€μ •ν•΄λ³΄μžμ΄ ν•„λ“œλ₯Ό μ–΄λ–»κ²Œ μ„ μ–Έν•΄μ€˜μ•Όν• κΉŒ?
 
μ‰½κ²Œ 생각해보면 λͺ¨λ“  클래슀의 μ΅œμƒμœ„ λΆ€λͺ¨ 클래슀인 Object 둜 μ„ μ–Έν•  수 μžˆλ‹€.ν•˜μ§€λ§Œ 이럴 경우 νƒ€μž…μ„ λͺ¨λ₯΄κΈ° λ•Œλ¬Έμ— ν•„λ“œκ°’μ„ 얻을 λ•Œ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.
 
instanceof μ—°μ‚°μžλ‘œ νƒ€μž…μ„ 쑰사할 μˆ˜λŠ” μžˆμ§€λ§Œ λͺ¨λ“  μ’…λ₯˜μ˜ 클래슀λ₯Ό λŒ€μƒμœΌλ‘œ 쑰사할 μˆ˜λŠ” μ—†λ‹€.
 
λ”°λΌμ„œ 이런 κ²½μš°μ—λŠ” 아직 νƒ€μž…μ΄ μ •ν•΄μ§€μ§€μ•Šμ€ ν•„λ“œλ₯Ό μ„ μ–Έν•  수 μžˆλŠ” κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€.
이것이 "μ œλ„€λ¦­"이닀.
 

μ œλ„€λ¦­μ΄λž€ κ²°μ •λ˜μ§€ μ•Šμ€ νƒ€μž…μ„ νŒŒλΌλ―Έν„°λ‘œ μ²˜λ¦¬ν•˜κ³ 
μ‹€μ œ μ‚¬μš©ν•  λ•Œ νŒŒλΌλ―Έν„°λ₯Ό ꡬ체적인 νƒ€μž…μœΌλ‘œ λŒ€μ²΄μ‹œν‚€λŠ” κΈ°λŠ₯

 
 
μ‰½κ²Œ μƒκ°ν•˜λ©΄ 일단 νƒ€μž…μ„ μ„ μ–Έν•œ 후에 ꡬ체적인 νƒ€μž…μ€ λ‚˜μ€‘μ— μ„€μ •ν•˜λŠ” 거라고 μ΄ν•΄ν•˜λ©΄ 될 것 κ°™λ‹€.
 

public class Box<T>{
	public T content;
}
//'T' λŒ€μ‹  λ‹€λ₯Έ μ•ŒνŒŒλ²³μ„ 써도 무방

μ—¬κΈ°μ„œ TλŠ” νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό μ˜λ―Έν•˜κ³  클래슀 및 μΈν„°νŽ˜μ΄μŠ€λ§Œ 받을 수 μžˆλ‹€.
λ§Œμ•½ content에 100을 λ„£κ³  μ‹Άλ‹€λ©΄ , νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό Integer둜 λŒ€μ²΄ν•˜λ©΄λ˜κ³ 
content에 '"name"을 λ„£κ³ μ‹Άλ‹€λ©΄, νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό String으둜 λŒ€μ²΄ν•˜λ©΄ λœλ‹€.
 


μ œλ„€λ¦­ νƒ€μž…

μ œλ„€λ¦­νƒ€μž…μ€ κ²°μ •λ˜μ§€ μ•Šμ€ νƒ€μž…μ„ νŒŒλΌλ―Έν„°λ‘œ κ°€μ§€λŠ” ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€.

public class 클래슀λͺ…<A,B,..> {...}
public interface μΈν„°νŽ˜μ΄μŠ€λͺ…<A,B,..> {...}
//선언뢀에 '<>' λΆ€ν˜Έκ°€ λΆ™λŠ”λ‹€.

νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ Object νƒ€μž…μ΄ 기본적으둜 μ‚¬μš©λ˜λ©° , objectκ°€ 가지고 μžˆλŠ” λ©”μ†Œλ“œ(ex.equals)λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.
 

μ œλ„€λ¦­ λ©”μ†Œλ“œ

μ œλ„€λ¦­ λ©”μ†Œλ“œλŠ” νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό 가지고 μžˆλŠ” λ©”μ†Œλ“œμ΄λ‹€.

public <A,B,...> λ¦¬ν„΄νƒ€μž… λ©”μ†Œλ“œλͺ…(λ§€κ°œλ³€μˆ˜,..){ }

 
μ œλ„€λ¦­ νƒ€μž…κ³ΌλŠ” λ‹€λ₯΄κ²Œ νƒ€μž… νŒŒλΌλ―Έν„°κ°€ λ©”μ†Œλ“œ μ„ μ–ΈλΆ€μ—μ„œ μ •μ˜λœλ‹€ .

public static <T> Box<T> boxing(T t) {
        Box<T> box = new Box<T>();
        
        box.setT(t);
        return box;
    }
    
    public static void main(String[] args) {
        Box<Integer> box1 = boxing(100);
        // 100이 Integer νƒ€μž…μ΄λ―€λ‘œ TλŠ” Integer둜 λŒ€μ²΄
        int intValue = box1.getT();
        System.out.println(intValue);

        Box<String> box2 = boxing("name");
        // 100이 String νƒ€μž…μ΄λ―€λ‘œ TλŠ” String으둜 λŒ€μ²΄
        String strValue = box2.getT();
        System.out.println(strValue);
        
    }

μ œν•œλœ νƒ€μž… νŒŒλΌλ―Έν„°

κ²½μš°μ— λ”°λΌμ„œλŠ” νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό λŒ€μ²΄ν•˜λŠ” ꡬ체적인 νƒ€μž…μ„ μ œν•œν•  수 μžˆλ‹€.

public <T extends μƒμœ„νƒ€μž…> λ¦¬ν„΄νƒ€μž… λ©”μ†Œλ“œ(λ§€κ°œλ³€μˆ˜,...) { }

 
μƒμœ„νƒ€μž…μ€ 클래슀 뿐만 μ•„λ‹ˆλΌ μΈν„°νŽ˜μ΄μŠ€λ„ κ°€λŠ₯ν•˜λ‹€.
 
λ§Œμ•½ μƒμœ„νƒ€μž…μ„ Number둜 μ œν•œν•œλ‹€λ©΄ ν•΄λ‹Ή μžμ‹ν΄λž˜μŠ€(Byte,Shoret,Long,Integer ...) 만 μ‚¬μš©νžˆ κ°€λŠ₯ν•˜λ©° ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ 가지고 μžˆλŠ” λ©”μ†Œλ“œλ„ μ΄μš©ν•  수 μžˆλ‹€.
 

μ™€μΌλ“œμΉ΄λ“œ νƒ€μž… νŒŒλΌλ―Έν„°

μ œλ„€λ¦­ νƒ€μž…μ„ λ§€κ°œκ°’μ΄λ‚˜ 리턴 νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•  λ•Œ νƒ€μž… νŒŒλΌλ―Έν„°λ‘œ '?'(μ™€μΌλ“œμΉ΄λ“œ)λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
 
ex)
Student ν΄λž˜μŠ€μ™€ μžμ‹ 클래슀만 λ§€κ°œλ³€μˆ˜λ‘œ κ°€λŠ₯

λ¦¬ν„΄νƒ€μž… λ©”μ†Œλ“œλͺ…(μ œλ„€λ¦­νƒ€μž…<? extends Students> λ³€μˆ˜) {...}

 
Worker ν΄λž˜μŠ€μ™€ λΆ€λͺ¨ 클래슀만 λ§€κ°œλ³€μˆ˜λ‘œ κ°€λŠ₯

λ¦¬ν„΄νƒ€μž… λ©”μ†Œλ“œλͺ…(μ œλ„€λ¦­νƒ€μž…<? super Worker> λ³€μˆ˜) {...}

 
μ–΄λ–€ νƒ€μž…μ΄λ“  λ§€κ°œλ³€μˆ˜λ‘œ κ°€λŠ₯

λ¦¬ν„΄νƒ€μž… λ©”μ†Œλ“œλͺ…(μ œλ„€λ¦­νƒ€μž…<?> λ³€μˆ˜) {...}