가자미의 개발이야기
[Java] 제네릭 본문
a. 제네릭
자바의 제네릭은 프로그래머의 실수를 막기 위해 탄생했다.
번거로운 형변환 등 코드 작성할 때 고민해야될 부분을 줄여준다.
-제네릭은 어떤 클래스를 생성할 때 클래스 멤버의 자료형을 상황에 따라 맞추겠다는 의미이다.
-제네릭을 사용할 때 클래스 이름 뒤에 <T>로 표시하면 된다.
이렇게 제너릭화 된 클래스를 인스턴스 선언할 때
Box<Apple> aBox = new Box<Apple>();
이렇게 제너릭에 해당하는 부분을 어떻게 채울지를 선언하면 된다.
여기서 T를 타입 매개변수라고 하고 Apple을 타입 인자라고 한다.
Box<T>는 제네릭 클래스라고 하고, Box는 원시타입이라고 한다.
b. 다중 매개변수 기반 제네릭 클래스
타입 매개변수 이름의 규칙
대문자로 한 문자로 이름을 짓는다.
E Element
K Key
N Number
T Type
V Value
c. 기본 자료형에 대한 제한 & 래퍼클래스
타입인자로 기본 자료형을 쓰면 컴파일 오류가 발생
즉 기본 자료형 대신 래퍼클래스를 타입인자로 활용.
래퍼클래스의 쓸모를 확인할 수 있다.
Box<Apple> aBox = new Box<>();
같은 타입매개변수를 사용하는 경우 두번째 매개변수는 생략가능
d. 매개변수화 타입을 타입인자로 전달
<>기호의 소중함을 느낄 수 있다.
e. 제네릭 클래스의 타입 인자 제한하기
제너릭 타입 매개변수를 선언할 때 extends Number을 통해 타입 인자가 Number를 상속하는 클래스만 올 수 있게 된다.
타입 인자를 제한함으로 써 Number클래스 메소드인 intValue()메소드를 Box클래스에 활용할 수 있게 됐다.
타입 인자를 Number로 제한하지 않았다면 intValue메소드 사용시 컴파일 에러를 일으킨다.
제네릭 클래스의 타입 인자를 인터페이스로 제한할 수 있다.
class Box<T extends Number & Eatable>로 인터페이스와 클래스로 제한 가능
(이때 인터페이스를 implements 하는 것이 아닌 extends 한다는 걸 기억하자!!)
제네릭 클래스에는 static 멤버가 T로 선언할 수 없다.
(static은 T가 결정되지 않은 상황에서도 호출될 수 있기 때문...)
f. 제네릭 메소드
제네릭 메소드는 클래스 전부가 아닌 하나의 메소드에 대해 제네릭으로 정의하는 것
--다만 제네릭 클래스는 인스턴스 생성시 T를 결정했지만, 제네릭 메소드는 메소드 호출 시점에 T를 결정한다.
--제네릭 메소드도 타입 인자를 생략 가능하다. 매개변수를 통해 타입을 파악한다.
g. 제네릭 메소드의 제한된 타입 매개변수 선언
매개변수 제한을 제네릭 타입 선언부에서 제한한다.
제네릭 메소드는 호출 시에 매개변수를 정한다.
이때 대입된 타입을 생략할 수 있다.
//클래스명.메소드();
Box.<Integer>openBox(box);
Box.openBox(box);
h. 제네릭 타입의 형변환
제네릭과 원시 타입간의 형변환 : 가능하나 경고 발생.
대입된 타입이 다른 제네릭과 원시 타입간의 형변환 : 불가능
서로 대입된 타입이 다른 제네릭 간의 형변환 : 불가능
'Java > 자바 기본 문법' 카테고리의 다른 글
[Java] 자바 와일드카드 (0) | 2021.01.22 |
---|---|
[Java] 자바 제네릭의 상속과 타겟타입 (0) | 2021.01.22 |
자바 Arrays 클래스 (0) | 2021.01.20 |
자바 래퍼클래스, Math 클래스, Number 클래스 (0) | 2021.01.20 |
자바 Object 클래스 java.lang.Object (0) | 2021.01.11 |