[Java] generic

Hyo Kyun Lee·2022년 2월 2일
0

Java

목록 보기
32/66

1. generic

선언할 때는 가상의 type, 활용할 때 구체화

클래스를 generic, 일반화한다는 의미이다.
object type을 인자로 받고 이를 return하는 특정 클래스 및 메소드의 type을 임의의 클래스로 바꾸고, 이후 활용할 때마다 직접 해당 type을 지정해주는 것을 통해 형변환의 번거로움을 줄일 수 있는 키워드이다.

2. Object 형태의 인자 및 return type이 있는 클래스가 있을때 기존 활용방법

아래와 같이 하나의 클래스가 있고, 이 클래스 및 메소드는 Object type을 인자로 받고 return한다고 가정해보자.

public class Box{
	private Object obj; //obj type의 obj field 생성
    
    public void setObj(Object obj){
    	this.obj = obj; //this.obj는 field의 obj, obj는 전달받은 인자
    }
    
    public Object getObj(){
		return obj;
    }
}

이 클래스와 메소드를 활용하는 main 클래스에서는 각각 형변환을 일일이 다 해주어야 한다.

public class BoxTest{
	public void main(String[] args){
    	Box box = new Box();
        
        box.setObj(new Object);
        Object obj = box.getObj();
        
        box.setObj("Hello");
        String str = (String) box.getObj();
    	
        box.setObj(3);
        int value = (int) box.getObj();
    }
}

3. Generic을 이용한 활용

위 형변환을 generic을 활용한다면 일일이 형변환을 하지 않고도, 임의의 클래스를 기반으로하여 type 지정을 할 수 있게 된다.

꺾쇠 <>를 활용하면 generic을 사용할 수 있는데, generic을 활용할 메소드가 존재하는 클래스 부터 generic 인자를 정의해준다.
※ Object type 지정을 해주는 부분에 <E> 사용.

public class Box<E>{
	private E obj;
    
	public void setObj(E obj){
    	this.obj = obj;
    }
    
    public E getObj(){
    	return obj;
    }
}

형변환없이 클래스 및 메소드를 사용할 수 있게 된다.
메소드를 활용하는 시점부터, 먼저 해당 클래스 객체를 generic을 통해 선언해주고 이후 메소드 사용 시 형변환 없이 사용한다.

public class BoxTest{
	public void main(String[] args){
    	Box<Object> box = new Box<>;
        box.setObj(new Object);
        Object obj = box.getObj();
        
        Box<String> box = new Box<>;
        box.setObj("Hello");
        String str = box.getObj();
        
        Box<int> box = new Box<>;
        box.setObj(3);
        int value = box.getObj();
    }
}

위와 같이 최초 객체를 선언할 떄부터 return type에 대해 지정해주기 때문에, 형변환을 하지 않아도 객체를 받아올 수 있게 된다.

0개의 댓글