프로그램에서 변수를 선언할 때 모든 변수는 자료형이 있습니다. 메서드에서 매개변수를 사용할 때도 자료형을 가지고 있습니다. 대부분은 하나의 자료형으로 구현하지만, 변수나 메서드의 자료형을 필요에 따라 여러 자료형으로 바꿀 수 있다면 프로그램이 훨씬 유연할 것입니다. 이러한 하나의 참조가 아닌 여러 참조 자료형을 사용할 수 있도록하는 것이 제네릭입니다.
제네릭을 사용하는 이점
- 제네릭은 컴파일 타임에 유효성을 검사하기 때문에 안정성이 높습니다.
런타임이 아닌 컴파일 타임에 체크하기 때문에 프로그램 동작에 영향을 주지 않습니다. - 타입변환에 관한 코드를 제거할 수 있습니다.
Generic 대신 Object로 코드를 작성하게 된다면, 형 변환에 대한 비용이 발생하게 됩니다.
제네릭 클래스를 사용하면 컴파일러는 일단 대입된 자료형이 잘쓰였는지 확인합니다. 그리고 class 파일을 생성할 때 T를 사용한 곳에 지정된 자료형에 따라 컴파일하므로 형 변환을 하지 않아도 됩니다.
제네릭 사용방법
public class 클래스명<T> {
private T 변수명;
public void 메서드명(T a) {
...
}
public T 메서드명() {
...
}
}
클래스명를 제네릭 자료형, 매개변수화된(Parameterized) 자료형입니다. T는 대입된 자료형입니다.
자료형 매개변수로 T 외에 다른문자도 사용할 수 있습니다. E는 element, K는 key, V는 value 를 의미합니다. 의미가 그렇다는것이지 꼭 이런 문자를 사용해야하는것은 아닙니다. A,B 등 아무 문자나 사용해 서 정의할 수도 있습니다.
다이아몬드 연산자 <>
자바 7부터는 제네릭 자료형의 클래스를 생성할 때 생성자에 사용하는 자료형을 명시하지 않을 수 있습니다.
ArrayList<String> list = new ArrayList<>();
선언된 자료형을 보고 생략된 부분이 String을 컴파일러가 유추할 수 있기 때문에 생성부분에서는 생략할 수 있습니다.
T와 static
static 변수는 인스턴스 변수가 생성되기 전에 생성됩니다. 제네릭 자료형이 정해지는 순간은 제네릭 클래스의 인스턴스가 생성되는 순간입니다. 그렇기 때문에 static 변수와 static 메서드 내부에서 제네릭을 자료형으로 사용할 수 없습니다.
<T extends 클래스>
제네릭 클래스에서 T 자료형에 사용할 자료형에 아래와 같이 제한을 둘 수 있습니다.
public class 클래스명<T extends 클래스명> { ... }
해당으로 작성하게 된다면 extends 뒤에 위치하는 클래스만 타입으로 가질 수 있습니다.
이런 경우 추상화된 상위 클래스를 통해 범위를 지정합니다. 〈T extends 클래스〉로 선언하면 제네릭 클래스를 사용할 때 상위 클래스에서 선언한 메서드를 사용할 수도 있습니다.
[ 출처 : Do it Java 프로그래밍 ]
'Language > Java' 카테고리의 다른 글
[Java] SOLID (0) | 2021.09.29 |
---|---|
[Java] 객체 지향 언어 (0) | 2021.09.29 |
[Java] 다형성 (0) | 2021.01.01 |
[Java] 실행 데이터 영역 (Runtime Data Area) (0) | 2020.12.27 |
[Java] 자바 클래스 로더 (0) | 2020.12.26 |
댓글