Generics λ?
β μλ° 8 μμ μΆκ°λ¨
- λ°μ΄ν° νμ
(data type)μ μΌλ°ννλ€(Generalize)λ κ²μ μλ―Έ
== λ°μ΄ν° νμμ μμ‘΄νμ§ μκ³ , νλμ κ°μ΄ μ¬λ¬ λ€λ₯Έ λ°μ΄ν° νμ μ κ°μ§ μ μλλ‘ νλ λ°©λ²
νλ‘κ·Έλ¨μμ λ³μλ₯Ό μ μΈν λ λͺ¨λ λ³μλ μλ£νμ κ°μ§κ³ μμ.
(int, double, char ...)
λΏλ§ μλλΌ λ©μλμμ λ§€κ°λ³μλ₯Ό μ¬μ©νλ κ²½μ°μλ μλ£νμ κ°μ§κ³ μμ.
public void add(int a, int b){}
μ΄μ²λΌ μΌλ°μ μΈ κ²½μ°μλ νλμ μλ£νμΌλ‘ ꡬννμ§λ§, λ³μλ λ©μλμ μλ£νμ νμμ λ°λΌ μ¬λ¬ μλ£νμΌλ‘ λ°κΏ μ μλ€λ©΄ νλ‘κ·Έλ¨μ ν¨μ¬! μ μ°ν΄μ§λ€.
μ΄μ κ°μ΄ μ΄λ€ κ°μ΄ μ°Έμ‘°νλ μλ£νμ΄ μλ μ¬λ¬ μ°Έμ‘°νμ μ¬μ©ν μ μλλ‘ νλ‘κ·Έλλ° νλ κ²μ "μ λ€λ¦ νλ‘κ·Έλλ°' μ΄λΌκ³ ν¨.
μ λ€λ¦μ ν΄λμ€λ λ©μλμμ μ¬μ©ν λ΄λΆ λ°μ΄ν° νμ μ μ»΄νμΌ μμ 미리 μ§μ νλ λ°©λ²μ μ¬μ©!!!
μ΄λ κ² μ»΄νμΌ μ κ²μ¬λ₯Ό μννλ©΄ μλμ κ°μ μ₯μ μ κ°μ§.
- μ»΄νμΌ μ κ°ν νμ 체ν¬
- νμ λ³ν μ κ±°
μλ° 8 μ΄μ μ€νμΌ
public class Main {
public static void main(String[] args) {
List list = new ArrayList();
list.add("μλ
νμΈμ.");
list.add(0); // μ€λ₯ μλ¨.
String str = (String) list.get(1);
}
}
- String str = (String) list.get(1);
λμνλ©΄ μλλλ° μ»΄νμΌμ΄ μ€λ₯λ₯Ό λͺ» μ‘μλ. μ§κΈμ²λΌ κ°λ¨ν μμ μ½λλ₯Ό μ§€ λλ μ¬λμ΄ κΈλ°© μ‘μλΌ μ μμ§λ§ μΆν νμ μμ μ΄λ° μμΌλ‘ μ½λ μμ± ν λ°°ν¬νλ©΄ μΌμ΄ μ»€μ§ μ μμ.
π¨μ€λ₯ λ°μ
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
at μ λ€λ¦μΌλ°0127.Main.main(Main.java:12)
Generic νμ
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("java!");
String str = list.get(0); // νμ
λ³ν μ κ±°, 0λ²μ§Έ κ°μ μ½μ΄μ΄.
System.out.println(str);
}
}
hello
- String μ΄μΈμλ μλ°κ² λ€κ³ μ²μμ λ°μ΄ν° νμ μ§μ !(= κ°ν νμ 체ν¬)
- μ 리νλ©΄.. Listμμ μ¬μ©ν λ°μ΄ν° νμ μ 미리 μ§μ ν¨μΌλ‘μ¨ μ»΄νμΌ μ νμ 체ν¬κ° μΌμ΄λλλ‘ ν¨.
- λ°λΌμ, νμ λ³νλ μν΄λ λ¨.
Generic λ©μλ
- νμ λ³μλ₯Ό μ¬μ©ν΄ λ€νμ± κ΅¬ν(?)
- 컬λ μ νλ μμν¬μμ μ€μνκΈ° μ°μ΄λ λ¬Έλ²μ΄κΈ°λ ν¨.
- νμ λ³μλ ν΄λμ€ λΏλ§ μλλΌ λ©μλμ λ§€κ°λ³μλ λ°ννμ μΌλ‘λ μ¬μ© κ°λ₯
class Person <T> {
public T info;
Person(T info) {
this.info = info;
}
}
T λ₯Ό νμ λ³μ(type variable)λΌκ³ νλ©°, μμμ μ°Έμ‘°ν νμ μ μλ―Έν¨.
Tλ λ³μλͺ μ μλ―Ένλ©° λ€λ₯Έ λ¬Έμλ‘ ν΄λ λ¨..νλ μΌλ°μ μΌλ‘ λλ¬Έμ Tλ‘ μ.
public class Main {
public static void main(String[] args) {
Person<String> p1 = new Person<>("μ콩미");
System.out.println(p1.info);
Person<Integer> p2 = new Person<>(30);
System.out.println(p2.info);
}
}
- νμ λ³μλ λ©μλμ λ§€κ°λ³μλ λ°νκ°μΌλ‘λ μ¬μ© κ°λ₯
- μμ κ°μ΄ μ μΈλ μ λ€λ¦ ν΄λμ€λ₯Ό μμ±ν λμλ νμ λ³μ μ리μ μ¬μ©ν μ€μ νμ λͺ μνλ©΄ λ¨.
μ콩미
30
Generic λ©ν° νμ
class Product<T, M> {
private T name;
private M year;
public Product(T name, M year) {
this.name = name;
this.year = year;
}
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
public M getYear() {
return year;
}
public void setYear(M year) {
this.year = year;
}
}
public class MultiTypeEx {
public static void main(String[] args) {
Product<String, Integer> laptop = new Product<>("λ§₯λΆμμ΄", 2022);
System.out.println(laptop.getName());
Product<Integer, String> tv = new Product<>(2020, "λ§₯λΆνλ‘");
System.out.println(tv.getYear());
}
}
Generic μμ© μμ
public class Powder {
public void doPrinting() {
System.out.println("Powder μ¬λ£λ‘ μΆλ ₯ν©λλ€.");
}
@Override
public String toString() {
return "μ¬λ‘λ Powder μ
λλ€.";
}
}
- @Override λ Object ν΄λμ€
μ€λ²λΌμ΄λ© μνλ©΄ getMaterial() νΈμΆμ ν΄λΉ κ°μ²΄μ ν΄μμ½λκ° λ°νλκΈ° λλ¬Έμ μμ보기 νλ€μ΄μ μ¬μ©.
public class Plastic {
public void doPrinting() {
System.out.println("Plastic μ¬λ£λ‘ μΆλ ₯ν©λλ€.");
}
@Override
public String toString() {
return "μ¬λ‘λ Plastic μ
λλ€.";
}
}
public class GenericPrinter<T> {
private T material;
public void setMaterial(T material) {
this.material = material;
}
public T getMaterial() {
return material;
}
@Override
public String toString() {
return material.toString();
}
}
public class Main {
public static void main(String[] args) {
GenericPrinter<Powder> powderPrinter = new GenericPrinter<>();
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial();
System.out.println(powder);
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<>();
plasticPrinter.setMaterial(new Plastic());
Plastic plastic = plasticPrinter.getMaterial();
System.out.println(plastic);
}
}
- Powder νμ μ κ°μ²΄λ₯Ό μμ±νμ¬ setMaterial() μ λ§€κ°λ³μλ‘ μ λ¬
μ¬λ£λ νμ°λ μ
λλ€.
πΈ : μ μμ μ²λΌ T νμ μλ μ무거λ λ€μ΄μλ μκ΄μμ΄. νμ§λ§ μ΄λ κ² μ νμ΄ μμ κ²½μ°, μ€μ λμκ³Ό κ΄λ ¨ μλ νμ λ³μλ λ€ λ€μ΄κ° μ μκΈ° λλ¬Έμ λ¬Έμ κ° λ μ μμ΄. μ΄λ° μ΄μ λ‘ λ€μ΄κ° μ μλ κ²μ μ νλλ κ²λ κ°λ₯ν΄.
πΆ : μ΄λ»κ²?
πΈ : μμμ μ΄μ©νλ©΄ λΌ! μμ λ°μ§ μμ ν΄λμ€λ μμ±ν μ μλλ‘ μ νμ κ±°λκ±°μΌ.
public abstract class Material {
public abstract void doPrinting();
}
public class Powder extends Material {
@Override
public void doPrinting() {
System.out.println("Powder μ¬λ£λ‘ μΆλ ₯ν©λλ€.");
}
@Override
public String toString() {
return "μ¬λ£λ νμ°λ μ
λλ€.";
}
}
public class Plastic extends Material {
@Override
public void doPrinting() {
System.out.println("Plastic μ¬λ£λ‘ μΆλ ₯ν©λλ€.");
}
@Override
public String toString() {
return "μ¬λ£λ Plastic μ
λλ€.";
}
}
public class Water {
public void doPrinting() {
System.out.println("Water μ¬λ£λ‘ μΆλ ₯ν©λλ€.");
}
@Override
public String toString() {
return "μ¬λ£λ Water μ
λλ€.";
}
}
- Water ν΄λμ€λ Material μμ μ ν¨
public class GenericPrinter<T extends Material> {
private T material;
public void setMaterial(T material) {
this.material = material;
}
public T getMaterial() {
return material;
}
@Override
public String toString() {
return material.toString();
}
}
- Materialλ₯Ό μμλ°μ ν΄λμ€λ§ νμ λ³μλ‘ μ§μ κ°λ₯νλλ‘ μ ν!
Main
GenericPrinter<Water> waterPrinter = new GenericPrinter<>();
java: type argument μ λ€λ¦μμ©0130.Water is not within bounds of type-variable T
μ€λ₯!!
νμ λ³μλ₯Ό Material μμ ν΄λμ€λ§ λ€μ΄μ¬ μ μλλ‘ μ ννκΈ° λλ¬Έμ Waterλ μ§μ λΆκ°
μ¬μ©νλ €λ©΄ Water extends Material ν΄μ£Όλ©΄ λ¨.
νμ§λ§! μ€μ λ‘ ν΄λμ€ μ€κ³ν λλ λ§€κ°λ³μ λ€νμ±μΌλ‘ μ¬μ©νλ κ²μ΄ μ’μ.
ν΄λΉ μμ λ 컬λ μ νλ μμν¬ μλ£κ΅¬μ‘°κ° μ΄λ° μμΌλ‘ μ¬μ©λκ³ μμμ μ΄ν΄νκΈ° μν΄ ν΄λ³Έ κ²μμ μΈμ§νμ.
'ποΈ Backend > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| μλ°(Java) - 컬λ μ νλ μμν¬(1) List(ArrayList, LinkedList, Vector) (0) | 2023.01.30 |
|---|---|
| μλ°(Java) - 컬λ μ νλ μμν¬ (0) | 2023.01.30 |
| μλ°(Java) - API ν΄λμ€ (7) Arrays ν΄λμ€ (0) | 2023.01.27 |
| μλ°(Java) - API ν΄λμ€ (6) Wrapper ν΄λμ€ (0) | 2023.01.27 |
| μλ°(Java) - API ν΄λμ€ (5) Date, Calendar ν΄λμ€ (0) | 2023.01.26 |