κ΅λΉμ§μ 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λΌλ κΈ°λ₯μ ν΅ν΄ μνμ νκ³Ό ννμ νμ ν΄μ€ μ μλ€.
• μμΌλ μΉ΄λμ μνμ ν
- λμ ν΄λμ€ λλ κ·Έ ν΄λμ€μμ νμλ ν΄λμ€κ° μμΌνλ€.
• μμΌλ μΉ΄λμ ννμ ν
- λμν΄λμ€ λλ κ·Έ ν΄λμ€μ λΆλͺ¨λ μ‘°μν΄λμ€κ° μ¬ μ μλ€.
• μ λ€λ¦κ³Ό μμΌλμΉ΄λμ λ¬Έλ²μ μ°¨μ΄
λκΈ