제네릭
클래스를 이용해서 객체를 찍어 낼 때, 내부에 선언된 맴버에 따라 반환타입이 결정된다.
그렇기 때문에, 다른 타입의 반환을 가지고 싶으면 다른 타입으로 다시 클래스를 만들어 주어야 한다.
일반적인 클래스 예시
class Basket {
private String item;
Basket(String item) {
this.item = item;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
}
이 클래스를 String 말고 int로 반환하고 싶으면 또 바꿔서 만들고, double로 만들고싶으면 또또 새로 만들어야 한다는 것이다.
하지만, 제네릭을 이용하면 하나의 클래스 만드로 모든 타입의 데이터를 저장 할 수 있는 인스턴스를 만들 수 있다!
제네릭 이용 예시
class Basket<T> {
private T item;
public Basket(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
위의 클래스 코드와 비교하면
- 클래스 이름 옆에 <T> 가 추가됨
- 변수타입(String) 대신에 T 를 넣음
을 볼 수 있다.
위의 제네릭을 이용한 클래스를 인스턴스화 할때는
Basket<String> basket1 = new Basket<String>("기타줄");
이와 같이 사용 가능하다.
위의 예시에서 클래스가 인스턴스화 될 때 클래스 이름 뒤에 <String>이 붙고 있는데, 이는 제네릭의 문법이다.
의미는 “Basket 클래스 내의 T를 String으로 바꿔라” 이다.
위의 코드에서 <String>으로 지정하였으니, 윗부분 "일반적인 클래스 예시" 처럼 T 가 모두 String으로 치환되어 동작한다.
만약 int형 자료로 사용하고 싶으면
Basket<Integer> basket1 = new Basket<Integer>(3);
String을 Integer 로 바꾸어서 인스턴스화 하면 된다.
" int로 안하고 Integer로 하는거는 뭔 차이냐?"
int는 기본 타입인데, Integer는 래퍼 클래스라고 한다.
래퍼 클래스를 쓰는 이유는 특정 이유로 단순 기본 타입이 아닌 객체 타입이 필요 할 때, 해당 데이터를 객체로 변환 해 주어야 정상작동 하기 때문이다.
고로 int 타입의 데이터 라기보다는 int타입의 객체 를 전달한거라고 생각하면 된다.
부가적으로, 기본 타입의 변수를 래퍼 클래스로 인스턴스화 하는것을 박싱(Boxing),
래퍼 클래스의 인스턴스 값을 다시 기본 타입으로 꺼내는 것을 언박싱 (UnBoxing) 이라고 한다.
"String 은 그냥 쓰고 왜 int만 바꾸냐?"
int 하고 char, boolean 타입이 래퍼클래스와 이름이 다르기 때문이다.

String은 기본형이 아니고, 사실 String 클래스의 객체를 만드는 방식으로 구현된다고 한다. (그래서 다른 데이터 타입과 다르게 참조형 데이터 타입을 가진다.)
그러니까, 사실 그동안 String타입의 기본 데이터를 넣어서 줫던게 아니고, 객체로 만들어서 줫던건데, 그냥 우리가 (혹은 나만 ㅎ) 몰랏던 것이다.
'백엔드 > JAVA_이론공부' 카테고리의 다른 글
JAVA_람다(람다식) (0) | 2022.09.28 |
---|---|
JAVA_애너테이션 (0) | 2022.09.28 |
JAVA_열거형 (0) | 2022.09.28 |
JAVA_인터페이스 (0) | 2022.09.22 |
JAVA_ final 키워드 (0) | 2022.09.22 |