[Java] Generics(제네릭)이란?
generics(제네릭)
자바에서 generics(제네릭)이란 데이터의 타입을 일반화한다는 것을 의미합니다.
<> 꺽세를 활용하여 사용되며, 데이터의 오염을 막아주는 용도입니다.
컬랙션 클래스명<클래스 타입> 인스턴스 = new 컬랙션 생성자명<클래스 타입>{(매개 변수명1~매개변수명N)}
보통 제네릭을 사용할때는 이런형태를 사용합니다.
매개변수 명이란
타입 매개 변수는 클래스에서 제네릭을 정의할 때 사용합니다.
타입 매개 변수를사용해서 제네릭 클래스를 매번 다른 타입으로 여러번 인스턴스화 할 수 있는 것을 말합니다.
E, K, V, N, T, ? 타입 매개변수가 있는데, 저는 ?타입 매개변수에 대해서 설명드리고자 합니다.
? 타입 매개 변수란
범위에 있는 모든 타입으로 대체할 수 있는 타입 매개변수입니다.
-
와일드카드
-
바인드변수
-
플레이스 홀더
설명
ArrayList arrayList = new ArrayList();
인스턴스를 생성할 때 이런식으로 사용합니다.
하지만 이런게되면 다른사람이 arrayList에 새로운 값을 추가하게되면 커맨드 클래스에 있는 기본 값에 새로운값으로 인해 오염될수 있습니다. 그것을 막아주기 위해
아래와 같이 선언을 해줍니다.
ArrayList<Integer> arrayList = new ArrayList<Integer>();
이렇게 사용하면 숫자만 arrayList에 사용할 수 있다는 말처럼
ArrayList<MemberCommand> arrayList = new ArrayList<MemberCommand>();
현재ArrayList를 보면 <> 안에 MemberCommand가 있는데 이건 참조타입을 말합니다.
MemberCommand 클래스 타입을 선언해주어서 arrayList가 MemberCommand안에 있는 값만 사용할수 있는 형태로 만들어 준 것이 제네릭입니다.
예제
public class MemberCommand {
private String name;
private int age;
public MemberCommand(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "MemberCommand [name=" + name + ", age=" + age + "]";
}
}
package main.java.test;
import java.util.ArrayList;
public class MemberCall {
public static void main(String[] args) {
MemberCommand memberCommand = new MemberCommand("홍길동" , 33);
// 제네릭은 방어 = 즉 MemberCommand값이 아니면 아무것도 추가 못한다는 의미
ArrayList<MemberCommand> arrayList = new ArrayList<MemberCommand>();
// 주석값이 안나오고 배열이 나옴
// System.out.println(arrayList);
arrayList.add(memberCommand);
// 제네릭을 선언하면 임으로 추가할수가 없어
// arrayList.add("전우치");
// arrayList.add(0.123);
// 여기서는 추가한 형태라서 안되야 하지만 널값은 예외야 그냥 되니까 주의해야함
arrayList.add(null);
// 데이터가 주석으로 잡혀있음
// System.out.println(arrayList);
//그래서 arrayList가 아니라 memberCommand를 출력해야함
System.out.println(memberCommand);
}
}
위의 예제를 보게되면 MemberCommand에는 매개변수로 받은 홍길동, 33 만 저장 됩니다.
임의로 전우치, 0.123을 추가하면 홍길동, 33과 같이 출력이 됩니다.
하지만 실제로 사용할때는
MemberCommand의 내용만 사용하기 위해서
MemberCommand의 데이터가 변형되지 않게 하기 위해서 제네릭을 사용한다 라고 생각하시면 좋을 것 같습니다.
댓글남기기