제너릭은 일반화 라는 의미를 가집니다. 그리고 그 일반화는 자료형에대한 일반화입니다.
만약 Box라는 클래스에 사과와 바나나를 넣어야한다면
1. 사과Box 와 바나나Box 클래스를 따로 작성할수 있습니다.
이렇게되면 코드가 많이 길어질 수 있습니다. 또한 사과Box 나 바나나Box나 제공하는 메소드가 같으므로 많이 겹치게 됩니다.
2. Object형을 인스턴스로 가지는 Box를 생성.
사과와 오렌지뿐아니라 뭐든지 담을 수 있는 박스가 만들어졌습니다.
하지만 이런경우 상자에 사과나 바나나를 꺼낼때 계속해서 형변환을 해주어야합니다.
3.제너릭 사용
제너릭을 사용하면 자료형에 의존적이지 않은 클래스를 정의할 수 있습니다.
이를 제네릭 클래스라고 부릅니다.
class Box<T>{ //타입매개변수 T를 사용하겠습니다 클래스 이름 옆 <T> 사용
private T obj;
public Box(T o) {
obj=o;
}
public void set(T o) {
obj=o;
}
public T get() {
return obj;
}
}
class Apple{
public String toString(){
return "apple~";
}
}
class Banana{
public String STr() {
return "Banana~";
}
}
public class Main {
public static void main(String args[]) {
Box<Apple> aBox=new Box<>(new Apple()); //T를 Apple로 하여 인스턴스를 생성합니다.
//사용한 Apple을 타입인자라고 합니다.
//new Box<Apple>이지만 Apple을 생략해도 됩니다.
Box<Banana>bBox=new Box<>(new Banana());//T를 Banana로하여 인스턴스를 생성합니다.
System.out.println(aBox.get().toString()); //사과를 꺼내는데 형변환이 필요 없습니다.
System.out.println(bBox.get().STr());
}
}
또한 이 제네릭 클래스의 타입 매개변수가 여러개여도 됩니다.
class Box<T,R>{
private T obj;
private R obj2;
public Box(T o,R r) {
obj=o;
obj2=r;
}
public void set(T o,R r) {
obj=o;
obj2=r;
}
}
이번에는 제네릭 클래스가아니라 클래스 내부에서 제너릭을 사용한 메서드인 제너릭 메서드를 보겠습니다.
class Box<T>{ //제너릭 클래스
private T o;
public void set(T o) {
this.o=o;
}
public T get() {
return o;
}
}
class unBoxer{
static public <T> T unbox(Box<T> box) {//클래스메서드이면서 제네릭메서드
//메서드이름은 unbox 이고, 반환형은 T 입니다.
//타입 매개변수로 T를 사용하고, 파라미터로 Box<T>를 사용합니다.
return box.get();
}
}
public class Main {
public static void main(String args[]) {
Box<String> sBox= new Box<>();
sBox.set("hi");
System.out.println(unBoxer.unbox(sBox));//클래스메서드이므로 인스턴스를 생성하지 않고 사용합니다
}
}
'java' 카테고리의 다른 글
toString 오버라이딩에 대해 (0) | 2024.03.15 |
---|---|
Array 사용법 (0) | 2024.03.13 |
Object 클래스 (0) | 2024.03.12 |
interface 정리 (0) | 2024.03.11 |
super ? 상속의 규칙 (0) | 2024.03.08 |