🔍 제네릭
- 객체에서 사용할 데이터타입을 클래스 정의 시 미리 정의하지 않고
실제 객체 생성 시 데이터 타입을 지정하여 사용하도록 하는 기법이다.
=> 객체를 생성할 때마다 각각 다른 데이터 타입으로 사용이 가능하다.
=> 데이터 타입을 지정 할 때 반드시 참조 데이터 타입으로만 지정이 가능하다. 기본형 사용 불가 !!!
ex) <int>는 불가능하고, <Integer>는 가능하다
- 데이터를 저장하는 시점에서 미리 저장 데이터에 대한 타입의 판별이 가능하므로, 데이터 저장시점에서
안정성을 향상시킨다.
- 데이터를 꺼내는 시점에서 저장된 데이터 타입만 꺼낼 수 있다는 보장이 생기므로 별도의 판별이나
형변환 없이 해당 타입을 그래도 사용 가능하다.
- 주로 Collectrion API 들은 대부분 제네릭 타입으로 클래스가 설계되어 있다.
- 만약 제네릭 타입 지정을 생략하는 경우 모든 데이터 타입은 Object로 고정된다.
✍ Integer 타입 제네릭 만들어 보기
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
for(Integer i : list) {
System.out.println(i);
}
}
=> Integer 타입으로 제네릭을 설정했기 때문에 반드시 정수 형태의 값만 들어가야 한다.
다른 타입의 데이터를 넣으려고 하면 컴파일 오류가 발생한다.
for문을 통해 list 에 저장된 모든 요소를 출력할 수 있다. 이 부분은 배열 출력과 거의 동일하다고 생각하면 된다.
💻
🔍 사용자 정의 클래스에 대한 제네릭 타입 적용
✍ 제네릭을 사용한 클래스 정의
- 클래스 정의 시점에서 클래스명 뒤에 <> 기호를 쓰고, 기호 사이에 '가상의 데이터타입'을 명시한다
=> 보통 영문 대문자 1글자를 사용한다. 주로 E(Element), T(Type) 등을 사용한다.
=> 가상의 데이터타입이므로 실제 데이터타입으로 사용은 불가능하지만, 제네릭 타입에서 임시로 설정하여 관리한다.
- 지정된 가상의 자료형은 클래스 내부에서 실제 데이터타입을 명시하는 부분에 대체가 가능하다.
✍ 클래스 정의
class GenericClass <T> {
T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
=> 대문자 T를 제네릭 타입으로 지정하였다.
public static void main(String[] args) { // 메인메서드
GenericClass<Integer> gc1 = new GenericClass<Integer>(); // 정수 타입
gc1.setData(1); // 데이터 저장. 정수만 가능
GenericClass<String> gc2 = new GenericClass<String>(); // String 타입
gc2.setData("홍길동"); // 데이터 저장. 문자열만 가능
GenericClass<Person> gc3 = new GenericClass<Person>(); // Person 타입
gc3.setData(new Person("이순신", 20)); // 데이터 저장. Person 객체 타입만 가능
Person p = gc3.getData();
System.out.println(p.getName() + ", " + p.getAge());
}
=> 위와 같이 원하는 참조 데이터 타입으로 제네릭을 여러번 지정할 수 있다.
단, 정수라면 정수, String이라면 문자열 이렇게 동일한 타입의 데이터만 저장이 가능하다.
제네릭이 String 인데 정수를 저장할 수 없다는 말이다.
또한 제네릭 타입으로 객체 타입을 지정할 수도 있다.
Setter로 데이터를 저장할 때 인스턴스를 생성한 후 생성자로 데이터를 초기화할 수 있다.
객체 참조변수에 데이터 저장후 출력이 가능하다.
💻
'개발 > Java' 카테고리의 다른 글
[Java] 제네릭 타입의 상속과 구현 (0) | 2023.03.11 |
---|---|
[Java] 제네릭 사용 시 주의사항 (0) | 2023.03.11 |
[Java] Collection - Map (0) | 2023.03.07 |
[Java] Collection Framework - List (0) | 2023.03.05 |
[Java] Collection Framework - Set (0) | 2023.03.04 |