제네릭스(generics)는 데이터의 형식의 안전성을 보장하는 데 사용한다.
ArrayList strList = new ArrayList();
strList.add("첫 번째");
strList.add("두 번째");
strList.add(3);
다음 코드는 배열 리스트(ArrayList) strList에 문자, 숫자 등 무엇이든 넣을 수 있다.
👉 컴파일 오류가 발생하지 않는다.
ArrayList<String> strList = new ArrayList<String>();
strList.add("첫 번째");
strList.add("두 번째");
strList.add(3);
다음 코드는 제네릭스를 사용하여 strList 배열 리스트에 문자열만 들어가도록 설정하였다.
👉 컴파일 오류가 발생한다.
<string>이외에도 <Integer>, <Double>등을 사용할 수 있고 사용자가 정의한 클래스형에도 사용할 수 있다.
import java.util.Arrays;
import java.util.List;
public class generic {
public static void main(String[] args) {
// TODO Auto-generated method stub
List numbers = Arrays.asList(1,2,3,4,5,6);
int sum=0;
for(Object number:numbers) {
//직접 형변환이 필요하다.
sum+=(int)number;
}
System.out.println(sum);
}
제네릭스 사용하지 않은 경우
List numbers의 타입을 지정하지 않았기 때문에
Object로 타입이 지정되고
더하는 부분에서 형변환이 필요하다.
import java.util.Arrays;
import java.util.List;
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer>numbers = Arrays.asList(1,2,3,4,5,6);
int sum=0;
for(Integer number:numbers){
sum+=number;
}
System.out.println(sum);
}
}
제네릭스 사용하는 경우
불필요한 형 변환을 하지 않아도 된다.
ArrayList<String> arrList = new ArrayList<String>();
List<Integer> list = new ArrayList<Integer>();
import java.util.ArrayList;
public class generic_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList numList = new ArrayList();
numList.add(1);
numList.add(2);
numList.add("3"); //integer값이 아니기 때문에 오류발생
int hap=0;
for(int i=0; i<numList.size(); i++) {
hap += (int)numList.get(i);
}
System.out.print(hap);
}
}
제네릭스를 사용하지 않음/ 실행 오류 발생
타입 미설정 Object로 선언된다.
ArrayList선언시 ArrayList list = new ArrayList()로 선언 후 내부에 임의의 값을 넣고 사용할수도 있지만 이렇게 사용할경우 값을 뽑아내기 위해서는 캐스팅(Casting) 연산이 필요하고 잘못된 타입으로 캐스팅을 한 경우에는 에러가 발생한다.
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> numList = new ArrayList<Integer>();
numList.add(1);
numList.add(2);
numList.add("3");
int hap=0;
for(int i=0; i<numList.size(); i++) {
hap+=numList.get(i);
}
System.out.println(hap);
}
제네릭스르 사용하여 <Integer>으로 타입 지정/ 컴파일 오류 발생
Integer형이 아닌 다른 값인 3을 문자형으로 받았기 때문에 컴파일 오류가 발생한다.
import java.util.ArrayList;
public class HW2_20211319 {
public static void main(String[] args) {
// TODO Auto-generated method stub
myClass c1 = new myClass(10);
myClass c2 = new myClass(20);
myClass c3 = new myClass(30);
ArrayList<myClass> myList = new ArrayList<myClass>();
myList.add(c1);
myList.add(c2);
myList.add(c3);
int hap=0;
for(int i=0; i<myList.size(); i++) {
hap += myList.get(i).value;
}
System.out.print(hap);
}
static class myClass{
int value;
myClass (int value){
this.value = value;
}
}
}