gt1 = new GenericTest<>(); // 필기. 생성자 쪽은 다이아몬드 연산자만 주로 작성 GenericTest gt2 = new GenericTest(); // int test = gt1.value(); // 필기. 이제 타입을 더블형으로 명시했기 때문에 int불가능 오브젝트가 아니기 때문 // 필기. 타입이 명시적으로 되었기 때문에 타입안정성이 좋아짐 /* 설명. * 1. 제네릭 클래스는 다양한 자료형으로 변할 수 있어 클래스 하나만으로 활용가치가 높아진다.(구현의 편의성) *"> gt1 = new GenericTest<>(); // 필기. 생성자 쪽은 다이아몬드 연산자만 주로 작성 GenericTest gt2 = new GenericTest(); // int test = gt1.value(); // 필기. 이제 타입을 더블형으로 명시했기 때문에 int불가능 오브젝트가 아니기 때문 // 필기. 타입이 명시적으로 되었기 때문에 타입안정성이 좋아짐 /* 설명. * 1. 제네릭 클래스는 다양한 자료형으로 변할 수 있어 클래스 하나만으로 활용가치가 높아진다.(구현의 편의성) *"> gt1 = new GenericTest<>(); // 필기. 생성자 쪽은 다이아몬드 연산자만 주로 작성 GenericTest gt2 = new GenericTest(); // int test = gt1.value(); // 필기. 이제 타입을 더블형으로 명시했기 때문에 int불가능 오브젝트가 아니기 때문 // 필기. 타입이 명시적으로 되었기 때문에 타입안정성이 좋아짐 /* 설명. * 1. 제네릭 클래스는 다양한 자료형으로 변할 수 있어 클래스 하나만으로 활용가치가 높아진다.(구현의 편의성) *">

스크린샷 2025-08-18 오전 9.56.07.png

package com.haenin.section01.generic;

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

        /* 목표, 제네릭(generic)에 대해 이해할 수 있다. */
        MyGenericTest mgt = new MyGenericTest(); // 필기. 구현의 편의성은 좋지만
        mgt.setValue("Hello World!");
        mgt.setValue(1);
        mgt.setValue(3.14);
        mgt.setValue(new java.util.Date());

        // 필기. 타입 안정성이 좋지 않음
        // 필기. 다운캐스팅 하면 다들어가서
        // 필기. 런타임 exception이 일어날 수 있음
//        String test =(String)mgt.getValue();
        boolean idTrue = (boolean)mgt.getValue();

        // 필기. 제네릭에서는 래퍼클래스를 넣어야함
        // 필기. MemberDTO 같은 클래스도 가능
        GenericTest<Double> gt1 = new GenericTest<>(); // 필기. 생성자 쪽은 다이아몬드 연산자만 주로 작성
        GenericTest<String> gt2 = new GenericTest<String>();
//        int test = gt1.value(); // 필기. 이제 타입을 더블형으로 명시했기 때문에 int불가능 오브젝트가 아니기 때문
        // 필기. 타입이 명시적으로 되었기 때문에 타입안정성이 좋아짐

        /* 설명.
        *   1. 제네릭 클래스는 다양한 자료형으로 변할 수 있어 클래스 하나만으로 활용가치가 높아진다.(구현의 편의성)
        *   2. 매개변수나 반환형도 제네릭 타입으로 지정되어 명확히 해당 타입에 대해 처리할 수 있다.(타입의 안정성)
        * */
    }
}

package com.haenin.section01.generic;
/* 설명.
*   제네릭 클래스와 다이아몬드 연산자(<>)에 들어갈 수 있는 4가지 타입
*   1. E: Element
*   2. T: Type
*   3. K: Key
*   4. V: Value
*  */

public class GenericTest<T> {
    private T value;

    public GenericTest() {
    }

    public T getValue() {
        return value;
    }

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

package com.haenin.section01.generic;

public class MyGenericTest {
    private Object value;

    public MyGenericTest() {
    }

    public Object getValue() {
        return value;
    }

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