-
[12회차-①] JAVA (제네릭-②)JAVA 2021. 4. 8. 03:54
강의명 : 오픈프레임워크 활용 디지털융합 SW엔지니어 양성 과정
강의 날짜 : 21.04.07
Java Platform SE 8
docs.oracle.com
자바의 클래스나 인터페이스, 메소드 등을 확인할 수 있으니 활용할 것
<제네릭-②>
1. 제네릭의 상속
제네릭 클래스나 메소드에서는 상속을 통해 사용할 자료형에 제한을 둘 수 있다.
<T extends 클래스>
package april7th; public abstract class Material { //추상 클래스 public abstract void doPrinting(); //추상 메소드 }
package april7th; public class Powder extends Material{ //Material클래스를 상속받은 Powder클래스 public void doPrinting() { System.out.println("Powder 재료로 출력합니다"); } public String toString() { return "재료는 powder입니다"; } }
package april7th; public class Plastic extends Material{ //Material클래스를 상속받은 Plastic클래스 @Override public void doPrinting() { System.out.println("Plastic재로로 출력합니다"); } public String toString() { return "재료는 plastic입니다"; } }
package april7th; public class Water { //Material클래스를 상속받지 않은 Water클래스 public void doPrinting() { System.out.println("물 재료로 출력합니다"); } public String toString() { return "재료는 물 입니다"; } }
package april7th; public class GenericPrinter <T extends Material>{ //제네릭 상속으로 받아올 자료형은 Material클래스형으로 제한되었다. private T material; public void setMaterial(T material) { this.material=material; } public T getMaterial() { return material; } public String toString() { return material.toString(); } public void printing() { material.doPrinting(); } }
package april7th; public class GenericPrinterTest { public static void main(String[] args) { //GenericPrinter는 Material형으로 제한되어있지만, Powder는 Material을 상속받은 상태 GenericPrinter<Powder> powderprinter = new GenericPrinter<Powder>(); powderprinter.setMaterial(new Powder()); //material이 Powder클래스를 받아옴 powderprinter.printing(); //material.doPrinting이 반환되므로 Powder.doPrinting이 실행 //GenericPrinter는 Material형으로 제한되어있지만, Plastic은 Material을 상속받은 상태 GenericPrinter<Plastic> plasticprinter = new GenericPrinter<Plastic>(); plasticprinter.setMaterial(new Plastic()); //material이 Plastic클래스를 받아옴 plasticprinter.printing(); //material.doPrinting이 반환되므로 Plastic.doPrinting이 실행 //Water클래스는 Material을 상속받지 않아 자료형 제한에 걸려 오류가 나게 된다 /*GenericPrinter<Water> waterprinter = new GenericPrinter<Water>(); waterprinter.setMaterial(new Plastic()); waterprinter.printing();*/ } }
2. 상한이 있는 와일드 카드
어떤 클래스의 자식 클래스들을 와일드 카드로 표시하려면 <? extends A>와 같이 표시한다
이것을 상한이 있는 와일드카드라고 한다.
List인터페이스의 경우는 정수형과 문자열 클래스가 이미 구현하고 있어서 그대로 사용이 가능하다.
그런데 이런 List인터페이스를 숫자로만 받아서 사용해야 하는 경우가 생긴다면,
문자열 리스트를 매개변수로 받아오는 경우에는 오류를 출력해야 한다.
package april7th; import java.util.Arrays; import java.util.List; public class WildCardList { public static void main(String[] args) { //정수형 리스트 List인터페이스 자료형 li생성 List<Integer> li=Arrays.asList(1,2,3); //배열{1,2,3}을 리스트로 바꾸어 줌 System.out.println("sum = "+sumOfList(li)); } //매개변수 List인터페이스가 받을 자료형의 상한이 Number인터페이스가 됨 public static double sumOfList(List<?extends Number> list) { double s=0.0; for(Number n : list) s+=n.doubleValue(); //실수형 값으로 바꾸어주는 메소드 return s; } }
3. 제한없는 와일드 카드
<?>로 사용
package april7th; import java.util.List; public class MyList { public static void printList(List<?> list) { //List인터페이스가 제한없이 자료형을 빋아옴 for (Object elem: list) System.out.print(elem+" "); System.out.println(); } }
package april7th; import java.util.Arrays; import java.util.List; public class WiildCardTest { public static void main(String[] args) { //정수형과 문자열 클래스는 List인터페이스가 구현되어 있어서 바로 사용이 가능 List<Integer> li =Arrays.asList(1,2,3); List<String> ls=Arrays.asList("one","two","three"); MyList.printList(li); MyList.printList(ls); } }
'JAVA' 카테고리의 다른 글
[12회차-③]JAVA (컬렉션 Set 인터페이스, Map 인터페이스) (0) 2021.04.08 [12회차-②] JAVA (컬렉션 List 인터페이스) (0) 2021.04.08 [11회차-②] JAVA (제네릭-①) (0) 2021.04.06 [11회차-①] JAVA (스윙 컴포넌트) (0) 2021.04.06 [10회차] JAVA (그래픽) (0) 2021.04.06