새소식

💻 Computer/🦀 Java

[Java] Generic

  • -
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] 누르자 정훈아 

'💻 Computer > 🦀 Java' 카테고리의 다른 글

[Java] Collection  (0) 2022.07.25
[Java] Comparable<T> , Comparator<T>  (0) 2022.07.25
[Java] String을 자세히  (1) 2022.07.22
[Java] Arrays.asList()은 무엇인가  (0) 2022.07.21
Java this 와 super  (0) 2022.07.17
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.