본문으로 바로가기

Generic

category 공부/Java 2024. 6. 27. 23:17

Box 클래스

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


BoxExam 클래스

public class BoxExam {
    public static void main(String[] args) {
        Box box = new Box();
        box.setObj(new Object());
        Object obj = box.getObj();
        
        box.setObj("hello");
        String str = (String)box.getObj();
        System.out.pritnln(str);
        
        box.setObj(1);
        int value = (int)box.getObj();
        System.out.println(value);
    }
}
  • Box 는 매개변수로 Object를 하나 받아들이고, Object를 반환한다.
  • Object를 받아들일 수 있다는 것은 Object의 후손이라면 무엇이든 받아들일 수 있다는 것이다.

Java5에는 Generic 이라는 문법이 사용됨으로써 인스턴스를 만들 때 사용하는 타입을 지정하는 문법이 추가

 

Generic을 이용하여 Box 클래스 수정

public class Box<E> {
    private E obj;
    public void setObj(E obj) {
        this.obj = obj;
    }
    public E getObj() {
        return obj;
    }
}
  • 클래스 이름 뒤에 <E>가 제네릭을 적용한 것이다. Box는 가상의 클래스 E를 사용한다는 의미.
  • Object를 받아들이고, 리턴하는 부분이 E로 변경. E는 실제로 존재하는 클래스는 아니다.

Generic을 이용하여 수정한 Box를 이용하는 BoxExam 클래스

public class BoxExam {
    public static void main(String[] args) {
        Box<Object> box = new Box<>();
        box.setObj(new Object());
        Object obj = box.getObj();
        
        Box<String> box2 = new Box<>();
        box2.setObj("hello");
        String str = box2.getObj();
        System.out.println(str);
        
        Box<Integer> box3 = new Box<>();
        box3.setObj(1);
        int value = (int)box3.getObj();
        System.out.pritnln(value);
    }
}
  • 참조타입에 <Object> , <String> , <Integer> 가 있는 것을 볼 수 있다.
  • 첫번째는 Object를 사용하는 Box를 인스턴스로 만들겠다는 의미
  • 두번째는 String을 사용하는 Box 인스턴스를 만들겠다는 의미
  • 세번째는 Integer를 사용하는 Box 인스턴스를 만든다는 의미

Generic을 사용함으로써 선언할 때는 가상의 타입으로 선언하고, 사용시에는 구체적인 타입을 설정함으로써 다양한 타입의 클래스를 이용하는 클래스를 만들 수 있습니다. Generic을 사용하는 대표적인 클래스는 컬렉션 프레임워크와 관련된 클래스입니다.

'공부 > Java' 카테고리의 다른 글

컬렉션 프레임워크  (0) 2024.06.27
java.util 패키지  (0) 2024.06.27
Math  (0) 2024.06.25
스트링 클래스의 문제점  (0) 2024.06.25
스트링버퍼  (0) 2024.06.25