java

제너릭 Generic

윤만석 2024. 3. 15. 00:05

제너릭은 일반화 라는 의미를 가집니다. 그리고 그 일반화는 자료형에대한 일반화입니다.

만약 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