[Java] 6. 제네릭-제한 된 제네릭 클래스
제한 된 제네릭에 대한 포스팅이다.
해당 포스팅을 처음으로 접근시에 아래에 제네릭 관련 이전 포스팅을 먼저 보면 좋다.
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>();
}
}
해당 포스팅도 종료이다.