Generic

김주형·2022년 1월 22일
0

Java

목록 보기
1/8

제대로 이해하지 못 하고 그냥 넘어가던 것이 나중에 문제가 된 적이 있었습니다.
깊은 반성을 하며 기초적인 개념을 직접 코드로 작성해보려는 시간을 가지려 합니다.

먼저 사용자가 호출할 수 있는 상위 클래스의 객체와 getter setter를 생성해보겠습니다.

public class Super { 
    private Object obj;

    public void getObj() {
        return obj;
    }

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

사용자는 상위 클래스의 객체를 호출해서 사용할 수 있습니다.

public class User {
    public static void main(String[] args) {
        Super super = new Super();
        super.setObj(new Object());
        Object obj = super.getObj();

    }
}

하지만 만약 상위 클래스의 객체를 다른 데이터 타입으로 지정하고 싶다면 형변환 작업이 필요합니다.
예를 들어 "hello"라는 문자열과 "1"이라는 값으로 설정해서 조회하고 싶다면, 다음과 같습니다.

	super.setObj("hello");
        String str = (String) super.getObj();
        System.out.println("str = " + str);

        super.setObj(1);
        int value = (int) super.getObj();

원하는 데이터 타입으로 자료형을 변환하여 객체를 호출할 수는 있지만,
매번 단순 반복되는 코드들이 생기게 됩니다.
이것을 개선하기 위해 자바 5부터는 Generic 문법을 지원합니다.

Generic : instance를 생성할 때 사용할 데이터 타입을 지정하는 문법

Generic을 사용하여 기존 코드를 리팩터링 해보겠습니다.

먼저 상위 클래스는 Generic을 통해 가상 클래스 "G"라는 데이터 타입을 사용하도록 합니다.
이것은 물리적으로 존재하는 것이 아닌 가상의 클래스입니다.
기존에 단순 반복 작업들을 개선하기 위해 업데이트 되었습니다.

public class Super<G> { 
    private G obj;

    public G getObj() {
        return obj;
    }

    public void setObj(G obj) {
        this.obj = obj;
    }
}

상위 클래스와 마찬가지로 이제 사용자가 자유롭고 간단하게 객체를 호출 할 수 있도록 개선해보겠습니다.

public class User {
    public static void main(String[] args) {

        Super<Object> superObject = new Super<>();
        superObject.setObj(new Object());
        Object obj = superObject.getObj();

        Super<String> superString = new Super<>();
        superString.setObj("hello !!");
        String str = superString.getObj();

        Super<Integer> superInteger = new Super<>();
        superInteger.setObj(220122);
        Integer integer = superInteger.getObj();

        System.out.println("Obj = " + obj);
        System.out.println("String = " + str);
        System.out.println("Integer = " + integer);

    }
}
출력 결과

Obj = java.lang.Object@6cd8737
String = hello !!
Integer = 220122

우리는 Generic을 사용함으로써 선언할때는 가상의 타입으로 선언하고, 사용시에는 구체적인 타입을 설정함으로써 다양한 타입의 클래스를 이용하는 클래스를 만들 수 있습니다는 것을 알 수 있습니다.

profile
도광양회

0개의 댓글