제네릭이란 ?

제네릭(Generic)은 직역하자면 '일반적인'이라는 뜻이다.

'데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법'입니다.

기본적으로 ArrayList, LinkedList 를 생성할 때는 아래와 같이 생성을 합니다.

ArrayList<Integer> Lst = new ArrayList<Integer>();
ArrayList<String> Lst2 = new ArrayList<Integer>();

LinkedList<Double> Lst3 = new LinkedList<Double>():
LinkedList<Character> Lst4 = new LinkedList<Character>();

이렇게 <> 괄호 안에 어떤 타입이 들어갈 지를 지정해줍니다.

제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다. 한마디로 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것이다.

Generic(제네릭)의 장점

  • 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.

  • 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.

  • 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.


제네릭 사용방법 예제

제네릭을 사용하지 않을 경우

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

        public Object getObj(){
        return obj;
        }
    }
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란 String, Integer, Double 등 Object 후손을 모두 받아들일 수 있습니다.

제네릭을 사용하게 되면 어떤 타입을 인스턴스를 만들때 사용할지 지정해줄 수 있습니다.

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

        public E getObj(){
            return obj;
        }
    }

위와 같이 Box 옆에 → Element 가 제네릭을 적용한 예시로 볼 수 있습니다.

Box는 가상의 클래스 E를 사용합니다.

 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);
        }
    }

BoxExam 클래스를 위와 같이 변경할 수 있습니다.

제네릭을 사용한 부분에 참조 타입으로 Object, String, Integer 가 있는 것을 볼 수 있습니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN