λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ‹œλ„/ꡭ비지원

[D+67] Genericκ³Ό μ™€μΌλ“œμΉ΄λ“œ 볡슡 및 정리

by πŸ‡λ°•λ΄‰λ΄‰πŸ‡ 2022. 12. 23.

 

 

ꡭ비지원 D+67

-  Genericκ³Ό μ™€μΌλ“œμΉ΄λ“œ 볡슡 및 정리 -

 


 

 

Generic

μ§€κΈˆκΉŒμ§€λŠ” ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œλ₯Ό λ§Œλ“€λ•Œμ—λŠ” μ• μ΄ˆμ— νƒ€μž…μ„ κ²°μ •ν•΄μ„œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•΄μ™”λ‹€.

그런데 이런 경우 큰틀을 λ²—μ–΄λ‚˜μ§€ μ•ŠμœΌλ©΄μ„œ νƒ€μž…λ§Œ λ‹€λ₯Έ ν˜•μ‹μ˜ λ©”μ†Œλ“œλ‚˜ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬κ°œ ν•„μš”ν•  경우 각 νƒ€μž…μ— λ”°λΌμ„œ λ”°λ‘œλ”°λ‘œ μƒμ„±ν•΄μ£Όμ–΄μ•Όν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ μžˆμ—ˆλ‹€.

 

μš°λ¦¬λŠ” μ΄λŸ¬ν•œ 고민을 ν•΄κ²°ν•˜κ³ μž μ‚¬μš©ν•œ 것이 λ°”λ‘œ μ œλ„€λ¦­μ΄λ‹€.

 

• Generic Programming

μ œλ„€λ¦­μ€ μ‹€ν–‰μ‹œμ μ— λͺ…ν™•ν•œ λ°μ΄ν„°νƒ€μž…μ„ κ²°μ •ν•˜μ—¬ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λŠ” λ°©μ‹μœΌλ‘œ μž¬ν™œμš©μ„±κ³Ό μœ μ—°μ„±μ„ κ·ΉλŒ€ν™” ν•  수 μžˆλ‹€.

 

μž₯단점

- μž₯점 : κ·Έλ•Œ κ·Έλ•Œ λ§Œλ“€μ–΄μ„œ 상황에 λ”± λ“€μ–΄λ§žλŠ” 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

- 단점 : 상황에 λ”± λ“€μ–΄λ§žλŠ” 객체λ₯Ό λ§Œλ“€κΈ° 전에 λ¨Όμ € ν˜•ν‹€μ„ λ§Œλ“€μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— ν˜•ν‹€μ„ λ§Œλ“œλŠ” 과정이 λ‹€μ†Œ λ³΅μž‘ν•˜λ‹€.

 

κ΅¬ν˜„ 방법

1. Generic Class : 클래슀의 ν˜•ν‹€μ„ μ œμž‘ν•˜λŠ” 것이닀. (= κ·Έλ•Œκ·Έλ•Œ λ§žλŠ” ν΄λž˜μŠ€μ œμž‘)

2. Generic Method : λ©”μ†Œλ“œμ˜ ν˜•ν‹€μ„ μ œμž‘ν•˜λŠ” 것이닀. (=κ·Έλ•Œκ·Έλ•Œ λ§žλŠ” λ©”μ†Œλ“œ μ œμž‘)

 

// 1. Generic Class
class Box <T> (T obj) {}

// 2. Generic Method
public <T> void function (T obj) {}

 

• Generic의 λ°œμ „κ³Όμ •

// 1. Generic Class
class Box <T> (T obj) {}

// 2. Generic Method
public <T> void function (T obj) {}

μ œλ„€λ¦­μ€ μ‹€ν–‰μ‹œμ μ— νƒ€μž…μ΄ 정해지기 λ•Œλ¬Έμ— μ–΄λ–€ λ°μ΄ν„°νƒ€μž…μ΄ 듀어와도 μž…λ§›μ— 객체λ₯Ό 생성할 수 μžˆλŠ” νŠΉμ§•μ„ 가지고 μžˆλ‹€.

ν•˜μ§€λ§Œ 이λ₯Ό  λ‹¨μˆœνžˆ μœ μ—°μ„±μžˆκ²Œ 객체λ₯Ό μ œκ³΅ν•˜λŠ” 것이 μ•„λ‹Œ μ–΄λ–€ λ°μ΄ν„°νƒ€μž…μ΄ 와도 λ‹€ λ§Œλ“€μ–΄μ£Όκ² λ‹€λŠ” μ˜λ―Έμ΄κΈ°λ„ν•˜λ‹€.

 

class Box <T>
{
	private T obj;
	
	public T get()
	{
		return obj;
	}
	
	public void set(T obj)
	{
		this.obj = obj;
	}
	
    // error λ°œμƒ
	public int getIntValue()
	{
		// obj에 μˆ«μžκ΄€λ ¨ λ°μ΄ν„°νƒ€μž…μ΄ μ•„λ‹Œ λ‹€λ₯Έ νƒ€μž…μ΄ 듀어왔을 경우 μ‚¬μš©ν•  수 μ—†λ‹€.
		// => λ‹€λ₯Ένƒ€μž…에 λŒ€μ‘λΆˆκ°€λŠ₯
		return obj.intValue();
	}
}

즉 λ§Œμ•½ T에 μ•„λ¬΄λŸ° μ œμ•½μ‘°κ±΄μ„ λ§Œλ“€μ§€ μ•Šμ•˜μ„ κ²½μš°μ— λ§Œμ•½ νŠΉμ •λ°μ΄ν„°νƒ€μž…μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ†Œλ“œλ₯Ό λ§Œλ“€μ—ˆμ„ κ²½μš°μ— λ‹€λ₯Έ λ°μ΄ν„°νƒ€μž…μ€ 클래슀λ₯Ό μƒμ„±ν•˜λ”λΌλ„ μ—λŸ¬κ°€ λ°œμƒλ  수 μžˆλ‹€λŠ” 것이닀.

 

Generic νƒ€μž…μ˜ μ œν•œ

class Box <T extends Number>
{
	private T obj;
	
	public T get()
	{
		return obj;
	}
	
	public void set(T obj)
	{
		this.obj = obj;
	}
	
	public int getIntValue()
	{
		return obj.intValue();
	}
}

즉, Tκ°€ μ•„λ¬΄λŸ° μ œμ•½ 쑰건이 μ—†λŠ” κ²½μš°μ— νŠΉμ • λ©”μ†Œλ“œ ν˜Ήμ€ 속성듀을 μ΄μš©ν•  수 μ—†μ–΄ ν˜„μ‹€μ μœΌλ‘œ μ‚¬μš©μ΄ μ–΄λ ΅κΈ° λ•Œλ¬Έμ— T에 μ œμ•½μ‘°κ±΄μ„ 넣을 수 있게 λ˜λŠ” 것이고 μ œμ•½μ‘°κ±΄μ„ λ„£μœΌλ©΄μ„œ κΈ°μ‘΄ Tμ—μ„œ λ³΅μž‘ν•œ Tκ°€ λ˜λŠ” 것이닀.

 

<T extends Number> : Tκ°€ μ˜€λ“ μ§€ Numberλ‘œλΆ€ν„° νŒŒμƒλœ 클래슀만 μ‚¬μš©ν•  수 μžˆμ–΄

νƒ€μž…μ˜ μ œν•œμ€ μœ„μ™€κ°™μ€ λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•΄ 쀄 수 있으며, ν΄λž˜μŠ€μ™€ λ©”μ†Œλ“œμ—μ„œ λ‘˜λ‹€ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€.

 

μΈν„°νŽ˜μ΄μŠ€μ—μ„œμ˜ Generic μ‚¬μš©

* Class μ‚¬μš©
class Box <T extends Number>
→ T에 Numberκ°€ μ˜€λ˜μ§€, Numberμ—μ„œ νŒŒμƒλœ ν΄λž˜μŠ€κ°€ μ˜€λ„λ‘ν•œλ‹€.

* Interface μ‚¬μš©
class Box <T extends Cleanable>
→ CleanableμΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€κ°€ μ˜€λ„λ‘ ν•œλ‹€.

μ œλ„€λ¦­μ€ 클래슀 뿐만 μ•„λ‹ˆλΌ μΈν„°νŽ˜μ΄μŠ€μ—μ„œλ„ 적용될 수 있으며, μΈν„°νŽ˜μ΄μŠ€ 경우 ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€κ°€ μ˜€λ„λ‘ μ œμ•½μ‘°κ±΄μ„ κ±Έ 수 μžˆλ‹€.

 

닀쀑 μ œν•œ

class Box <T extends Number & Cleanable>

λ˜ν•œ μ œλ„€λ¦­μ€ ν•œκ°€μ§€λ‘œλ§Œ μ œν•œν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ—¬λŸ¬ 개의 μ œν•œμ„ λ‘˜ 수 있으면 μ΄λ•Œ &λ₯Ό μ‚¬μš©ν•΄μ£Όμ–΄μ„œ μ œν•œμ„ λ‘˜ 수 μžˆλ‹€.

 

 


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

κ°œλ… 및 μ‚¬μš©λͺ©μ 

- μ œλ„€λ¦­μ˜ 문법적 μš”μ†Œλ₯Ό ν™•μž₯ν•˜κΈ° μœ„ν•œ λ¬Έλ²•μœΌλ‘œ κΈ°μ‘΄ μ œλ„€λ¦­μ˜ μΌλ°˜ν™” κΈ°λŠ₯μ—μ„œ μ œμ•½κΈ°λŠ₯이 μΆ”κ°€λ˜μ—ˆλ‹€κ³  λ³Ό 수 μžˆλ‹€.

- μ œλ„€λ¦­μ˜ μ œν•œ 쑰건의 λͺ¨μžλ₯Έ 뢀뢄을 λ³΄κ°•ν•œλ‹€.

- extends 뿐만 μ•„λ‹ˆλΌ superλΌλŠ” κΈ°λŠ₯을 톡해 μƒν•œμ œν•œκ³Ό ν•˜ν•œμ œν•œμ„ 해쀄 수 μžˆλ‹€.

 

• μ™€μΌλ“œ μΉ΄λ“œμ˜ μƒν•œμ œν•œ

- λŒ€μƒ 클래슀 λ˜λŠ” κ·Έ ν΄λž˜μŠ€μ—μ„œ νŒŒμƒλœ ν΄λž˜μŠ€κ°€ μ™€μ•Όν•œλ‹€.

 

• μ™€μΌλ“œ μΉ΄λ“œμ˜ ν•˜ν•œμ œν•œ

- λŒ€μƒν΄λž˜μŠ€ λ˜λŠ” κ·Έ 클래슀의 λΆ€λͺ¨λ‚˜ μ‘°μƒν΄λž˜μŠ€κ°€ 올 수 μžˆλ‹€.

 

• μ œλ„€λ¦­κ³Ό μ™€μΌλ“œμΉ΄λ“œμ˜ 문법적 차이

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€