충분히 쌓여가는
지네릭스 Generices 본문
Generices
컴파일시 타입을 체크해 주는 기능(compile-time type check)
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv()); // OK
tvList.add(new Audio()); // 컴파일 에러, Tv 외에 다른 타입은 저장 불가
객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌
지네릭스의 장점
1. 타입 안정성을 제공
2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다
코드
ClassCastException 발생: 컴파일러는 list.get(2)의 type가 Object라서 (Integer)를 허용하지만 실제로 list 안에 어떤 것이 들어있는지 확인할 수 없다
차라리 실행 시 발생하는 에러보다 컴파일 도중 발생하는 에러가 훨씬 낫다
import java.util.ArrayList;
public class GenericTest {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
list.add(10);
list.add(20);
list.add("30"); // String 추가
Integer i = (Integer)list.get(2); // 컴파일 OK
System.out.println(list);
}
}
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')
at GenericTest.main(GenericTest.java:10)
<Integer> 추가
이미 <Integer>로 Integer 타입만 들어올 수 있다는 것을 알기 때문에 (Integer)로 형변환을 할 필요가 없다
import java.util.ArrayList;
public class GenericTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(10); // list.add(new Integer(10));
list.add(20);
list.add(30); // 타입 체크 강화, 지네릭스
// Integer i = (Integer)list.get(2);
Integer i = list.get(2); // 형변환 생략 가능
System.out.println(list);
}
}
[10, 20, 30]
여러종류의 타입을 저장하고 싶은 경우 <Object> 사용
대신 형변환(String) 사용해야됨
import java.util.ArrayList;
public class GenericTest {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
list.add(10); // list.add(new Integer(10));
list.add(20);
list.add("30");
String i = (String)list.get(2);
System.out.println(list);
}
}
[10, 20, 30]
'Java > JAVA3' 카테고리의 다른 글
지네릭 메서드 (0) | 2023.07.28 |
---|---|
와일드 카드 <?>, 지네릭 메서드 (0) | 2023.07.28 |
제한된 지네릭 클래스, 지네릭스의 제약 (0) | 2023.07.27 |
지네릭스 용어, 지네릭 타입과 다형성 (0) | 2023.07.26 |
타입 변수 (0) | 2023.07.25 |