제네릭이란?
제네릭이란 데이터타입의 일반화(generalize)하는 것을 의미한다.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법입니다.
제네릭의 장점
1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있습니다
2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있습니다.
제네릭 선언
class Generic<T>{
T element;
void setElement(T element){this.element = element}
T getElement(){return element}
}
Class명에 <T>를 써줘서 제네릭을 선언할 수 있습니다. 여기서 T를 타입 변수(type variable)라고 하며,임의의 참조형 타입을 의미한다. ('T'말고 다른 문자도 상관없음) 여러 개의 타입 변수는 ','를 붙여서 사용한다.
제네릭 다형성 예제
import java.util.ArrayList;
class gwa {
public void eat(){
System.out.println("과일을 먹다.");
}
}
class apple extends gwa{
@Override
public void eat() {
System.out.println("사과를 먹다");
}
}
class orange extends gwa{
@Override
public void eat() {
System.out.println("오렌지를 먹다.");
}
}
class pine {
public void eat(){
System.out.println("사과를 먹다.");
}
}
class gwaList<T>{//제네릭선언
ArrayList<T> list = new ArrayList<>();
void add(final T g){list.add(g);}
T get(final int i){return list.get(i);}
}
public class generic {
public static void main(final String[] args) {
final gwaList<gwa> list = new gwaList<gwa>();//apple,orange를 상속한 추상클래스 gwa선언
final apple a = new apple();
final orange o = new orange();
list.add(a);
list.add(o);
list.get(0).eat();//사과를 먹다.
list.get(1).eat();//오렌지를 먹다.
}
}
위의 코드에서 처음 gwa라는 추상클래스를 선언하고 apple과 orange에서 gwa클래스를 상속받았다. 그리고 제네릭 클래스인 gwaList에 타입변수를 추가하였고 generic 클래스 main에서 타입변수안에 gwa클래스를 넣어 선언해줬다. 그 후 list에 apple과 orange를 add 한 후 각각의 eat메소드를 실행하니 오버라이드 된 메소드가 잘 출력되었다.
타입 변수의 제한
<T extends 원하는 타입> 이런식으로 선언하면 타입 변수를 특정 타입으로 제한할 수 있다.
(만약 클래스면 그 클래스의 자손까지 가능,인터페이스를 구현할 때에도 implements가 아니라 extends를 써야한다. )
제네릭 메소드
제네릭 메소드는 제네릭 클래스 안에 메소드 선언부에 타입 변수를 사용한 메소드를 의미한다.
제네릭 클래스에 선언한 타입 변수와 제네릭 메소드에 선언한 타입변수는 다른 타입 변수이다.
와일드카드
와일드 카드란 이름에 제한을 두지 않을을 표현하는데 사용하는 기호를 의미한다.
자바의 제네릭에서는 '?' 표시를 이용하여 사용한다.
<?> | 타입 변수에 모든 타입을 사용한다. |
<? extends T> | 타입 변수에 T 타입과 그 자손 클래스 타입을 사용 |
<? super T> | 타입 변수에 T 타입과 그 부모 클래스 타입을 사용 |
참조
http://tcpschool.com/java/java_generic_various
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'Java > Spring' 카테고리의 다른 글
[eGovFramework] 폼 검증(Form validation)하기 (0) | 2020.06.15 |
---|---|
Math 클래스 (0) | 2020.05.25 |
String, StringBuffer (0) | 2020.05.25 |
[JSTL] import (0) | 2020.05.22 |
자바 쓰레드(Thread) (0) | 2020.05.20 |
댓글