제너릭이란?
제너릭은 메서드나 컬랙션 클래스에 컴파일 시 타입체크를 해주는 기능입니다. 객체의 타입을 컴파일 시에
체크하기 때문에 객체의 타입 안정성을 높이고 형변환은 번거로움을 줄여주는 기능을 합니다.
제너릭의 장점
1. 타입 안정성 제공
2. 타입 체크와 형변환을 생략가능 함으로 코드가 간결해진다.
제너릭 타입은 클래스와 메서드에 선언될 수 있는데, 오늘은 클래스에 선언된 제너릭 타입에 대해 살펴보도록 하겠습니다.
위의 예시에서 클래스 오른쪽에 <T> 라고 붙은것을 확인 할 수 있습니다.
또한 인스턴스 변수의 앞에도 T가 붙어 있는 것을 볼 수 있습니다.
위와 같이 GenericExample을 생성할때 <> 안에 원하는 타입을 넣으면 GenericExample 클래스의 T부분이 모두
해당 타입으로 바뀌게 됩니다.
genericExample1의 경우 item이라는 필드 변수의 타입이 Sring으로 선언되는 거죠.
밑에 있는 genericExample2 객체의 경우는 제너릭을 사용하지 않았습니다. 제너릭 클래스인데도 예전의 방식으로
객체를 생성하는 것이 허용됩니다. 물론 타입을 지정하지 않아서 안전하지 않다는 메세지가 노란색 밑줄로 표시됩니다.
위와 같은 경우 T안에 Object가 들어간 것으로 간주됩니다.
제너릭 사용이 제한되는 경우
제너릭의 사용은 또한 static 변수, 즉 클래스 변수에는 제한됩니다. 그 이유는 타입 변수에 지정된 타입의 종류와 관계 없이 해당 클래스에서 생성된 객체들이 서로 동일한 값을 공유해야 되기 때문입니다. 만약 static 변수에 제너릭을 허용하게 된다면, String으로 선언된 객체의 클래스 변수와 Integer로 선언된 객체의 클래스 변수의 타입이 서로 달라지기 떄문에
이를 허용하지 않습니다.
배열 또한 제너릭의 사용이 제한됩니다. 물론 배열을 참조하는 것은 허용합니다. new 연산자를 사용하여
배열을 생성하는 것이 제한됩니다. 예시를 들어보자면,
다음과 같이 T[] 타입으로 된 arrayA를 참조변수로 선언하는 것은 가능하지만, new연산을 통해 배열의 생성은 제한됩니다.
제너릭 배열을 생성할 수 없는 이유는 배열은 공변의 특성을 지니기 때문입니다.
해당 예시에서 String배열로 생성된 array배열에 int 값인 1을 넣어도 컴파일 시점에는 예외를 발생시키지 않습니다.
다시 말하자면, 배열은 런타임에 실체화가 됩니다. 하지만 제너릭같은 경우는 컴파일 시점에 형식이 결정됩니다.
둘의 개념이 상충되기 때문에 배열을 제너릭을 통하여 생성하지 못하는 것입니다.
제너릭은 상속 개념과 관련이 있을까?
일반적으로 자바에서는 다향성을 지원하기 위하여 부모 클래스가 자식 클래스의 객체를 참조할 수 있게 되어있습니다.
위는 그 예시 코드입니다. 부모 클래스인 Parent의 참조 변수로 child 클래스의 객체를 받을 수 있습니다.
그렇다면 제너릭도 부모 타입으로 자식 타입을 받을 수 있을까요?
보시는 바와 같이 제너릭은 상속과 상관없이 참조의 타입과 객체의 타입이 일치하여야 합니다.
또한 JDK 1.7부터 참조변수의 타입으로 객체의 타입이 추론이 가능하면 객체 타입에 제너릭을 명시하지 않아도 가능하도록 바뀌었습니다.
그래서 위와 같은 형태의 코드 작성이 가능해진 것입니다. 원래 대로라면 new ArrayList<Integer>(); 을 명시해줘야
됬겠죠?
제너릭 타입의 제한
제너릭은 <T> 와 같은 기호를 활용하여 타입을 구체화 해줍니다. 여기에는 조건이 없습니다. 어떠한 타입도 들어갈 수 가 있는것이죠. 만약 타입을 제한하고 싶을 경우는 어떻게 해야할까요?
이를테면 과일에 해당하는 타입만 받고 싶다면 다음과 같은 제너릭 클래스를 생성하면 됩니다.
총 5개의 클래스가 선언되어 있습니다. Box클래스는 제너릭 클래스에 해당합니다. 하지만 T타입으로
Fruit을 상속하고 있는것을 볼 수 있습니다. 이 말은 T타입으로 Fruit과 Fruit 자손클래스만 타입으로 받을 수 있다고
명시한 것과 같습니다.
따라서 Fruit의 타입이 아닌 Human은 box 객체의 타입으로 생성할 수 가 없는것입니다.
오늘은 제너릭의 전반적인 내용에 대해 살펴보았습니다.
다음 글에서는 제너릭의 와일드카드 개념과 제너릭 메서드에 대해 살펴보도록 하겠습니다.
글 읽어주셔서 감사합니다!
참고 도서
https://product.kyobobook.co.kr/detail/S000001550352
Java의 정석 | 남궁성 - 교보문고
Java의 정석 | 자바의 기초부터 실전활용까지 모두 담다!자바의 기초부터 객제지향개념을 넘어 실전활용까지 수록한『Java의 정석』. 저자의 오랜 실무경험과 강의한 내용으로 구성되어 자바를
product.kyobobook.co.kr
'Java' 카테고리의 다른 글
자바 예외 관련 개념 정리 (0) | 2023.05.07 |
---|---|
Inner class에 Static을 붙이는 이유 (0) | 2023.04.24 |
추상클래스와 인터페이스 (2) | 2023.04.09 |
자바 변수를 메모리 관점에서 뜯어보기 (0) | 2023.04.01 |
가비지 컬렉션에 대해 (0) | 2023.03.21 |