티스토리 뷰

JVM/JAVA

[Java] Generic 에 대한 이해

글을 쓰는 개발자 2022. 10. 6. 15:51
반응형

Generic은 왜 도입이 되었고 이점은 무엇인가?

Oracle 참고

https://docs.oracle.com/javase/tutorial/java/generics/index.html

Fortunately, some bugs are easier to detect than others. Compile-time bugs, for example, can be detected early on; you can use the compiler's error messages to figure out what the problem is and fix it, right then and there. Runtime bugs, however, can be much more problematic; they don't always surface immediately, and when they do, it may be at a point in the program that is far removed from the actual cause of the problem.

문서에서 말하길 Generic 도입으로 인하여 Compile 시점에서 에러 또는 버그를 찾을 수 있게 되었고, 이로 인해 개발적 생산성이 높아지는 기대를 얻을 수 있었다. 

그리고 가장 좋은 버그는 컴파일 에러라 하지 않았는가!

그렇기에 Generic의 도입은 많은 버그를 잡아주는 포인트였다.

 

이점

  • 컴파일 에러를 발견할 수 있는 이점
  • casting 하지 않아도 된다는 이점

 

Convention

  • E - Element (used extensively by the Java Collections Framework)
  • K - Key
  • N - Number
  • T - Type
  • V - Value
  • S,U,V etc. - 2nd, 3rd, 4th types

 

Type Parameter 와 Type Arguments의 차이

흔히 Type Parameter와 Type Arguments를 혼용하여 쓰인다. 하지만 엄연히 차이점이 존재한다.

Box<T> 에서 T는 Type Parameter 이고 Box<String> 에서 String 은 Type Arguments 이다.

 

 

static, 일반 배열에 사용할 수 없다.

왜 쓸 수 없을까?

쓸 수 없는 이유는 generic은 인스턴스변수로 간주되기 때문에 static 와 같이 인스턴스가 아닌 경우 사용할 수가 없다.

 

배열 또한 사용할 수 없는 것은 new 연산자 때문인데, 컴파일 시점에 generic type을 알아야 하기 때문이다.

 

다만 generic 배열 타입의 참조변수를 선언하는 것은 가능하다. generic 배열을 생성하는 것이 불가능하다는 것을 말하는 것이다.

 

 

? extends T, ? super T

java 코드를 보다 보면 위와 같은 형식을 자주 볼 수 있다. 

extends 와 super 연산자는 우리가 아는 것과 비슷하게 동작을 한다.

 

? extends T

T 와 그 sub class 에 대해서만 접근을 가능하게 하는 역할을 한다.

우선 예를 먼저 보자

 

위의 예시와 같이 <T extends CheckType> 으로 설정하면 CheckType 포함하여 그 하위클래스들만 접근할 수 있게 된다. 그렇기에 Object를 넣었을 때 Compile Error가 나는 것을 알 수 있다.

 

? super T

https://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html

 

우리는 예를 들어 숫자를 더하는 함수를 만드는 데 Integer 뿐만 아니라 Number 까지 허용하는 것을 구현하고 싶을 때 사용할 수 있다.

 

우리가 흔히 볼 수 있는 곳은 sort 이다.

static <T> void sort(List<T> list, Comparator<? super T> c)

Generic Method

메서드의 선언부에 generic type이 선언된 메서드를 generic method라 한다.

 

위와 같은 경우에는 접근제어자가 생략되어 있는데 접근 제어자를 쓰고나서 generic method에서 사용하고자 하는 generic을 선언하면 된다. 여기서 선언된 generic의 경우에는 클래스에서 선언한 generic과 별개로 움직인다는 것만 알면 된다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함