[Java] 6. 제네릭-제한 된 제네릭 클래스


제한 된 제네릭에 대한 포스팅이다.


해당 포스팅을 처음으로 접근시에 아래에 제네릭 관련 이전 포스팅을 먼저 보면 좋다.

2022-09-20-[Java] 5. 제네릭 개념



1. 제한 된 제네릭 클래스

extends 키워드로 대입할 수 있는 타입을 제한하며, T는 자손 타입을 미리 정의해놓고 사용된다. 먼저 대충 설명하면 Student2 제네릭클래스에서 extends로 Lecture2 클래스와 Teacher2 클래스로 타입변수를 제한 된 클래스로 정의했기에 때문에

학생(Student)클래스를 객체 생성을 할때 Lecture2와 Teacher2 클래스만 대입이 되고
학생(Student)인스턴스 객체 내에 T1에는 Lecture2 객체(데이터)만, T2에는 Teacher2 객체(데이터)만 들어올(사용 될) 수 있다.


//학생 클래스
class Student2<T1 extends Lecture2, T2 extends Teacher2> {
    private T1 t1;//lecture

    private T2 t2;//teacher
    //...
}


주석 예제 2-2에서 제한 된 제네릭 클래스를 정의하면 컴파일시에 타입체크 에러 발생으로 프로그래머의 실수를 줄여서 프로그램과 서비스의 안정성이 올라가게 된다.

//예제 2-1. 정상적인(원하는) 프로그렘
Student2<Lecture2, Teacher2> student = new Student2<Lecture2, Teacher2>();
student.setT1(new Lecture2());//강사 정보
student.setT2(new Teacher2());//강의 정보

//예제 2-2. 논리적 오류 프로그램
//Student 제네릭 클래스가 강의와 강사 클래스로만 객체가 생성되어야 하는데
//아무 타입변수로 객체로 생성되기에 프로그래머가 임믜로 잘못된 방식으로 개발 할 수 았음
//Student2<String, Integer> student2 = new Student2<String, Integer>();//타입 체크 에러 발생!

2. 제한 된 제네릭 클래스 예제

설명은 주석과 이전 포스팅 예제 코드와 비교로 알 수 있다.

//강의 클래스
class Lecture2 {
    private String name;    //강의명
    private String day;     //강의요일

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDay() {
        return day;
    }

    public void setDay(String day) {
        day = day;
    }
}

//강사 클래스
class Teacher2<T1 extends Lecture2> {
    private T1 t1;//lecture

    public T1 getT1() {
        return t1;
    }

    public void setT1(T1 t1) {
        this.t1 = t1;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "t1=" + t1 +
                '}';
    }
}

//학생 클래스
class Student2<T1 extends Lecture2, T2 extends Teacher2> {
    private T1 t1;//lecture

    private T2 t2;//teacher

    public T1 getT1() {
        return t1;
    }

    public void setT1(T1 t1) {
        this.t1 = t1;
    }

    public T2 getT2() {
        return t2;
    }

    public void setT2(T2 t2) {
        this.t2 = t2;
    }
}

//제한 된 제네릭클래스 예제
public class ExGenericType2 {

    public static void main(String... args) {

        //예제 1. 제네렉 T(type) 사용 예제
        //예제 1-1. 제네릭 'T'에 Lecture 대입 ( Lecture의 Teacher )
        Teacher2<Lecture2> lectureTeacher = new Teacher2<Lecture2>();

        Lecture2 lecture = new Lecture2();
        lecture.setName("자바");
        lecture.setDay("수요일");
        lectureTeacher.setT1(lecture);

        //타입 체크 에러 발생!
        //Teacher2<String> lectureTeacher2 = new Teacher2<String>();


        //예제 2. 멀티제네릭 예제(타입변수를 여러개 정의한 제네릭클래스)
        //예제 2-1. 정상적인(원하느) 프로그렘
        Student2<Lecture2, Teacher2> student = new Student2<Lecture2, Teacher2>();
        student.setT1(new Lecture2());//강사 정보
        student.setT2(new Teacher2());//강의 정보

        //타입 체크 에러 발생!
        //Student 제네릭 클래스가 강의와 강사 클래스로만 객체가 생성되어야 하는데
        //아무 타입변수로 객체로 생성되기에 프로그래머가 임믜로 잘못된 방식으로 개발 할 수 았음
        //Student2<String, Integer> student2 = new Student2<String, Integer>();
    }

}



해당 포스팅도 종료이다.