ν‹°μŠ€ν† λ¦¬ λ·°

λ°˜μ‘ν˜•

πŸ’‘ μ œλ„€λ¦­(Generic)μ΄λž€?

μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°μ€ 일반적인 ν”„λ‘œκ·Έλž¨μ΄μ΄λΌλŠ” 뜻인데 데이터 νƒ€μž…(data type)을 μΌλ°˜ν™”(generalize)ν•œλ‹€λΌλŠ” 것을 μ˜λ―Έν•œλ‹€. λ‹€μ‹œ 말해 λ³€μˆ˜μ˜ μ„ μ–Έμ΄λ‚˜ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό ν•˜λ‚˜μ˜ μ°Έμ‘° μžλ£Œν˜•μ΄ μ•„λ‹Œ μ—¬λŸ¬ μžλ£Œν˜•μœΌλ‘œ λ³€ν™˜, λŒ€μ²΄λ  수 μžˆλ„λ‘ ν”„λ‘œκ·Έλž˜λ°ν•˜λŠ” 것이닀. 일반적으둜 μžλ£Œν˜•μ„ μ„ μ–Έν•˜κ³  λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것이 기본인데 ν•˜λ‚˜μ˜ μžλ£Œν˜•μ— κ΅­ν•œλ˜μ§€ μ•Šκ³  μ—¬λŸ¬ μžλ£Œν˜•μœΌλ‘œ λ³€ν™˜λ  수 μžˆλ‹€.

μ‹€μ œ μ‚¬μš©λ˜λŠ” μ°Έμ‘° μžλ£Œν˜•μœΌλ‘œμ˜ λ³€ν™˜μ€ μ»΄νŒŒμΌλŸ¬κ°€ κ²€μ¦ν•˜λ―€λ‘œ μ•ˆμ •μ μΈ ν”„λ‘œκ·Έλž˜λ° 방식이닀. μ΄λŸ¬ν•œ κ°œλ…μ€ μžλ°” 5.0λΆ€ν„° λ‚˜μ˜¨ 기술이고 μ΄μ „μ—μ„œλŠ” μ—¬λŸ¬ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œμ—μ„œ μΈμˆ˜λ‚˜ λ°˜ν™˜κ°’μœΌλ‘œ Object νƒ€μž…μ„ μ‚¬μš©ν–ˆμ—ˆλŠ”λ° 이런 κ²½μš°μ—λŠ” λ°˜ν™˜λœ Object 객체λ₯Ό λ‹€μ‹œ μ›ν•˜λŠ” νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•΄μ•Όν•˜λ©°, 였λ₯˜κ°€ λ°œμƒν•  κ°€λŠ₯성도 μžˆμ—ˆλ‹€. μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ 컴파일 μ‹œμ— 미리 νƒ€μž…μ΄ μ •ν•΄μ§€λ―€λ‘œ νƒ€μž… κ²€μ‚¬λ‚˜ λ³€ν™˜κ°™μ€ 번거둜운 μž‘μ—…μ„ μƒλž΅ν•  수 있게 λ˜μ—ˆλ‹€.

 

πŸ’‘ μ œλ„€λ¦­μ˜ μ„ μ–Έ 및 생성

μžλ°”μ—μ„œ μ œλ„€λ¦­μ€ ν΄λž˜μŠ€μ™€ λ©”μ†Œλ“œμ—λ§Œ λ‹€μŒκ³Ό 같이 μ„ μ–Έν•  수 μžˆλ‹€.

public class GenericExam<T> {
    private T element;
    
    public void setElement(T element) {
    	this.element = element;
    }
    
    public void getElement(T element) {
    	return element;
    }

'T'λ₯Ό νƒ€μž… λ³€μˆ˜(type variable)라고 ν•˜λ©° μž„μ˜μ˜ μ°Έμ‘°ν˜• νƒ€μž…μ„ μ˜λ―Έν•œλ‹€. κΌ­ T둜 μž‘μ„±ν•˜μ§€ μ•Šκ³  λ‹€λ₯Έ λΆ„μžλ₯Ό μ‚¬μš©ν•΄λ„ 상관 μ—†μœΌλ©°, μ—¬λŸ¬ 개의 νƒ€μž… λ³€μˆ˜λ₯Ό μ‰Όν‘œλ‘œ ꡬ뢄해 λͺ…μ‹œν•  수 μžˆλ‹€. νƒ€μž… λ³€μˆ˜λŠ” ν΄λž˜μŠ€λΏμ•„λ‹ˆλΌ λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‚˜ λ°˜ν™˜κ°’μœΌλ‘œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

μ£Όμ˜ν•΄μ•Όν•  점은 static ν‚€μ›Œλ“œμ—λŠ” Tλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. 생성될 λ•Œ νƒ€μž…μ΄ κ²°μ •λ˜λŠ”λ° static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ νƒ€μž…κ°’μ΄ 미리 κ³ μ •μ΄λ˜μ–΄ 버리기 λ•Œλ¬Έμ— μ‚¬μš©ν•  수 μ—†λ‹€.

μœ„μ—μ„œ μ„ μ–Έν•œ μ œλ„€λ¦­ 클래슀λ₯Ό 생성할 λ•ŒλŠ” νƒ€μž… λ³€μˆ˜ μžλ¦¬μ— μ‚¬μš©λ  μ‹€μ œ νƒ€μž…μ„ λͺ…μ‹œν•΄μ•Όν•œλ‹€. μ‹€μ œ νƒ€μž…μ„ λͺ…μ‹œν•΄μ€„ λ•ŒλŠ” 래퍼(wrapper)클래슀λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

GenericExam<Integer> example = new GenericExam<Integer>();

 λ‹€μ΄μ•„λͺ¬λ“œ μ—°μ‚°μž λ‚΄λΆ€μ—μ„œ μžλ£Œν˜•μ€ μƒλž΅ κ°€λŠ₯ν•˜λ‹€.

ArrayList<String> list = new ArrayList<>();

 

 

 

μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ— λŒ€ν•΄ 곡뢀λ₯Ό ν•˜λ €λ©΄ μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•΄ μ•Œμ•„μ•Όν•œλ‹€. μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°μ΄ μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œ 많이 μ‚¬μš©μ΄ λœλ‹€. μžλ°”μ—μ„œ μ œκ³΅ν•΄μ£ΌλŠ” μ»¬λ ‰μ…˜ ν”„λ‘œλž˜λ°μ΄λž€ 뭐냐면 자료ꡬ쑰 μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•œ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ •λ¦¬λ˜μ–΄μžˆλŠ”λ° κ·Έκ±Έλ§ν•˜λŠ”κ²ƒμ΄λ‹€. 직접 κ΅¬ν˜„ν•˜μ§€ μ•Šκ³ λ„ 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ 

μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°μ€ μžλ°” 5.0λΆ€ν„° λ‚˜μ˜¨κΈ°μˆ μ΄λ‹€. 일반적인 ν”„λ‘œκ·Έλž˜λ°μ΄λΌλŠ” 뜻인데  μžλ£Œν˜•μ„ μ„ μ–Έν•˜κ³  λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것이 기본인데 ν•˜λ‚˜μ˜ μžλ£Œν˜•μ— κ΅­ν•œλ˜μ§€ μ•Šκ³  μ—¬λŸ¬ μžλ£Œν˜•μœΌλ‘œ λ³€ν™˜λ  수 μžˆλ„λ‘ ν”„λ‘œκ·Έλž˜λ°ν•˜λŠ” 방식

λ³€μˆ˜μ˜ μ„ μ–Έμ΄λ‚˜ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό ν•˜λ‚˜μ˜ μ°Έμ‘° μžλ£Œν˜•μ΄ μ•„λ‹Œ μ—¬λŸ¬ μžλ£Œν˜•μ„ γ…‚λ³€ν™˜λ  수 μžˆλ„λ‘ ν”„λ‘œκ·Έλž˜λ°ν•˜λŠ” 방식 

 

μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œ 많이 μ‚¬μš©λ˜κ³  있음

λͺ¨λ“  μžλ£Œν˜•μ€ Objectλ₯Ό μƒμ†ν•˜κ³  μžˆμ–΄μ„œ λͺ¨λ‘ object둜 ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.

 

μ œλ„€λ¦­ 클래슀 μ •μ˜ν•˜κΈ°

μ—¬λŸ¬ μ°Έμ‘° μžλ£Œν˜•μœΌλ‘œ λŒ€μ²΄ 될 수 μžˆλŠ” 뢀뢄을 ν•˜λ‚˜μ˜ 문자둜 ν‘œν˜„

이 문자λ₯Ό μžλ£Œν˜• λ§€κ°œλ³€μˆ˜λΌκ³  함

public class GenericPrinter<T> {
    private T material;
    
    public void setMaterial(T material) {
    	this.material = material;
    }
    
    public void setMaterial(T material) {
    	return material;
    }

μ—¬κΈ°μ„œ μ‚¬μš©λœ TλŠ” type의 μ•½μžλ‘œ μžλ£Œν˜• λ§€κ°œλ³€μˆ˜μ΄λ‹€

μ‚¬μš©ν•  λ•ŒλŠ” Tμœ„μΉ˜μ— μ°Έμ‘°ν•  클래슀λ₯Ό μ“°λ©΄ λœλ‹€. μ°Έμ‘°ν˜•...

 

μžλ£Œν˜• 맀개 λ³€μˆ˜ T

type의 의미둜 Tλ₯Ό 많이 μ‚¬μš©ν•¨

<T>μ—μ„œ <>λŠ” 닀이아λͺ¬λ“œ μ—°μ‚°μžλΌκ³  함

 

 

μ œλ„€λ¦­μ—μ„œ μžλ£Œν˜• μΆ”λ‘ (μžλ°” 10λΆ€ν„°)

ArrayList<String> list = new ArrayList<>(); => var list = new ArrayList<String>():

 

μ œλ„€λ¦­ 클래슀 μ‚¬μš©ν•˜κΈ°

GenericPrinter<Powder> powderPrint = new GenericPrinter<Powder>();
powderPrint.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial(); //λͺ…μ‹œμ  ν˜• λ³€ν™˜μ„ ν•˜μ§€ μ•ŠμŒ

T둜 μ •μ˜ν•œ 뢀뢄에 μ‚¬μš©ν•  μ°Έμ‘° μžλ£Œν˜•μ„ λ„£μ–΄μ„œ 클래슀 생성

getMaterial() λ©”μ„œλ“œκ°€ 호좜 될 λ•Œ 따라 κ°•μ œ ν˜•λ³€ν™˜μ„ ν•˜μ§€ μ•Šμ•„λ„ 됨

 

μ œλ„€λ¦­μ—μ„œ λŒ€μž…λœ μžλ£Œν˜•μ„ λͺ…μ‹œν•˜μ§€ μ•Šμ€ κ²½μš°μ—λŠ” (μžλ£Œν˜•μ„ λͺ…μ‹œν•˜μ§€ μ•Šκ³  μ‚¬μš©ν•  μˆ˜λŠ” μžˆλ‹€) μžλ£Œν˜•μ„ λͺ…μ‹œν•˜λΌκ³  κ²½κ³ ν‘œμ‹œκ°€ λ‚˜νƒ€λ‚œλ‹€. ν•˜μ—¬ λ°˜ν™˜ ν˜•μ— 따라 κ°•μ œ ν˜• λ³€ν™˜μ„ 해주어야함

ArrayList list = new ArrayList

 

T extends 클래슀

Tκ°€ μ‚¬μš©λ  클래슀λ₯Ό μ œν•œν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

 

 

μ œλ„€λ¦­ λ©”μ„œλ“œ ν™œμš©ν•˜κΈ°

λ©”μ„œλ“œμ˜  λ§€κ°œλ³€μˆ˜λ₯Ό μžλ£Œν˜• λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•˜λŠ” 경우

μžλ£Œν˜• 맀개 λ³€μˆ˜κ°€ ν•˜λ‚˜ 이상인 경우

μ œλ„€λ¦­ λ©”μ„œλ“œμ˜ 일반 ν˜•μ‹

public <μžλ£Œν˜• λ§€κ°œλ³€μˆ˜> λ°˜ν™˜ν˜• λ©”μ„œλ“œ 이름(μžλ£Œν˜• λ§€κ°œλ³€μˆ˜ ...) {}

 

μžλ£Œν˜• λ§€κ°œλ³€μˆ˜κ°€ 두 개인 경우

public class Point<T, V> {
	T x;
    V y;
    
    Point(T x, V y) {
    	this.x = x;
        this.y = y;
    }
    
    //μ œλ„€λ¦­ λ©”μ„œλ“œ
    public T getX() {
    	return x;
    }
    
    public V getY() {
    	return y;
    }
}
λ°˜μ‘ν˜•
λŒ“κΈ€