generic이란 class 내부에서 사용할 data type을 외부에서 지정하는 방법
//class Demo
public T data;
//T type 의 data변수 선언, 꼭 T를 쓸필요는없다.
//main
Demo<String> d1 = new Demo<String>();
Demo<Integer> d2 = new Demo<Integer>();
//data type이 정해져있지않은 class를 이용해
//객체를 생성하면서 data type을 정한다
-----
//일반적인 class 사용하는 방법
//class Demo
public Integer data;
public void setData(Integer data) {
this.data = data;
}
public Integer getData() {
return data;
}
//public class
//main
Demo d1 = new Demo();
Integer ing = new Integer(100);
d1.setData(ing);
System.out.println(d1.getData());
------
//class GenericDemo
public T data;
public void setData(T data) {
this.data = data;
}
public T getData() {
return data;
}
//public class
//main
GenericDemo<Integer> gd = new GenericDemo<Integer>();
gd.setData(new Integer(200));
System.out.println(gd.getData());
//data type을 class가 아닌 여기서 설정할수있다
GenericDemo<String> gd1 = new GenericDemo<String>();
gd1.setData("hello");
System.out.println(gd1.getData());
//하나의 class로 여러 data type을 만들수있어서 효율적이다
-------
//class StudentData
public String name;
StudentData(String name){
this.name = name;
} //생성자 생성
public String toString() {
return name;
}//주소값이 출력되기때문에 overriding해주거나
//(p1.data.name)형태로 출력해줘야한다
//class Person <T,E>
public T data;
public E id;
Person(T data, E id){
this.data = data;
this.id = id;
} //생성자 생성
//generic class를 복수의 type으로 사용할경우 참조형을 사용해야한다
//public class
//main
Person<StudentData, Integer> p1 =
new Person<StudentData, Integer> (new StudentData("jusung"), new Integer(20150000));
//person의 두개의 유형을 설정하고 객체를 생성한다
//복수의 type을 사용할경우 Reference type(참조형)만 가능하다
System.out.println(p1.data+p1.id);
//data의 경우 주소값이 출력이되기때문에 toString method를 overriding해줘야한다
-------
//class StudentData
public String name;
StudentData(String name){
this.name = name;
}
public String toString() {
return name;
}
//class Person <T,E>
public T data;
public E id;
Person(T data, E id){
this.data = data;
this.id = id;
}
public <T> void getInfo(T data) {
System.out.println(data);
} //T type의 매개변수를받아서 method에 사용할수있다
//public class
//main
Person p1 = new Person (new StudentData("jusung"), new Integer(20150000));
//두개의 매개변수를 이용해 type을 알수있기때문에
//<StudentData, Integer> 생략해줄수있다
System.out.println(p1.data+p1.id);
//toString을 overriding해줘서 사용하면된다
p1.<StudentData> getInfo(new StudnetData("jusung"));
StudentData sd = new StudentData("jusung");
p1.getInfo(sd); //sd의 type을 알수있기때문에 generic type을 생략해도된다
---------
//Generic 제한
//class Data
public String getData() {
return "people data";
}
//class StudentData extends Data
public String name;
StudentData(String name){
this.name = name;
}
public String toString() {
return name;
}
//class Person <T extends Data>
//T를 Data의 class나 Data의 자식 class인
//StudentData만을 사용하겠다는뜻이다
public T data;
Person(T data){
this.data = data;
}
public <T> void getInfo(T data) {
System.out.println(data);
}
//public class
//main
Person p1 = new Person("jusung");
----------
//interface 제한
//interface Data
int getData();
//class StudentData implements Data
public String name;
StudentData(String name){
this.name = name;
}
public int getData(){
return 20140002;
}//getData의 method를 overriding을 해준다
public String toString() {
return name;
}
//class Person <T extends Data>
//T를 Data의 interface나 Data class를 implements한
//StudentData만을 사용하겠다는뜻이다
public T data;
Person(T data){
this.data = data;
}
public <T> void getInfo(T data) {
System.out.println(data);
}
//public class
//main
StudentData sd = new StudentData("jusung")
Person p1 = new Person(sd);
p1.getInfo(sd); //jusung이 출력된다
'java' 카테고리의 다른 글
Colletions framework(ArrayList, HashSet) (0) | 2019.08.04 |
---|---|
이넘클래스(enum class) (0) | 2019.08.03 |
wrapper class (0) | 2019.08.03 |
Object class(toString(), Equals(), hashCode()) (0) | 2019.08.03 |
예외처리(Exception) (0) | 2019.08.03 |