Java 지네릭스(Generics)
by 볼빵빵오춘기지네릭스(Generics)
- 컴파일시 타입을 체크해 주는 기능이다.(compile-time-type check) - JDK1.5
ArrayList는 Object 배열을 가지고 있어서 모든 종류의 객체가 저장가능하다.
그런데 만약에 Tv만 저장하고 싶은데 지네릭스가 있기전에 Audio처럼 다른 것을 넣어도 잡아낼 수 없었다.
⇒ 따라서 지네릭스가 있고 난 후에 tvList처럼 Tv타입만 넣고 싶고 다른 타입을 넣으면 못들어오게 막아낸다.
예제 코드 - 컴파일시 타입을 체크해 주는 기능
import java.util.*;
import static java.util.Collections.*;
public class Try {
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); // 주석처리 해제 전
System.out.println(list);
}
}
⇒ 빨간색 줄로 뜨거나 문제된다고 알려주는 표시가 나오지 않음. 컴파일해서 실행하면 결과값 잘나온다.
Integer i = (Integer)list.get(2); // 주석처리 해제. 컴파일 시에는 문제 없음
예제 코드1에서 주석처리를 해제 하면
⇒ 컴파일 시에는 문제 없었지만 실행을 하면 형변환 에러발생한다.
🤔 why? 컴파일러의 한계로 인해서 코드의 문제를 잡아내지 못했다.
이러한 이유로 지네릭스가 나왔다.
Integer타입만 저장할려면 다음과 같이 코드를 변경한다.
import java.util.*;
import static java.util.Collections.*;
public class Try {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10);
list.add(20);
list.add("30"); // String을 추가
Integer i = (Integer)list.get(2);
System.out.println(list);
}
}
⇒ list.add("30"); 부분에 빨간줄이 뜨기 때문에 컴파일시에도 잘못됐다는 것을 알아차릴 수 있다.
⇒ 또한 list.get(2)하면서 형변환을 해주고 변수 i에 넣어주는데 이 부분도 생략이 가능해진다.
🤔 위에 예로 Integer 타입만 들어올 수 있도록 해줬는데 Integer타입 말고 다른 타입도 넣고 싶다면?
ArrayList<Object> list = new ArrayList<Object>();
Integer 썼던 부분에 Object로 넣어주면 된다.
But, <Object>가 생략이 가능하나 일반클래스에서 지네릭클래스로 변경된 부분이 있기때문에 써주길 바란다.
또한 위에서 (Integer)list.get(2); 형변환코드는 생략이 가능했으나 Object를 써줌으로써 다시 형변환코드를 다시 넣어주어야한다.
- 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여준다.
지네릭스의 장점
- 타입 안정성을 제공한다.
- 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다.
지네릭스 & Exception
- Exception ⇒ Runtime에러, 즉 실행중에 발생하는 에러
- RuntimeException ⇒ 프로그래머실수로 발생하는 에러
- ClssCastException ⇒ 형변환에러
✨ Runtime에러는 실행중에 발생하는 에러로 발생하면 프로그램이 종료가 된다.
실행시에 발생하는것보다 CompileTime에러가 낫다.(why? 우리가 프로그램을 실행하기전에 수정가능하기 때문이다.)
따라서 Runtime에러들을 컴파일에러들로 끌어올수있을까 고민하다가 ClssCastException는 컴파일타임에 타입정보를 줘서 Compile시 알 수 있도록 해온것이 지네릭스이다.
'👩🏻💻 About 프로그래밍 > Java' 카테고리의 다른 글
Java 지네릭스 용어, 타입과 다형성 (0) | 2023.12.07 |
---|---|
Java 타입 변수 (0) | 2023.12.07 |
Java Collections 클래스, 컬렉션 클래스 요약 (0) | 2023.12.07 |
Java HashMap, TreeMap, hashing, HashMap의 주요 메서드 (0) | 2023.12.07 |
Java TreeSet, 이진 탐색 트리(binary seach tree), TreeSet 생성자 · 메서드, 트리 순회(tree traversal) (0) | 2023.12.07 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기