Generic 1

황상익·2024년 10월 8일

Inflearn JAVA

목록 보기
47/61

제네릭이 필요한 이유

public class IntegerBox {
    private Integer value;

    public void set(Integer value){
        this.value = value;
    }

    public Integer get(){
        return value;
    }
}
public class StringBox {
    private String value;

    public String get() {
        return value;
    }

    public void set(String value) {
        this.value = value;
    }
}
public class BoxMain1 {
    public static void main(String[] args) {
        IntegerBox integerBox = new IntegerBox();
        integerBox.set(10); //오토 박싱
        Integer integer = integerBox.get();
        System.out.println("integer = " + integer);

        StringBox stringBox = new StringBox();
        stringBox.set("Hello");
        String str = stringBox.get();;
        System.out.println("str = " + str);
    }
}

다형성을 통한 중복 해결 시도

public class ObjectBox {

    private Object value;

    public Object get() {
        return value;
    }

    public void set(Object value) {
        this.value = value;
    }
}

Object는 모든 부모 타입, 부모는 자식을 담을 수 있음

public class BoxMain2 {
    public static void main(String[] args) {
        ObjectBox integerBox = new ObjectBox();
        integerBox.set(10); //오토 박싱
        Integer integer = (Integer) integerBox.get();
        System.out.println("integer = " + integer);

        ObjectBox stringBox = new ObjectBox();
        stringBox.set("Hello");
        String str = (String) stringBox.get();;
        System.out.println("str = " + str);

        // 인수 잘못 전달 시
        integerBox.set("문자 100");
        Integer rst = (Integer) integerBox.get(); //String -> Integer 캐스팅 예외
        System.out.println("rst = " + rst);

        /*
        java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer
        (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')
	    at chap32.ex1.BoxMain2.main(BoxMain2.java:17)
         */
    }
}

몇가지 문제 있음

  • 반환 타입이 맞지 않는 문제
    Integer obj = integerBox.get(); //Object 타입
    Integer = Object 성립하지 않는다. -> downCasting 필요

  • 잘못된 타입 인수 전달문제
    숫자 타입이지만, 문자 타입이 전달됨
    Object를 매개변수로 받기 때문에 어떤 데이터도 입력 받을 수 있다

제네릭 사용

public class GenericBox<T> {

    private T value;

    public void set(T value){
        this.value = value;
    }

    public T get() {
        return value;
    }
}

<>를 사용한 클래스를 제네릭 클래스
제네릭 클래스를 사용할땐 미리 타입을 정하지 않음
<T>와 같이 선언하면, 제네릭 클래스 형성
T = 타입 매개변수

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

        GenericBox<Integer> integerBox = new GenericBox<Integer>(); //생성 시점에 타입이 결정된다.
        integerBox.set(10);
        Integer integer = integerBox.get();
        System.out.println("integer = " + integer);

        GenericBox<String> stringBox = new GenericBox<>();
        stringBox.set("hello");
        String str = stringBox.get();
        System.out.println("str = " + str);

        //모든 타입 적용 가능
        GenericBox<Double> doubleBox = new GenericBox<>();
        doubleBox.set(1.12);
        Double num = doubleBox.get();
        System.out.println("num = " + num);

        GenericBox<Integer> integerBox2 = new GenericBox<>(); //추론

    }
}

T -> Inter로 형성
GenericBox<String>, GenericBox<Integer>를 형성한다고 해서 같은 코드 생성 되는 것 아님. 대신 자바 컴파일러가 우리가 입력한 타입 정보를 기반으로 이런 코드가 있다고 가정하고 컴파일 과정에 ㅏ입 정보 반영

제네릭 용어 관례

제네릭의 핵심은 사용할 타입을 미리 결정하지 않는다는 점
해당 클래스를 실제 사용하는 생성 시점에 내부에서 사용할 타입을 결정하는 것이다.

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글