제네랄!!!
장군이라는 의미를 담고있지만 "일반적인"이라는 의미를 담고 있는 언어다.
반면, 제네릭은 "데이터 타입을 일반화 한다"는 의미를 가지고 있다.
따라서, 제네릭은 단 하나의 클래스만으로 모든 타입의 데이터를 저장 할 수 있는 인스턴스를 만들 수 있다.
제네릭의 예시
다음과 같이 제네릭을 코딩할 수 있다.
class ImGeneric<G> {
private G people;
public ImGeneric(G people){
this.people = people;
}
public G getPeople(){
return people;
}
public void setPeople(G people){
this.people = people;
}
}
이 상태에서 Integer 타입을 리턴하고 싶다면 다음과 같이 인스턴스화를 한다.
ImGeneric<Integer> imGeneric = new ImGeneric<Integer>(1);
이것을 클래스 내에 작성해보자
class ImGeneric<G> {
private G people;
public ImGeneric(G people) {
this.people = people;
}
public G getPeople() {
return people;
}
public void setPeople(G people) {
this.people = people;
}
}
public static void main(String[] args) {
ImGeneric<Integer> imGeneric = new ImGeneric<Integer>();
}
보이는 것처럼 제네릭은 타입을 구체적으로 지정하는 것이 아닌
추후에 지정할 수 있도록 일반화 하는 것을 말한다.
따라서 제네릭에서 작성한 클래스와 메서드가 특정 데이터 타입에 고정되지 않도록 한다.
제네릭의 활용
제네릭을 활용하면 다양한 타입으로 출력 할 수 있다.
class ImGeneric<G> {
private G people;
public ImGeneric(G people) {
this.people = people;
}
public G getPeople() {
return people;
}
public void setPeople(G people) {
this.people = people;
}
}
class Main{
public static void main(String[] args) {
ImGeneric<String> imGeneric1 = new ImGeneric<String>("");
ImGeneric<Integer> imGeneric2 = new ImGeneric<Integer>(1);
ImGeneric<Double> imGeneric3 = new ImGeneric<Double>(3.14);
imGeneric1.setPeople("나는 제네릭이다");
imGeneric2.setPeople(10);
imGeneric3.setPeople(4.595);
System.out.println(imGeneric1.getPeople());
System.out.println(imGeneric2.getPeople());
System.out.println(imGeneric3.getPeople());
}
}
제네릭 메서드
제네릭 메서드는 클래스 내부의 특정 메서드에서만 제네릭으로 선언하는 것을 뜻한다.
우리는 class ImGeneric<G>{}를 통해 제네릭 클래스에 대해서 배웠다.
제네릭 메서든 public <G> void setPeople(G People)와 같은 형태이다.
즉,
class ImGeneric<G> {
public void setPeople(G People){}
}
와
class ImGeneric<G> { //제네릭 클래스
public <G> void setPeople(G People){} //제네릭 메서드
}
는 다르며
제네릭 클래스의 <G>와 제네릭 메서드의 <G>는 다른 타입 매개변수다.
그 이유는 타입이 지정되는 시점이 다르기 때문이다.
제네릭 클래스의 매개변수는 클래스를 인스턴스화 할 때 타입이 지정된다.
하지만,
제네릭 메서드는 메서드를 호출할때 타입이 지정된다.
와일드 카드
와일드 카드는 어떠한 용도로든 사용할 수 있는 카드를 뜻한다.
즉, 제네릭의 와일드 카드는 어떠한 타입으로든 대체될 수 있는 타입 파라미터를 뜻하며 물음표(?)로 와일드 카드를 사용할 수 있다.
- <? extends G> 와일드 카드에 상한 제한을 두는 것으로 G와 G를 상속 받는 하위 클래스 타입만 타입 파라미터로 받을 수 있도록 지정한다.
- <? super G> 와일드 카드에 하한 제한을 두는 것으로 G와 G의 상위 클래스만 타입 파라미터로 받도록 한다.
- <?> = <? extends Object> Object 클래스를 상속받는 것으로 모든 클래스 타입을 타입 파라미터로 받을 수 있다.
'Back-End > Java' 카테고리의 다른 글
[Java/자바] e.printStackTrace를 사용하지 말아야 하는 이유 (0) | 2022.09.13 |
---|---|
[Java /자바] 예외 처리(Exception Handling) (2) | 2022.09.13 |
[Java /자바] 열거형(Enum) (2) | 2022.09.13 |
[Java /자바] 인터페이스(Interface) (0) | 2022.09.13 |
[Java /자바] 추상화와 추상 클래스 (0) | 2022.09.13 |