[자바] 지네릭 제네릭 generic

Kyu·2021년 2월 3일
0

Java 공부기록

목록 보기
28/40

정의

클래스 내부에서 사용할 데이터 타입을 외부에서 지정해주는 기법을 의미한다.

사용법

// 코드 1

class Person <T> {
	public T info;
}

메인 클래스 {
	Person<String> p1 = new Person<String>();
	Person<StringBuilder> p2 = new Person<StringBuilder>();
}

코드1

여기서 꺽새 <> 안에 있는 타입이 person 클래스의 <T> 에 있는 T로 들어가서 필드에있는 public T info 에서 T의 데이터타입이 설정해준 데이터타입으로 바뀐다.

데이터타입에는 기본데이터타입형을 넣을 수 없다. 기본데이터타입형을 쓰고 싶으면 Wrapper 클래스를 이용하면 된다.

// 코드 2

class Person<T> {
	public <U> void printInfo(U info) {
    	System.out.println(info);
}

코드2

메소드에 매개변수 타입을 지정하고 싶지 않을때도 저렇게 사용이 가능하다.
<지정하고 싶은 타입>printInfo(매개변수); 하지만 여기서 타입은 생략 가능하다.

사용이유

타입이 안전하지 않다. 그러니까 원하는 결과가 아니라 컴파일 에러없이 다른 결과가 출력될 수 있다. 자바는 접근제어자라던가 getter, setter 라던가 데이터에 대한 접근이 엄격하다. 그런 자바의 철학에서 뭔가 타입이 애매하게 설정되어 있는 것은 맞지 않을 것이다. 그 과정에서 generic이 나왔다.

더 자세한 설명은 여기

복수의 제네릭

다음과 같이 복수의 제네릭도 사용이 가능하다

class EmployeeInfo {
	public int rank;
	EmployeeInfo (int rank) {
		this.rank = rank;
	}
}

class Person<T, S> {
	public T info;
	public S id;

	person(T info) {
		this.info = info;
	}
}

메인 클래스 {
	Person<EmploeeeInfo, Integer> p1 = new Person<EmployeeInfo, Integer>(new EmployeeInfo(1), 1);
}

제네릭 생략

  1. 생성자에 값을 넣어 주는 형태면 제네릭을 생략해도 된다.
  2. ArrayList<Integer> num2 = new ArrayList<>(); new에서 타입 파라미터 생략가능하다.

그 외

제네릭 제한 <T extends Objet> ?

참고

profile
TIL 남기는 공간입니다

0개의 댓글