티스토리 뷰

반응형

제네릭스란?

제네릭(generic)의 사전적 의미는 아래와 같다. 3가지 의미 중 '포괄적인', '총칭적인'이라는 뜻에 java제네릭스에 대한 힌트가 있다.


generic

1.일반적인    2.포괄적인    3.총칭적인

Java에서 제네릭스는 다양한 타입의 객체들을 다루는 메서드나 클래스에 컴파일 시의 타입체크를 해주는 기능이다. 정의만 본다면 무슨 말인지 알 수 없다. 아래 예제를 보자.



제네릭스는 언제 사용할까?

제네릭스를 처음 접한다면, 제네릭 클래스의 선언문을 보기보다는, 먼저 제네릭 클래스의 객체를 만들고 사용하는 사용자 입장에서 되어보는게 바람직 할 것 같다. 제네릭스를 빈번하게 쓰는 컬렉션 프레임워크의 ArrayList를 예제로 설명하겠다. 

ArrayList list = new ArrayList();

위와 같이 참조타입이 ArrayList인 list 객체를 만들었다. 이 객체를 만들 당시의 개발자(사용자)는 이 list에 String 타입만 담을 예정이었다.

list.add("홍길동");
list.add(100);

하지만 위와 같이 (실수로) 숫자 100을 담더라도 코드상의 경고가 발생하지 않는다. 담는 과정에서는 문제가 없을 수 있지만 list의 데이터를 이용하는 과정중에 숫자 100이 런타임에러를 발생 시킬 수 있다.


이런 경우에 제네릭스를 이용하여서 list에 담을 '타입 변수'를 지정 할 수있다.

ArrayList<String> list2 = new ArrayList<String>();

참조타입과 생성자 뒤에 꺽쇠 괄호를 사용하고 그 안에 '타입 변수(타입 매개변수)'로 String이라고 명시해주었다. "앞으로 이 ArrayList에는 String 객체만 담겠어!" 라고 명시한 것이다.

 list2.add("홍길동");
 list2.add(100);

이제 list2객체에 String이 아닌 숫자를 담을려고 한다면, 에러를 발생 시킬 것이다.


컴파일 시에 '타입 체크'를 진행하기 때문에, 개발자가 의도한 타입이 들어간 것은 아닌지 사전에 알 수 있다.  제네릭스의 이러한 점이 '타입 안정성'을 제공 한다.


제네릭스는 자바 1.5버젼에서 도입되었다. 그 이전의 선배 개발자들은, Object객체를 받고 그 Object를 원하는 타입으로 형변환 하는 과정을 진행했다. 이러한 과정은 상당히 번거롭고, 반복적이며, 코드의 직접적인 기능에 집중할 수 없게 된다. 그런 시대의 개발자들의 노고를 생각한다면, 제네릭스를 공부하는 건 아무 것도 아닌 일이다.



제네릭 클래스 사용시 주의사항

  • 생성자 뒤에 있는 <타입변수>의 생략은 자바 JDK1.7이상부터 지원한다.
     ArrayList<String> list2 = new ArrayList<>(); //1.7버젼 이상부터 가능



제네릭 클래스와 제네릭 클래스를 선언하는 방법은 다음 포스팅을 참고  ☞ 제네릭스(Generics) - 2. 제네릭 클래스 선언하기

반응형
댓글