반응형

지네릭스(Generics)란?

  • 컴파일시 타입을 체크해 주는 기능(compile-time type check) - JDK1.5
  • 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌

 

지네릭스란, 컴파일시 타입을 체크해 주는 기능이다.
그동안 컴파일시에 타입체크가 가능하긴 했지만, 한계가 있었다. 그 한계를 넘어서게 해주는 것이 지네릭스이다.

코드를 보면,
ArrayList가 있는데, ArrayList는 Object[] 배열을 가지고 있는데, 여기에는 모든 종류의 객체 저장이 가능하다.

그런데 내가 만약, Tv만 저장하고 싶다고 가정해보자.
지네릭스가 있기 전에는, Tv타입이 아니라 다른 타입의 객체를 저장해도 잡아낼 방법이 없었다.

그런데, 지네릭스가 도입되면서 우리가 리스트에 Tv라고 타입을 지정해주고, 객체를 생성하면, tvList에는 Tv만 저장하도록 할 수 가 있다. 그렇게하면, 만약 다른타입의 객체를 저장하면 컴파일러가 체크해서 에러를 알려준다.

지네릭스를 사용하면 객체의 타입 안정성을 높이고, 형변환의 번거로움을 줄여준다.
get()은 Obejct 타입을 반환하기때문에 양쪽타입이 다르므로 형변환을 해야하는데,
지네릭스를 사용하면 형변환을 하지 않아도 된다.

지네릭스의 장점은
1. 타입 안정성을 제공한다.
2. 타입 체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.

 

위 그림은, 예외의 상속계층도인데,
Exception은 Runtime error다. 즉, 실행중에 발생하는 에러다.
RuntimeException은 프로그래머의 실수로 인해 발생하는 예외다.
이 예외들 중에서 ClassCastException은 형변환예외,
NullPointerException은 참조변수 Null예외,
indexOutOfBoundsException은 배열범위 벗어나는 예외인데,
이런것들은 실행시에 발생하는 에러다.

그런데, 이것들을 어떻게하면 컴파일 타임에 체크할 수 있을까?
실행시에 에러가 발생하는 것보다 컴파일 타임에 발생하는게 더 낫다.
왜냐하면, 프로그램을 실행하기 전에 수정할 수 있기 때문이다.

그래서 어떻게 하면 이러한 것들을 컴파일 타임에 체크할 수 있게 할 수 있을까?에 대해 고민해보았더니,
ClassCastException은 컴파일 타임에 타입정보를 제공해서, 컴파일타임에 체크하도록 만들 수 있겠구나!라고 생각한거다.
이것이 바로 "지네릭스"다.

마찬가지로 NullPointerException도
String str = null; 이렇게 초기화 하지 않고,
String str = ""; 이렇게 초기화 한다.  빈문자열로 초기화하는게 더 좋은코드인데,
그 이유는, str.length()를 호출해서 문자열 길이를 얻으면,
null로 초기화 한경우, null에다가 str.length()를 호출하면 NullPointerException이 발생하기 때문이다.
그런데, ""빈문자열 로 초기화 한 경우에는, str.length()를 호출해도, NullPointerException이 발생하지 않는다. 결과 0을 반환한다.

배열인 경우에도 마찬가지이다.
예를 들어 Object[] objArr = null;로 초기화하기보다는,
Object[] objArr = new Object[0]; 이렇게 초기화를 한다. 즉, 길이가 0인 배열로 초기화 한다.
혹은 좀더 간단하게 Object objArr = {}; 이렇게 하기도 한다.
이렇게 하는이유가 실행중에 NullPointerException이 덜 발생하게 하기위해 이렇게 코드를 작성한다.

 

결국, 지네릭스는, RuntimeException 즉, 프로그래머의 실수로 발생되는 예외를 어떻게하면 런타임에서 컴파일타임으로 끌어 올수 있는지를 고민한 것의 결과인 것이다.

반응형

'JAVA' 카테고리의 다른 글

지네릭스 용어, 지네릭 타입과 다형성  (0) 2022.05.04
타입 변수  (0) 2022.05.04
Collections클래스, 컬렉션 클래스 요약  (0) 2022.05.03
HashMap (2)  (0) 2022.05.03
HashMap (1)  (0) 2022.05.02