Generic이란?
class hello<T>{
T name;
public hello(T name){
this.name = name;
}
}
<T>를 Generic이라 부른다. 아래 코드를 보자
class Hello<T>{
T text;
public Hello(T text){
this.text = text;
}
void hi(){
System.out.println(text);
}
}
public class Main{
public static void main(String[] args){
Hello<String> hello = new Hello<String>("안녕");
hello.hi();
}
}
//출력
안녕
이 코드를 나중에 까먹었을 수 도 있는 나를 위해 차근차근 설명해보자면
Class Hello <T> type을 지정할 수 있는 Generic Class를 만든다 변수명은 Hello
public Hello(T text) T type의 변수를 생성자에 파라미터로 준다
this.text = text; 파라 미처 text를 Hello Class의 멤버 변수 text에 넣어준다
void hi() Hello Class에 새로운 함수 Hi를 만든다
System.out.println(text); Hello Class의 멤버 변수 text를 출력해준다.
Hello <String> hello = new Hello <String>("안녕"); Hello Class의 Type을 <String>으로 함으로써 T = String이 된다
hello.hi() 함수 호출
class Hello<String>{
String text;
public Hello(String text){
this.text = text;
}
void hi(){
System.out.println(text);
}
}
public class Main{
public static void main(String[] args){
Hello<String> hello = new Hello<String>("안녕");
hello.hi();
}
}
<T>를 String으로 바꿔준다 생각하면 됨
Generic Method란?
Generic을 함수에 사용한다 생각하면 된다 정훈아 당황하지 말자;;
public static <S> void hello(S a){
System.out.println(a);
}
//Main class
hello("안녕");
hello(1);
//출력
안녕
1
Main Class에서 hello 함수에 넣은 파라미터가 어떤 type을 가졌는지 추측하여
hello 함수의 S에 타입을 정의한다.
public static <S> void hello(S a){
System.out.println(a);
}
//Main class
<String>hello("안녕");
<Integer>hello(1);
//출력
안녕
1
이렇게 써도 된다 당황 말자 정훈아
Extends, Super
alcls 여기에도 extends와 super가 있다 당황하지 말자
interface just {
void hi();
}
class Hello<T> implements just {
T text;
public Hello(T text) {
this.text = text;
}
public void hi() {
System.out.println(text);
}
}
class Hula<S extends just> {
S info;
public Hula(S info) {
this.info = info;
}
}
public class Main{
public static void main(String[] args) {
Hello<String> hello = new Hello<String>("안녕");
/* 1. */
Hula<Hello> hula = new Hula<>(hello);
/*
* 2. Hula<Hello> hula = new Hula<>(new Hello<>("당황하지마"));
*/
System.out.println(hula.info.text);
}
}
//출력
1. 안녕
2. 당황하지마
<S extends just> 여기서 Extends의 뜻은 S로 들어온 type이 just 객체를 상속받고 있나를 말한다.
그러니 위 코드에서는 Interface just와 just를 상속받은 Hello가 들어오는 걸 원한다고 말하는 것이나 다름없다
2번 방법에서 new Hello <>("당황하지 마")가 <Generic> 설정을 하지 않아도 됐던 이유는
"당황하지 마"를 String으로 추측하였기 때문인 것 같다 (나도 잘은 모른다는 뜻;;)
이해하기 위한 문제
내가 작성한 코드를 이해하기만 하면 마스터는 아니라도 적당이 기본 이해는 했을 것이다... 아마?
class Person<T, S> {
T name; // String
S age; // Integer
public Person(T name, S age) {
this.name = name;
this.age = age;
}
}
class People<T, S, C> extends Person<T, S> {
C grade; // Integer
public People(T name, S age, C grade) {
super(name, age);
this.grade = grade;
}
}
//Person을 상속받는 객체만 사용가능
class StudentInfo<T extends Person> {
T info; // Person --> [People] grade사용 불가
public StudentInfo() {
this(null);
}
public StudentInfo(T info) {
this.info = info;
}
// T, V == > Person 클래스 아까 정의 해둔 String, Integer이 들어가게 되는건가?
public <T, V> void Study(Person<T, V> p1) {
System.out.println(p1.age);
}
}
public class Main {
public static void main(String[] args) {
People<String, Integer, Integer> p = new People<>("tom", 3, 3);
StudentInfo<Person> stu = new StudentInfo<>(p);
stu.Study(p);
}
}
Person Class와 People Class가 이름이 헷갈릴 수 도 있다. [People Class는 Person Class를 상속받는다]
한번 생각해보고 eclipse - [F11] 누르자 정훈아