[Java] 자바 #27, 제네릭(Generic)

제네릭(Generic)

- Java5부터 제네릭타입이 새로 추가.

- 제네릭을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있다.

- 컬렉션(***), 람다식, 스트림, NIO에서 널리 사용되므로 확실히 이해해두어야 한다.

- API 도큐먼트에보면 제네릭 표현이 많기 때문에 제네릭을 이해하지 못하면 API 도큐먼트를 정확히 이해할 수 없다.

- 메소드를 정의할 때 타입을 파라미터로 사용할 수 있도록 한다.

ex) 제네릭 클래스

class Wrapper<T>{

private T data;

public Wrapper(T data) {

this.setData(data);

}


public T getData() {

return data;

}


public void setData(T data) {

this.data = data;

}

@Override

public String toString() {

return this.data+"";

}

}


Wrapper<Integer> n3 = new Wrapper<Integer>(300);

Wrapper<Boolean> b3 = new Wrapper<Boolean>(true);

Wrapper<String> s3 = new Wrapper<String>("문자열");

< > 이안에 참조타입이 와야한다. 즉 클래스타입. 기본원시타입(int.boolean, double 등 )은 안된다.


제네릭을 선언했을 때의 뜻!!

- 멤버들중에 어떤 멤버의 자료형을 컴파일 할때 정하겠다.

- 어떤 멤버의 자료형은 내가 직접 객체 생성할 때 정하겠다.


ex)

class Tea<T>{    // T : 타입변수

//멤버구현 : 일반클래스와 동일하다.

public int a;

public String b;

public T c;

public void aaa(String str) {

}

}


Tea<String> t1 = new Tea();                 //비권장 - 레거시(곧 사라질 문법, 나중에 언제 피해볼지 모름) 

Tea<String> t2 = new Tea<>();             //비권장 - <>안에 타입을 지정해주지 않았기 때문

Tea<String> t3 = new Tea<String>();     //권장 - 정석.

t3.c="문자열";



인터페이스에도 사용이 가능하다.

- public interface 인터페이스명<T> { .... }



제네릭을 사용하는 요소

- List계열 컬렉션, Map계열 컬렉션, Set 계열 컬렉션 등... 스트림...

- List<String> list = new List<String>();   => String형 변수를 담는 list를 만들겠다. 

- List<Integer> list2 = new List<Integer>() => Integer형 변수를 담는 list를 만들겠다.

- 그 외의 다른 타입은 허용하지 않겠다.






댓글

Designed by JB FACTORY