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

+ Recent posts