본문 바로가기

Dev.BackEnd/JAVA

[JAVA] 12. Generics (지네릭스)




Chapter 12. Generics

 Java는 안전성을 가장 우선시한다.

그런 점에서 지네릭스는 안전성을 높이기 위한 Java가 제공하는 수단 중 하나가 되겠다.

사전적 정의로는 '포괄적인', '일반적인' 이란 뜻이다.
클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법으로, 매개변수와 비슷하게 작동한다.
매개변수가 어떠한 변수에 들어갈 값과 관련되어있는 것이라면

제네릭은 어떠한 변수의 데이터 타입과 관련되어있는 것이라고 볼 수 있다. 
Generics란,
다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능을 말한다.

문 법
꺽쇠로 시작해서 꺽쇠로 끝나는 문자가 있다.
1
2
3
4
5
class Person <T> {
     public T info;
}
Person<String> p1 = new Person<String>();
Person<StringBuilder> p2 = new Person<StringBuilder>();
cs
T를 인스턴스화 할 때, 꺽쇠 안에 있는 데이터 타입이 적용된다.

제네릭을 이용하여 클래스를 하나 정의를 해주면
클래스에서 정의한 변수에 대해 다양한 데이터 타입으로 인스턴스를 생성할 수 있다.
사용자 정의 데이터 타입인 것이다. 

제네릭이 없는 상황의 코드에서는 코드의 중복이 발생할 수 있는데
이 때 구현이 비슷한 두 클래스를 하나로 합칠 수가 있는 것이다.
변수의 데이터 타입을 지정하는 것은 그 변수에 그 형식의 데이터 타입만 올 것이라는 것을 보장받을 수 있다.
그런데 Object로 처리를 하게 되면 어떠한 데이터도 들어올 수가 있다.
이것을 타입이 안전하지 않다라고 한다.
cf) JavaScript,Ruby on Rails 등에서는 타입 안전성에 대해서 free하다. 이런 언어를 typeless language라고 한다.

제네릭으로는 참조형 데이터 타입만 올 수 있다.
기본 데이터 타입은 올 수 없다.(int, char, double ...)
하지만 Wrapper class를 사용해서 기본 데이터 타입을 사용할 수 있다.
기본 데이터 타입을 마치 객체인것처럼 만들 수 있는 클래스를 제공하는데
그런 클래스들을 Wrapper Class라고 부른다.

제네릭은 생략이 가능하다.
명시적으로 표시를 하지 않아도 데이터 타입을 알 수 있다.

데이터 타입을 확장하고 싶지가 않아서 제네릭을 사용한다.
접근제어자와 반환 타입 사이에 제네릭을 넣어준다.

그리고 제한도 걸어놓을 수 있다.
상위클래스를 만들어준다. or 인터페이스를 만들어준다.
그리고 그 상위의 것에 extends 해준다.(상속과는 다르다.)
just 부모가 누구냐만 밝혀주는 용도로 extends를 사용한다.
(인터페이스의 경우에도 extends를 사용한다. 따로 implements 라는 표현을 사용하지 않는다.)
Tip> super 부모를 제한하는 경우

정 리.
제네릭은 같은 기능을 하는 클래스를 여러개 정의해야 한다는 불편한 점을 해소하면서
이것을 해소하기 위해 Object를 사용하게 되면
자료형에 대한 안전성이 보장되지 않기 때문에 사용하는 것이다.
변수와 비슷한 개념인데 값이 들어가는게 아니라 데이터 타입이 들어가는 것이다.

그렇다면 왜 제네릭을 알아야 하는가?
컬렉션 프레임워크를 이해하기 위해 제네릭에 대한 이해가 필요하다.
Collection Framework에서 제네릭을 사용한다.



포스팅 내용은 생활코딩의 이고잉님의 강의자료를 기준으로 작성하였습니다. 문제가 될 시 삭제하겠습니다.

Chapter 12. The End