1. 제네릭이란 무엇이고, 왜 사용하는 걸까??


- 컬렉션, 람다식, 스트림 등 등 잘못된 타입이 들어오는 것을 방지

- API 도큐먼트에 자주 보인다.

- *실행 시 타입 에러가 나는 것보다 컴파일 시에 미리 타입을 강하게 체크해서 에러를 사전에 방지

- 컬렉션에서 elements를 가져올 때 항상 타입 변환을 해야하는데, 제네릭으로 타입을 한정 짓게 되면 타입 변환을 할 필요가 없이 고정적이기 때문에 프로그램의 성능이 향상된다.



2. Object로 쓰면 되지 않나요?

Object를 쓰게 되면 위에서 언급했던 것과 같이 타입을 반환을 할 때 Object로 반환하기 때문에 이에 다시 타입을 강제 변환시켜야 한다. 때문에 타입 변환이 빈번해지면 전체 프로그램 성능에 좋지 못한 결과를 가져올 수 있다. 특히 자주 쓰이는 것이라면..



3. 제네릭 메소드

제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드입니다. 리턴 타입과 매개 타입으로 타입 파라미터를 사용하면 됩니다.


public <타입 파라미터> [리턴 타입] [메소드명(매개 변수...)] {

...

}


기존 메소드에서 타입 파라미터가 추가되었습니다.


4. 제한된 타입 파라미터

제네릭을 사용하되 그 타입 파라미터에 지정되는 구체적인 타입을 제한할 수 있습니다.

< T extends 최상위타입> 이런식으로 선언하여 상위 타입 혹은 하위, 또는 구현 클래스만 지정할 수 있게 할 수 있습니다.

단, 이렇게 제한을 하고 난 후 {} 중괄호 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 필드, 메소드로 제한됩니다.



5. 와일드카드 타입<?>

<?> : 제한 없음.

<? extends 상위타입> : 상위 클래스 제한

<? super 하위 타입> : 하위 클래스 제한



추가.


제네릭은 전체적으로 타입 변환을 사라지게 하고, 오류를 줄임으로 프로그램의 성능을 향상시킨다. 하지만 제네릭을 사용할 때 인지하고 있어야 하는 점이 있다.


"자바의 제네릭 자료형은 객체를 생성할 수 없다"


이는 제네릭스의 "자료형 지우기"라는 특성에서 발생한다. 자료형 지우기란 컴파일러가 컴파일시 자료형에 대한 정보를 모두 검사하여 이에 문제가 없을시 제네릭에 관한 정보가 전혀 없는 바이트코드를 생성한다.

(* 제네릭을 사용하기 전의 코드와 호환성을 유지하기 위해 제네릭에 대한 정보를 삭제한다)


때문에 컴파일된 바이트코드에는 존재하지 않는 제네릭 자료형의 객체는 생성을 할 수 없게 된다.

  1. 2018.09.04 15:09

    비밀댓글입니다

    • 2018.10.19 16:23

      비밀댓글입니다

+ Recent posts