1 분 소요



generics(제네릭)

자바에서 generics(제네릭)이란 데이터의 타입을 일반화한다는 것을 의미합니다. <> 꺽세를 활용하여 사용되며, 데이터의 오염을 막아주는 용도입니다.

컬랙션 클래스명<클래스 타입> 인스턴스 = new 컬랙션 생성자명<클래스 타입>{(매개 변수명1~매개변수명N)}

보통 제네릭을 사용할때는 이런형태를 사용합니다.



매개변수 명이란

타입 매개 변수는 클래스에서 제네릭을 정의할 때 사용합니다.

타입 매개 변수를사용해서 제네릭 클래스를 매번 다른 타입으로 여러번 인스턴스화 할 수 있는 것을 말합니다.

E, K, V, N, T, ? 타입 매개변수가 있는데, 저는 ?타입 매개변수에 대해서 설명드리고자 합니다.



? 타입 매개 변수란

범위에 있는 모든 타입으로 대체할 수 있는 타입 매개변수입니다.

  1. 와일드카드

  2. 바인드변수

  3. 플레이스 홀더



설명

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의 데이터가 변형되지 않게 하기 위해서 제네릭을 사용한다 라고 생각하시면 좋을 것 같습니다.

카테고리:

업데이트:

댓글남기기