βΆ μ λ€λ¦
μ΄λ€ κ°μ΄ νλμ μ°Έμ‘° μλ£νμ΄ μλ μ¬λ¬ μ°Έμ‘° μλ£νμ μ¬μ©ν μ μλλ‘ νλ‘κ·Έλλ°νλ κ²μ 'μ λ€λ¦ νλ‘κ·Έλλ°'μ΄λΌκ³ νλ€.
β
ThreeDPrinter3.java
package genericsTest;
public class ThreeDPrinter3 {
private Object material;
public Object getMaterial() {
return material;
}
public void setMaterial(Object material) {
this.material = material;
}
}
μ΄λ€ μ¬λ£λ μΈ μ μλλ‘ material λ³μμ μλ£νμ Objectλ‘ μ¬μ©ν μ μλ€.
(Objectλ λͺ¨λ ν΄λμ€μ μ΅μμ ν΄λμ€μ΄λ―λ‘ λͺ¨λ ν΄λμ€λ Objectλ‘ λ³νν μ μμ)
νμ§λ§ λ¨μ μ΄ μλ€. βΌβΌ
setMaterial( ) λ©μλλ₯Ό νμ©νμ¬ Powderλ₯Ό μ¬λ£λ‘ μ νν λλ 맀κ°λ³μ μλ£νμ΄ Objectμ΄λ―λ‘ μλ νλ³νμ΄ λλ€. νμ§λ§ λ°ννμ΄ Object ν΄λμ€μΈ getMaterial( ) λ©μλλ‘ Powder μλ£ν λ³μλ₯Ό λ°νλ°μ λλ λ°λμ ν λ³νμ ν΄μ€μΌ νλ€.
μ¦, μ΄λ€ λ³μκ° μ¬λ¬ μ°Έμ‘° μλ£νμ μ¬μ©ν μ μλλ‘ Object ν΄λμ€λ₯Ό μ¬μ©νλ©΄ λ€μ μλ μλ£νμΌλ‘ λ°νν΄ μ£ΌκΈ° μν΄ λ§€λ² ν λ³νμ ν΄μΌ νλ λ²κ±°λ‘μμ΄ μλ€.
β
β
β
*μ λ€λ¦ ν΄λμ€ μ μνκΈ°
μ λ€λ¦μμλ μ¬λ¬ μ°Έμ‘° μλ£νμ μ¬μ©ν΄μΌ νλ λΆλΆμ Objectκ° μλ νλμ λ¬Έμλ‘ νννλ€.
β
μ½λλ₯Ό 보면 μ¬λ¬ μλ£νμΌλ‘ λ°κΎΈμ΄ μ¬μ©ν material λ³μμ μλ£νμ TλΌκ³ μΌλ€. μ΄ λ Tλ₯Ό μλ£ν 맀κ°λ³μλΌκ³ λΆλ₯Έλ€. (T λ§κ³ λ€λ₯Έκ±° μ¨λ λ¨)
ν΄λμ€ μ΄λ¦μ GenericPrinter<T>λΌκ³ μ μνκ³ λμ€μ ν΄λμ€λ₯Ό μ¬μ©ν λ T μμΉμ μ€μ μ¬μ©ν μλ£νμ μ§μ νλ€. ν΄λμ€μ κ° λ©μλμμ ν΄λΉ μλ£νμ΄ νμν λΆλΆμλ λͺ¨λ T λ¬Έμλ₯Ό μ¬μ©νμ¬ κ΅¬ννλ€.
β
β
β
*μλ£ν 맀κ°λ³μ Tμ static
static λ³μλ λ©μλλ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ ν΄λμ€ μ΄λ¦μΌλ‘ νΈμΆν μ μλ€.
static λ³μλ μΈμ€ν΄μ€ λ³μκ° μμ±λκΈ° μ΄μ μ μμ±λλ€. λν static λ©μλμμλ μΈμ€ν΄μ€ λ³μλ₯Ό μ¬μ©ν μ μλ€. κ·Έλ°λ° Tμ μλ£νμ΄ μ ν΄μ§λ μκ°μ μ λ€λ¦ ν΄λμ€μ μΈμ€ν΄μ€κ° μμ±λλ μκ°μ΄λ€. λ°λΌμ Tμ μλ£νμ΄ κ²°μ λλ μμ λ³΄λ€ λΉ λ₯΄κΈ° λλ¬Έμ static λ³μμ μλ£νμ΄λ static λ©μλ λ΄λΆ λ³μμ μλ£νμΌλ‘ Tλ₯Ό μ¬μ©ν μ μλ€.
β
β
β
*μ λ€λ¦ ν΄λμ€ μ¬μ©νκΈ°
Powderκ° μ¬λ£μΈ Printerλ λ€μκ³Ό κ°μ΄ μ μΈνμ¬ μμ±νλ€.
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial(); // λͺ
μμ ν λ³νμ νμ§ μμ
Tλ‘ μ μν ν΄λμ€ λΆλΆμ Powderνμ λ£μ΄ μ£Όκ³ , Tν 맀κ°λ³μκ° νμν λ©μλμ Powder ν΄λμ€λ₯Ό μμ±νμ¬ λμ ν΄μ€λ€. GenericPrinter<Powder>μμ μ΄λ€ μλ£νμ μ¬μ©ν μ§ λͺ μνμΌλ―λ‘ getMaterial( ) λ©μλμμ λ°νν λ ν λ³νμ νμ§ μλλ€. μ΄λ κ² μ€μ μ λ€λ¦ ν΄λμ€λ₯Ό μ¬μ©ν λ T μμΉμ μ¬μ©ν Powderνμ 'λμ λ μλ£ν'μ΄λΌ νκ³ , Powderλ₯Ό λμ ν΄ λ§λ GenericPrinter<Powder>λ₯Ό 'μ λ€λ¦ μλ£ν'μ΄λΌκ³ νκ² λ€.
μ©μ΄ |
μ€λͺ |
GenericPrinter<Powder> |
μ λ€λ¦ μλ£ν(Generic type), 맀κ°λ³μνλ μλ£ν(parameterized type) |
Powder |
λμ λ μλ£ν |
μ λ€λ¦μΌλ‘ ꡬννλ©΄ μ ν λ³νμ νμ§ μμλ λ κΉ? μ λ€λ¦ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ μ»΄νμΌλ¬λ μΌλ¨ λμ λ μλ£νμ΄ μ μ°μλμ§ νμΈνλ€. κ·Έλ¦¬κ³ class νμΌμ μμ±ν λ Tλ₯Ό μ¬μ©ν κ³³μ μ§μ λ μλ£νμ λ°λΌ μ»΄νμΌνλ―λ‘ ν λ³νμ νμ§ μμλ λλ€. λ°λΌμ μ λ€λ¦μ μ¬μ©νλ©΄ μ»΄νμΌλ¬κ° μλ£νμ νμΈν΄ μ£ΌκΈ° λλ¬Έμ μμ μ μ΄λ©΄μ ν λ³ν μ½λκ° μ€μ΄λ λ€.
β
β
β
*μ λ€λ¦ ν΄λμ€ μ¬μ© μμ
Powder.java
package generics;
public class Powder {
public void doPrinting() {
System.out.println("Powder μ¬λ£λ‘ μΆλ ₯ν©λλ€.");
}
public String toString() {
return "μ¬λ£λ Powder μ
λλ€.";
}
}
Plastic.java
package generics;
public class Plastic {
public void doPrinting() {
System.out.println("Plastic μ¬λ£λ‘ μΆλ ₯ν©λλ€.");
}
public String toString() {
return "μ¬λ£λ Plastic μ
λλ€.";
}
}
GenericPrinter.java
package generics;
public class GenericPrinter<T> {
private T material; // T μλ£νμΌλ‘ μ μΈν λ³μ
public T getMaterial() { // T μλ£ν λ³μ materialμ λ°ννλ μ λ€λ¦ λ©μλ
return material;
}
public void setMaterial(T material) {
this.material = material;
}
public String toString() {
return material.toString();
}
}
GenericPrinterTest.java
package generics;
public class GenericPrinterTest {
public static void main(String[] args) {
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>(); // PowderνμΌλ‘ GenericPrinter ν΄λμ€ μμ±
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial(); // λͺ
μμ ν λ³νμ νμ§ μμ
System.out.println(powderPrinter);
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>(); // PlasticνμΌλ‘ GenericPrinter ν΄λμ€ μμ±
plasticPrinter.setMaterial(new Plastic());
Plastic plastic = plasticPrinter.getMaterial();
System.out.println(plasticPrinter);
}
}
<μ€ν κ²°κ³Ό>
βΆ T μλ£νμ μ¬μ©ν μλ£νμ μ ννλ <T extends ν΄λμ€>
μ λ€λ¦ ν΄λμ€μμ T μλ£νμ μ¬μ©ν μλ£νμ μ νμ λ μ μλ€.
μ¬μ©ν ν΄λμ€μ μλ£ν μ νμ λλ λ°©μμΌλ‘ extends μμ½μ΄λ₯Ό μ¬μ©νλ€.
β
Material.java
package generics;
public abstract class Material {
public abstract void doPrinting();
}
Powder.java
package generics;
public class Powder extends Material {
public void doPrinting() {
System.out.println("Powder μ¬λ£λ‘ μΆλ ₯ν©λλ€.");
}
public String toString() {
return "μ¬λ£λ Powder μ
λλ€.";
}
}
Plastic.java
package generics;
public class Plastic extends Material {
public void doPrinting() {
System.out.println("Plastic μ¬λ£λ‘ μΆλ ₯ν©λλ€.");
}
public String toString() {
return "μ¬λ£λ Plastic μ
λλ€.";
}
}
βΆ <T extends ν΄λμ€>λ‘ μμ ν΄λμ€ λ©μλ μ¬μ©νκΈ°
β
GenericPrinter.java
package generics;
public class GenericPrinter<T extends Material> { // extends μμ½μ΄λ‘ μ¬μ©ν μ μλ μλ£νμ μ νμ λ
private T material;
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
public String toString() {
return material.toString();
}
public void printing() {
material.doPrinting(); // μμ ν΄λμ€ Material λ©μλ νΈμΆ
}
}
ν΄λμ€ μ΄λ¦μ <T extends Material>μ΄λΌκ³ λͺ μνμ¬ μ¬μ©ν μ μλ μλ£νμ μ νμ λλ€.
<T extends Material>λ‘ μ μΈνλ©΄ μ λ€λ¦ ν΄λμ€λ₯Ό μ¬μ©ν λ μμ ν΄λμ€ Materialμμ μ μΈν λ©μλλ₯Ό μ¬μ©ν μ μλ€(ex. doPrinting( ) λ©μλ). λ§μ½ Material ν΄λμ€λ₯Ό μμλ°μ§ μμ λ€λ₯Έ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ μ€λ₯κ° λλ€.
β
<T extends Material>μ μ¬μ©νλ©΄ T μλ£νμ΄ Objectκ° μλ Materialλ‘ λ³νλκ³ μ¬μ©νμ§ μμΌλ©΄ Tλ₯Ό μ»΄νμΌν λ Object ν΄λμ€λ‘ λ³νλλ€. λ°λΌμ <T extends Material>λ₯Ό μ¬μ©νμ§ μμ κ²½μ°μλ Object ν΄λμ€κ° κΈ°λ³ΈμΌλ‘ μ 곡νλ λ©μλλ§ μ¬μ©ν μ μλ€. μλνλ©΄ μλ£νμ μ μ μκΈ° λλ¬Έμ΄λ€.
β
β
GenericPrinterTest2.java
package generics;
public class GenericPrinterTest2 {
public static void main(String[] args) {
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
powderPrinter.printing();
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
plasticPrinter.setMaterial(new Plastic());
plasticPrinter.printing();
}
}
<μ€ν κ²°κ³Ό>
β
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java-κΈ°μ΄] μκ³ λ¦¬μ¦ μμ (νμ μμ°¨) (0) | 2021.02.21 |
---|---|
[Java-κΈ°μ΄] μ λ€λ¦ λ©μλ νμ©νκΈ° (0) | 2021.02.21 |
[Java-κΈ°μ΄] Class ν΄λμ€ (0) | 2021.02.21 |
[Java-κΈ°μ΄] Wrapper ν΄λμ€ (0) | 2021.02.21 |
[Java-κΈ°μ΄] κ·Έ λ°μ λ€λ₯Έ String κ΄λ ¨ λ©μλ (0) | 2021.02.21 |
λκΈ