Search
Duplicate
πŸ˜€

14. μ œλ„€λ¦­(Generic)

νƒœκ·Έ
Generic
Generic WildCard

Generic?

μžλ°”μ—μ„œ μ œλ„€λ¦­(generic)μ΄λž€ λ°μ΄ν„°μ˜ νƒ€μž…(data type)을 μΌλ°˜ν™”ν•œλ‹€(generalize)λŠ” 것을 μ˜λ―Έν•œλ‹€.μ œλ„€λ¦­μ€Β ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œμ—μ„œ μ‚¬μš©ν•  λ‚΄λΆ€ 데이터 νƒ€μž…μ„ 컴파일 μ‹œμ— 미리 μ§€μ •ν•˜λŠ” 방법이닀. μ΄λ ‡κ²Œ 컴파일 μ‹œμ— 미리 νƒ€μž… 검사(type check)λ₯Ό μˆ˜ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같은 μž₯점을 가진닀.
1.Β μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ 잘λͺ»λœ νƒ€μž…μ΄ λ“€μ–΄μ˜¬ 수 μžˆλŠ” 것을 컴파일 λ‹¨κ³„μ—μ„œ 방지할 수 μžˆλ‹€.
2. 클래슀 μ™ΈλΆ€μ—μ„œ νƒ€μž…μ„ 지정해주기 λ•Œλ¬Έμ— λ”°λ‘œ νƒ€μž…μ„ μ²΄ν¬ν•˜κ³  λ³€ν™˜ν•΄μ€„ ν•„μš”κ°€ μ—†λ‹€. 즉, κ΄€λ¦¬ν•˜κΈ°κ°€ νŽΈν•˜λ‹€.
3.Β λΉ„μŠ·ν•œ κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” 경우 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ 높아진닀.
JDK 1.5 μ΄μ „μ—μ„œλŠ” μ—¬λŸ¬ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ”Β λŒ€λΆ€λΆ„μ˜ ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œμ—μ„œΒ μΈμˆ˜λ‚˜ λ°˜ν™˜κ°’μœΌλ‘œ Object νƒ€μž…μ„ μ‚¬μš©ν–ˆλ‹€. ν•˜μ§€λ§Œ μ΄Β κ²½μš°μ—λŠ” λ°˜ν™˜λœ Object 객체λ₯Ό λ‹€μ‹œ μ›ν•˜λŠ” νƒ€μž…μœΌλ‘œ νƒ€μž… λ³€ν™˜ν•΄μ•Ό ν•˜λ©°, μ΄λ•Œ 였λ₯˜κ°€ λ°œμƒν•  κ°€λŠ₯성도 μ‘΄μž¬ν•œλ‹€. ν•˜μ§€λ§Œ JDK 1.5λΆ€ν„° λ„μž…λœ μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ 컴파일 μ‹œμ— 미리 νƒ€μž…μ΄ μ •ν•΄μ§€λ―€λ‘œ, νƒ€μž… κ²€μ‚¬λ‚˜ νƒ€μž… λ³€ν™˜κ³Ό 같은 번거둜운 μž‘μ—…μ„ μƒλž΅ν•  수 있게 λœλ‹€.

Generic의 μ‚¬μš© 방법

Generic 클래슀

μ œλ„€λ¦­μ€ ν΄λž˜μŠ€μ™€ λ©”μ†Œλ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ”λ° μ œλ„€λ¦­ νƒ€μž…μ„ μ„ μ–Έν•œ 클래슀λ₯Ό μ œλ„€λ¦­ 클래슀라 ν•œλ‹€. ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ 클래슀 λͺ… μš°μΈ‘μ— <>λ₯Ό μ‚¬μš©ν•΄μ„œ μ„ μ–Έν•œλ‹€.
public class Box<T> { private T item; public T getItem() { return item; } public void setItem(T item) { this.item = item; } } // ,(콀마)둜 κ΅¬λΆ„ν•΄μ„œ μ—¬λŸ¬ 개λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€. public class Box<M, I> { private M material; private I item; public M getMaterial() { return material; } public void setMaterial(M material) { this.material = material; } public I getItem() { return item; } public void setItem(I item) { this.item = item; } }
Java
볡사
Box<Paper, String> box = new Box<Paper, String>(); Box<Paper, String> box = new Box<>(); // JDK1.7λΆ€ν„° μƒλž΅ κ°€λŠ₯ Box box = new Box(); // Object둜 κ°„μ£Ό
Java
볡사

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

μ œλ„€λ¦­μ€ 클래슀 λ ˆλ²¨μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλŠ”κ²Œ μ•„λ‹ˆλΌ λ©”μ†Œλ“œ λ ˆλ²¨μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.
μ œλ„€λ¦­ νƒ€μž…μ„ μ„ μ–Έν•œ λ©”μ†Œλ“œλ₯Ό μ œλ„€λ¦­ λ©”μ†Œλ“œλΌ ν•œλ‹€. 클래슀의 μ œλ„€λ¦­ νƒ€μž…μ΄ μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λœλ‹€λ©΄ λ©”μ†Œλ“œμ˜ μ œλ„€λ¦­ νƒ€μž…μ€ ν•΄λ‹Ή λ©”μ†Œλ“œ μ•ˆμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” 지역성을 κ°–λŠ”λ‹€.
public class CoffeeMachine { public <T> Coffee makeCoffee(T capsule) { return new Coffee(capsule); } }
Java
볡사
μ œλ„€λ¦­ νƒ€μž…μ„ λ©”μ†Œλ“œμ—μ„œ μ„ μ–Έν•  λ•ŒλŠ” μ ‘κ·Όμ œν•œμžμ™€ λ°˜ν™˜νƒ€μž… 사이에 μ„ μ–Έν•œλ‹€.
CoffeeMachine coffeeMachine = new CoffeeMachine(); Colombian capsule = new Colombian(); coffeeMachine.<Colombian>makeCoffee(capsule); coffeeMachine.makeCoffee(capsule); // νƒ€μž… μΆ”μ • κ°€λŠ₯ν•˜λ―€λ‘œ μƒλž΅ κ°€λŠ₯
Java
볡사
μ œλ„€λ¦­ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” λ©”μ†Œλ“œ λͺ… μ•žμ— <>둜 νƒ€μž…μ„ μ§€μ •ν•΄μ€˜μ•Ό ν•˜μ§€λ§Œ μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ μΆ”μ •ν•  수 μžˆλŠ” κ²½μš°μ—” μƒλž΅ν•  수 μžˆλ‹€.

Generic Type Parameter의 μ œν•œ

μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ μ‚¬μš©ν•  λ•Œ νƒ€μž…μ„ μ§€μ •ν•˜κ²Œ λ˜λŠ”λ°, 'μ–΄λ–€ νƒ€μž…μ΄ 올 수 μžˆλŠ”μ§€'λ₯Ό μ œν•œν•˜μ§€ μ•ŠμœΌλ©΄ 말 κ·ΈλŒ€λ‘œ μ˜€λ§Œκ°€μ§€ νƒ€μž…μ΄ 올 수 μžˆλ‹€. λ”°λΌμ„œ μžλ°”λŠ” extends, super ν‚€μ›Œλ“œλ₯Ό 톡해 이λ₯Ό λ¬Έλ²•μ μœΌλ‘œ μ œν•œν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
1.
extend ν‚€μ›Œλ“œλ₯Ό 톡해 λͺ¨λ“  νƒ€μž…μ΄ μ•„λ‹Œ νŠΉμ • ν΄λž˜μŠ€μ™€ κ·Έ ν•˜μœ„ 클래슀둜 μ œν•œν•  수 μžˆλ‹€.
2.
& ν‚€μ›Œλ“œλ₯Ό 톡해 ν΄λž˜μŠ€μ™€ ν•¨κ»˜ μΈν„°νŽ˜μ΄μŠ€ μ œμ•½ 쑰건을 μ΄μš©ν•  수 μžˆλ‹€.

1. extends ν‚€μ›Œλ“œλ₯Ό ν†΅ν•œ Type Parameter μ œν•œ

class BoxMaterial { } class Paper extends BoxMaterial { } class Plastic extends BoxMaterial { } public class Box<M extends BoxMaterial> { private M material; public static void main(String[] args) { Box<Water> waterBox = new Box<>(); // λΆˆκ°€. BoxMaterialκ³Ό μžμ‹ νƒ€μž…λ§Œ κ°€λŠ₯ Box<Paper> paperBox = new Box<>(); Box<Plastic> plasticBox = new Box<>(); } }
Java
볡사
M extends BoxMaterialκ³Ό 같이 μ„ μ–Έν•¨μœΌλ‘œμ¨ Mμ—λŠ” λͺ¨λ“  νƒ€μž…μ΄ μ•„λ‹Œ BoxMaterialκ³Ό κ·Έ μžμ‹ 클래슀만 올 수 μžˆλ‹€.
extends 뒀에 μ˜€λŠ” νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€μ—¬λ„ λ™μΌν•˜κ²Œ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

2. & ν‚€μ›Œλ“œλ₯Ό ν†΅ν•œ μΈν„°νŽ˜μ΄μŠ€ μ œμ•½

class BoxMaterial implements Hard { } class Paper extends BoxMaterial { } class Plastic extends BoxMaterial { } public interface Hard { } public class Box<M extends BoxMaterial & Hard> { private M material; public static void main(String[] args) { Box<Paper> paperBox = new Box<>(); Box<Plastic> plasticBox = new Box<>(); } }
Java
볡사
extends 뒀에 μΈν„°νŽ˜μ΄μŠ€ μ œμ•½ 쑰건을 μ‚¬μš©ν•˜λ €λ©΄ & ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
M extends BoxMaterial & HardλŠ” Box의 material ν•„λ“œκ°€ BoxMaterialμ΄λ©΄μ„œ Hardλ₯Ό κ΅¬ν˜„ν•œ νƒ€μž…λ§Œ 지정할 수 μžˆλ„λ‘ μ œν•œν•œ 것이닀.

Generic μ™€μΌλ“œμΉ΄λ“œ

Generic으둜 κ΅¬ν˜„λœ λ©”μ†Œλ“œμ˜ κ²½μš°μ—λŠ” μ„ μ–Έλœ νƒ€μž…μœΌλ‘œλ§Œ λ§€κ°œλ³€μˆ˜λ₯Ό μž…λ ₯ν•΄μ•Όν•œλ‹€. 이λ₯Ό 상속받은 클래슀, ν˜Ήμ€ λΆ€λͺ¨ 클래슀λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•˜κ³  싢어도 λΆˆκ°€λŠ₯ν•˜λ©°, ν˜Ήμ€ κ·Έ μ–΄λ–€ νƒ€μž…μ΄ 와도 상관 μ—†λŠ” κ²½μš°μ— λŒ€μ‘ν•˜κΈ° 쒋지 μ•Šλ‹€. 이λ₯Ό μœ„ν•œ ν•΄λ²•μœΌλ‘œ Wildcardλ₯Ό μ‚¬μš©ν•œλ‹€.
1.
μ œλ„€λ¦­κ³Ό 상관없이 λͺ¨λ“  νƒ€μž…μ„ 담을 수 μžˆλ‹€.
2.
Generic Type 객체λ₯Ό ν• λ‹Ή 받을 λ•Œ μ™€μΌλ“œ μΉ΄λ“œ ? 이용
μ˜ˆμ‹œ
ArrayList <Animal> β‰  ArrayList<Dog> β‰  ArrayList<Cat> ArrayList의 경우 λ‹€ν˜•μ„±μ΄ μ•„λ‹ˆλΌ ArrayList μžμ²΄κ°€ λ‹€λ₯Έ 것이라 λΆˆκ°€λŠ₯ν•˜λ‹€! β‡’ κ·Έλ ‡λ‹€λ©΄ μ„œλ‘œ λ‹€λ₯Έ type의 ArrayListλ₯Ό λ„£κ³  싢은 경우 μ–΄λ–»κ²Œ?? β‡’ WildCard μ‚¬μš©! (Generic type에 상관없이 λͺ¨λ“  것을 받아쀄 수 μžˆλ‹€) ArrayList<?> , ArrayList< ? extends A>, ArrayList<? super B>

WildCard의 3가지 μ’…λ₯˜

1.
Unbound WildCard
List<?>와 같은 ν˜•νƒœλ‘œ λ¬ΌμŒν‘œλ§Œ 가지고 μ •μ˜ λ˜μ–΄μ§„λ‹€. λ‚΄λΆ€μ μœΌλ‘œλŠ” Object둜 μ •μ˜ λ˜μ–΄μ„œ μ‚¬μš©λ˜κ³  λͺ¨λ“  νƒ€μž…μ„ 인자둜 받을 수 μžˆλ‹€. νƒ€μž… νŒŒλΌλ―Έν„°μ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œλ§Œμ„ μ‚¬μš©ν•˜κ±°λ‚˜ Object λ©”μ†Œλ“œμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯으둜 μΆ©λΆ„ν•œ κ²½μš°μ— μ‚¬μš©ν•œλ‹€.
2.
Upper Bounded Wildcard
List<? extends Foo>와 같은 ν˜•νƒœλ‘œ μ‚¬μš©λ˜κ³ , νŠΉμ • 클래슀의 μžμ‹ ν΄λž˜μŠ€λ§Œμ„ 인자둜 λ°›κ² λ‹€λŠ” 선언이닀. μ˜ˆμ‹œμ—μ„œλŠ” Foo 클래슀λ₯Ό 상속받은 μ–΄λ–€ ν΄λž˜μŠ€κ°€ 와도 λ˜μ§€λ§Œ μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯은 Fooν΄λž˜μŠ€μ— μ •μ˜λœ κΈ°λŠ₯만 μ‚¬μš©κ°€λŠ₯ ν•˜λ‹€. 주둜 λ³€μˆ˜μ˜ μ œν•œμ„ μ™„ν™”ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©λœλ‹€
3.
Lower Bounded Wildcard
List<? super Foo>와 같은 ν˜•νƒœλ‘œ μ‚¬μš©λ˜κ³ , Upper boundedμ™€λŠ” λ°˜λŒ€λ‘œ νŠΉμ • 클래슀의 λΆ€λͺ¨ν΄λž˜μŠ€λ§Œμ„ 인자둜 λ°›κ² λ‹€λŠ” 선언이닀. μ˜ˆμ‹œμ—μ„œλŠ” Foo클래슀의 λΆ€λͺ¨μΈ μ–΄λ–€ 객체도 인자둜 올 수 μžˆμ§€λ§Œ, μ‚¬μš©ν• λ•ŒλŠ” Object둜 μ·¨κΈ‰ λœλ‹€.