본문 바로가기
Computer Science/JAVA

[JAVA] 제너릭이란?

by 그적 2020. 11. 3.

"인터페이스의 한계"

 인터페이스를 통해 공통 기능을 가지는 클래스를 구별하지 않고 사용할 수 있다. 또한 슈퍼 클래스의 역할을 하고, 가상 함수 동적 바인딩을 통해 다형성을 가진다. 하지만 만약 구체 클래스를 통해 각 클래스를 구별해야 할 경우엔 어떻게 해야 할까? 다운 캐스팅을 통해 구체 클래스를 구별해야한다.

 

다운 캐스팅의 문제점

1) 컴파일러가 다운 캐스팅의 오류를 발견하지 못한다.
2) 실행 시 타입이 맞지 않으면 TypeCastException 오류를 발생시킨다. 
3) 실행 시 타입을 검사하는 instanceof 메서드는 매우 비싼 연산이다.
4) 잦은 다운 캐스팅 자체가 가독성이 저하된다.

 

위와 같은 다운 캐스팅의 문제점을 가지기 때문에 우리는 "제너릭"이 필요한 것이다.

 

제너릭이란?

: 클래스에서 다룰 객체를 미리 명시해줌으로써 형 변환을 하지 않고 사용하는 것이다.

우리가 흔히 사용하는 ArrayList는 입력할 때는 마음대로 입력할 수 있지만, Object를 꺼낼 땐 어떤 타입인지 알아야 한다. 이 때문에 잘못된 타입으로 Object를 꺼내게 된다면 예외 오류가 발생하는 것이다. 하지만 제너릭 ArrayList를 사용하면 컴파일러 될 때 자동으로 특정한 타입을 사용한다는 것을 < ? > 를 통해 선언해주었기 때문에, 동일한 타입을 가지는 객체들만 ArrayList에 추가될 수 있도록 한다.

 

ArrayList<String> strList = new ArrayList<String>();
strList.add("generic");				// 타입 검사
String str = strList.get(0);		// 컴파일러가 자동으로 다운캐스팅

- 동일한 타입의 객체만 리스트에 추가된다.

- 항상 동일 타입의 객체임을 보장하기 때문에 다운 캐스팅이 불필요하다.

- 객체를 꺼낼 때는 동일합 타입으로 자동 캐스팅해준다. 

 

 

'Computer Science > JAVA' 카테고리의 다른 글

[JAVA] 기본 클래스, Object  (0) 2020.11.20
[JAVA] 컬렉션이란?  (0) 2020.11.03
[JAVA] 추상화란?  (0) 2020.10.23
[JAVA] 인터페이스란? (+서점 구현하기)  (0) 2020.10.06
[JAVA] 상속이란? (+ 서점 구현하기)  (0) 2020.10.06

댓글