[Java] Generic

재영양·2022년 11월 2일
0

Study

목록 보기
9/14

제네릭(Generic)


  • 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것

- 제네릭의 선언 및 생성

ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<String> list2 = new ArrayList<Integer>();
 
LinkedList<Double> list3 = new LinkedList<Double>():
LinkedList<Character> list4 = new LinkedList<Character>();

위 코드에서처럼 <> 안에 데이터타입을 지정해준다.
그리고 위와 같이 선언된 제네릭 클래스(generic class)를 생성할 때에는 타입 변수 자리에 사용할 실제 타입을 명시한다.

generic을 사용하는 이유

  • 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
  • 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.
  • 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.


> 사용 예시

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.println(str);

            box.setObj(1);
            int value = (int)box.getObj();
            System.out.println(value);
        }
    }
  • Box는 매개변수로 Object를 하나 받아들이고, Object를 반환한다.
    • Object를 받아들일 수 있다는 것은 Object의 후손이라면 무엇이든 받아들일 수 있다는 것

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

public class Box<E> {    // <E>가 제네릭 적용한 것 
        private E obj;
        public void setObj(E obj){
            this.obj = obj;
        }

        public E getObj(){
            return obj;
        }
    }
  • 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.println(value);
        }
    }
  • Generic을 사용함으로써 선언할때는 가상의 타입으로 선언하고, 사용시에는 구체적인 타입을 설정함으로써 다양한 타입의 클래스를 이용하는 클래스를 만들 수 있다.
  • Generic을 사용하는 대표적인 클래스는 컬렉션 프레임워크와 관련된 클래스이다.

0개의 댓글