제너릭
클래스, 인터페이스, 메소드의 파라미터, 메소드의 리턴타입에서 사용된다.
import static java.lang.System.out;
/*
* 제너릭 클래스 -> 특정 자료형의 값만 입력받아서 저장, 조회, 계산, 출력
* 멤버변수, 메소드의 매개변수에도 제너릭 부여가능하다
*/
public class GenericEx{
String v[];
Double v2[];
public void set(String n[]) { v=n; }
public void set(Double n[]) { v2=n; }
public void print() {
for(String s:v)
//System.out.println(s);->메모리에 먼저 올려놔서 클래스명 생략가능
out.println(s);
}
public void print2() {
for(Double s:v2)
out.println(s);
}
}
public class GenericMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
GenericEx ge= new GenericEx();
GenericEx ge2= new GenericEx();
String ss[]= {"A","B","C"};
ge.set(ss);
ge.print();
Double ss2[]= {3.4,5.6,9.8};
ge2.set(ss2);
ge.print2();
}
}
↓
import static java.lang.System.out;
public class GenericEx<T> {
//Type -> 외부에서 전달되는 자료형을 의미
T v[]; //자료형 여러개를 T라는 타입으로 통합할 수 있음
public void set(T n[]) {
v=n;
}
public void print() {
for(T s:v)
out.println(s);
}
}
public class GenericMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
GenericEx<String> ge= new GenericEx<String>();
GenericEx<Double> ge2= new GenericEx<Double>();
String ss[]= {"A","B","C"};
ge.set(ss);
ge.print();
Double ss2[]= {3.4,5.6,9.8};
ge2.set(ss2);
ge.print();
}
}
와일드 카드를 이용한 제너릭 사용법
import java.util.*;//List,ArrayList
//1.<?> 와일드 카드를 이용한 제너릭 방법 => 메소드 호출시 매개변수 값을 전달
public class WildTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.문자열
//List list = new List();//인터페이스는 자기 자신의 객체를 생성할 수 없음
//인터페이스형 객체명 = new 자식클래스명();
List<String> list = new ArrayList<String>();
list.add("t1"); list.add("t2"); list.add("t3");
printData(list);
//2.정수형
List<Integer> list2 = new ArrayList();//<Integer>생략가능
list2.add(10); list2.add(20); list2.add(30);
printData(list2);
//3.실수형
List<Double> list3 = new ArrayList();//래퍼클래스인 Double쓰는거 잊지말기
list3.add(1.2); list3.add(3.4); list3.add(5.6);
printData(list3);
}
//<?> : 매개변수를 전달 받을때 그때 그때 마다 자료형을 바꿔서 받겠다는 의미
//String, Double, Integer ,,,-> 내부적으로 Object형으로 받겠다
public static void printData(List<?> list) {
for(Object obj:list)
System.out.println(obj);//obj.toString()=> 문자로 출력
}
/*
public static void printData(List<String> list) {
for(String obj:list)
System.out.println(obj);//obj.toString()=> 문자로 출력
}
public static void printData(List<Integer> list) {//=>이거 안됨
for(String obj:list)
System.out.println(obj);
}
//오버로딩의 경우 자료형과 갯수가 같으면 안됨, 제너릭이 다르다고 해서 자료형이 다른건 아님
public static void printData2(List<Integer> list) {
for(Integer obj:list)
System.out.println(obj);
}
public static void printData3(List<Double> list) {
for(Double obj:list)
System.out.println(obj);
}*/
}
<? extends T>
: 와일드카드의 상한을 제한한다. T와 T를 상속받은 자식과 관련된 클래스만 매개변수로 받아들일 수 있다.
package j210122;
import java.util.*;//List,ArrayList
/* 2.<? extends T> => 상속관계에 있는 클래스만 매개변수로 전달받겠다
* 와일드카드에는 T와 T를 상속받는 자식클래스가 들어갈 수 있다, 와일드카드의 상한을 제한함
* */
class Test{//부모클래스
String name;
}
class Person{//부모클래스
String name;
}
//Man
class Man extends Person{
Man(String name){
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name;
}
}
//Woman
class Woman extends Person{
Woman(String name){
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name;
}
}
public class WildExtend {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.Man
List<Man> list = new ArrayList<Man>();
/*Man m =new Man("테스트1");
list.add(m); */
list.add(new Man("테스트1"));
list.add(new Man("테스트2"));
printData(list);
//2.Woman
List<Woman> list2 = new ArrayList();
list2.add(new Woman("임시1"));
list2.add(new Woman("임시2"));
printData(list2);
//3.Person
List<Person> list3 = new ArrayList();
list3.add(new Person());
printData(list3);
/*=> List<? extends Person> 에 해당 x
//4.Test
List<Test> list4 = new ArrayList();
list4.add(new Test());
printData(list4);
*/
}
public static void printData(List<? extends Person> list) {
//Person과 Person을 상속받는 자식클래스만 범위에 해당함
for(Object obj:list)
System.out.println(obj);
}
}
<? super T>
: 와일드카드의 하한을 제한한다. T와 T의 부모클래스만 매개변수로 받아들일 수 있다
'JAVA' 카테고리의 다른 글
[JAVA] 멀티 스레드, 스레드 동기화 구현하기 (0) | 2021.06.24 |
---|---|
[JAVA] 프로세스, 스레드 개념, 스레드 메소드 start() run() (0) | 2021.06.23 |
[JAVA] 인터페이스 객체 생성하는 3가지 방법 (0) | 2021.06.22 |
[JAVA]List, Set, Map 인터페이스/ 예시 (0) | 2021.06.21 |
[JAVA]컬렉션프레임워크 인터페이스 종류 / List, Set, Map (0) | 2021.06.21 |