제네릭타입을 부모 클래스로 사용할 경우

타입 파라미터는 자식 클래스에도 기술해야 한다.

public class ChildProduct<T, M> extends Product<T, M> { ... }

추가적인 타입 파라미터를 가질 수 있다.

public class ChaildProduct<T, M, C> extends Product<T , M > { ... }


제네릭 인터페이스를 구현할 경우

타입 파라미터는  구현 클래스에도 기술해야 한다.

public class StorageImpl<T> implement Storage<T> { ... }

 


exam

public class 제품<T, M> {
private T 종류;
private M 모델;

public T get종류() { return 종류; }

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

public M get모델() {
return 모델;
}

public void set모델(M 모델) {
this.모델 = 모델;
}
}


class Tv{}



public class 자식제품<K,V,C> extends 제품<K, V> {
private C 회사;

public C get회사() {
return 회사;
}

public void set회사(C 회사) {
this.회사 = 회사;
}
}


public interface 보관소<T> {
public void 추가(T item, int index);

public T get(int index);
}



public class 보관소Impl<T> implements 보관소<T> {

private T[] array;

public 보관소Impl(int capacity) {
this.array = (T[]) (new Object[capacity]);
}

@Override
public void 추가(T item, int index) {
array[index] = item;
}

@Override
public T get(int index) {
return array[index];
}
}



public class 자식제품그리고보관소Example {
public static void main(String[] args) {

자식제품<Tv, String, String> 제품 = new 자식제품<>();

제품.set종류(new Tv());
제품.set모델("스마트티비");
제품.set회사("삼성");


보관소<Tv> 보관소 = new 보관소Impl<>(100);

보관소.추가(new Tv(), 0);
Tv tv = 보관소.get(0);

}
}


'JAVA > JAVA' 카테고리의 다른 글

람다식 기본 문법  (0) 2018.06.09
람다식이란?  (0) 2018.06.09
제네릭(Generic) 와일드카드 타입  (0) 2018.06.09
제네릭(Generic) 메소드  (0) 2018.06.08
제네릭(Generic)이란 ? 제네릭 타입이란?  (0) 2018.06.08

와일드카드(?) 타입이란?

제네릭 타입을 매개변수나 리턴타입으로 사용할 때 타입 파라미터를 제한할 목적

※ 비교

<T extends 상위 또는 인터페이스>는 제네릭 타입과 제네릭 메소드를 선언할 때 제한을 한다.

public static void registerCourse(Course<?> course{

public static void registerCourseStudent(Course<? extends Student> course{

public static void registerCourseWorks(Course<? super Worker> course{



와일드카드 타입의 세가지 형태

제네릭타입<?> :     Unbounded WildCards(제한 없음)

타입 파라미터를 대치하는 구체적인 타입으로 모든 클래스나  인터페이스 타입이 올 수 있다.
public static void registerCourse(Course<?> course{



제네릭타입<? extends 상위타입> :     Upper Bounded Wildcards ( 상위 클래스 제한  )

타입 파라미터를 대치하는 구체적인 타입으로 상위 타입이나 하위 타입만 올 수 있다.

public static void registerCourseStudent(Course<? extends Student> course{


exam )    E -> D -> C -> B -> A          E가 D를 상속  -> D가 C를 상속  ->C가 B를 상속 .....


<? extends C>     라면    c, d, e 를 사용 할 수 있다.


제네릭타입<? super 하위타입> :         Lower Bounded Wildcards ( 하위 클래스 제한 )

타입 파라미터를 대치하는 구체적인 타입으로 하위 타입이나 상위 타입이 올 수 있다.

public static void registerCourseWorks(Course<? super Worker> course{


exam )    E -> D -> C -> B -> A          E가 D를 상속  -> D가 C를 상속  ->C가 B를 상속 .....


<? extends C>     라면    c, b, a 를 사용 할 수 있다.




Exam

수강코스를 만들고   수강 생을   수강코스에 넣는다?

만들 클래스들


수강코스  클래스

public class Course<T> {
private String 수강코스명;
private T[] 수강인원;

//외부에서 수강코스명과 인원수를 결정해서 만들어냄
public Course(String 수강코스명, int capacity) {
this.수강코스명 = 수강코스명;
//T가 결정이 안된상태에서 배열을 생성할수 없다.
//수강인원 = new T[capacity] (x)
수강인원 = (T[]) (new Object[capacity]);
}

public String get수강코스명() { return 수강코스명; }
public T[] get수강인원() { return 수강인원; }

public void add(T t) {
for (int i = 0; i < 수강인원.length; i++) {
if (수강인원[i] == null) {
수강인원[i] = t;
break;
}
}
}
}



Person클래스

public class Person {
public String name;

public Person(String name) {
this.name = name;
}

public String getName() { return name; }

@Override
public String toString() {
return name;
}
}

Student 클래스

public class Student extends Person {

public Student(String name) {
super(name);
}
}

HighStudent 클래스

public class HighStudent extends Student {

public HighStudent(String name) {
super(name);
}
}


Worker 클래스

public class Worker extends Person {
public Worker(String name) {
super(name);
}
}



메인 메서드

public class WildCardExample {
// 수강코스의 코슴이름과 수강중인 사람들을 보여주는 메서드들 * 메서드 타입 파라미터가 다름 *
static void registerCourse(Course<?> course) {
System.out.println("registerCourse()메서드의 [ " + course.get수강코스명() + " ] 수강생: " + Arrays.toString(course.get수강인원()));

}

// Student 상위 타입을 제한
static void registerCourseStudent(Course<? extends Student> course) {
System.out.println("registerCourseStudent()메서드의 [ " + course.get수강코스명() + " ] 수강생: " + Arrays.toString(course.get수강인원()));
}

// Worker 하위 타입을 제한
static void registerCourseWorker(Course<? super Worker> course) {
System.out.println("registerCourseWorker()메서드의 [ " + course.get수강코스명() + " ] 수강생: " + Arrays.toString(course.get수강인원()));
}


public static void main(String[] args) {

Course<Person> personCourse = new Course<Person>("사람이면 가능한 과정", 5);
personCourse.add(new Person("일반인"));
personCourse.add(new Worker("직장인"));
personCourse.add(new Student("학생"));
personCourse.add(new HighStudent("고등학생"));

Course<Worker> workerCourse = new Course<>("직장인 과정", 5);
workerCourse.add(new Worker("직장인"));
workerCourse.add(new Worker("직장인"));
//workerCourse.add(new Student("학생")); 불가능


Course<Student> studentCourse = new Course<>("학생 과정", 5);
studentCourse.add(new HighStudent("고등학생"));
studentCourse.add(new Student("학생"));
//studentCourse.add(new Person("일반인")); 불가능

Course<HighStudent> highStudentCourse = new Course<>("고등학생 과정", 5);
highStudentCourse.add(new HighStudent("고등학생"));
//highStudentCourse.add(new Student("학생")); 불가능

registerCourse(personCourse);
registerCourse(workerCourse);
registerCourse(studentCourse);
registerCourse(highStudentCourse);

//상위 타입을 제한했으므로 하위타입인 highStudentCourse 와 studentCourse 사용가능
// registerCourseStudent(personCourse); 불가능
// registerCourseStudent(workerCourse); 불가능
registerCourseStudent(studentCourse);
registerCourseStudent(highStudentCourse);

//하위 타입을 제한했으므로 상위타입인 PersonCourse 와 workerCourse 사용가능
registerCourseWorker(personCourse);
registerCourseWorker(workerCourse);
// registerCourseWorker(studentCourse); 불가능
// registerCourseWorker(highStudentCourse); 불가능


}
}

실행 결과




'JAVA > JAVA' 카테고리의 다른 글

람다식이란?  (0) 2018.06.09
제네릭(Generic) 타입의 상속과 구현  (0) 2018.06.09
제네릭(Generic) 메소드  (0) 2018.06.08
제네릭(Generic)이란 ? 제네릭 타입이란?  (0) 2018.06.08
Thread 정리..??  (0) 2018.06.08

제네릭(Generic) 메소드

매개변수입과 리턴타입 으로 타입파라미터를 갖는 메소드를 말한다.


제네릭 메소드 선언방법

리턴 타입 앞에 "<>" 기호를 추가하고 타입파라미터를 기술한다.

타입 파라미터를 리턴타입과 매개변수에 사용한다.

public <타입파라미터,  ...> 리턴타입  메소드명(매개변수,... ){ ... }

puvlic<T> Box<T> boxing(T t) { ... }

제네릭 메소드를 호출하는 두가지 방법


1) 리턴타입 변수  = < 구체적 타입 > 메소드명(매개값);   //명시적으로 구체적 타입 지정

2) 리턴타입 변수 = 메소드명(매개값);                            // 매개값을 보고 구체적 타입을 추정 

주로 2번 사용

exam1 

public class GenericMethod {
static class Box<T> { //box 클래스
private T t;
public T getT() { return t; }
public void setT(T t) { this.t = t; }
}
static class Util { // 박스를 이용해 제네릭 메소드가 있는 Util클래스
public static <T> Box<T> boxing(T t) {
Box<T> box = new Box<T>();
box.setT(t);
return box;
}
}
public static void main(String[] args) {
//1번 구체적 타입 명시 <Integer>boxing(100) 구체적타입 Integer 명시
Box<Integer> box1 = Util.<Integer>boxing(100);
int intValue = box1.getT();
System.out.println(intValue);

//2번 매개값을 보고 구체적 타입 추정. 홍길동 = String 타입
Box<String> box2 = Util.boxing("홍길동");
String strValue = box2.getT();
System.out.println("strValue = " + strValue);

}
}









exam2



public class Pair<K, V> {
private K key;
private V value;

public Pair(K key, V value) {
this.key = key;
this.value = value;
}

public K getKey() { return key; }

public void setKey(K key) { this.key = key; }

public V getValue() { return value; }

public void setValue(V value) { this.value = value; }
}
public class Util {
//두개의 Pair객체를 받아서 페어 객체의 K,V값을 비교 K와 V가 같다면 true or false
public static <K,V> boolean compare(Pair<K,V> p1, Pair<K,V> p2) {
boolean keyCompare = p1.getKey().equals(p2.getKey());
boolean valueCompare = p1.getValue().equals(p2.getValue());

// keyCompare 그리고 valueCompare 가 같으면 true
return keyCompare && valueCompare;

}
}
public class CompareMethodExample {
public static void main(String[] args) {
//두개의 Pair객체 생성
Pair<Integer, String> p1 = new Pair<>(1, "사과");
Pair<Integer, String> p2 = new Pair<>(1, "사과");
// 구체적 타입 명시.. 두개의 페어 객체를 비교
Util.<Integer,String>compare(p1, p2);

//매개값을 보고 구체적 타입 추정, new Pair<>(1, "사과") 1 =Integer 타입 , "사과" = String 타입
boolean result1 = Util.compare(p1, p2);
if (result1) {
System.out.println("논리적으로 동등합니다.");
} else {
System.out.println("논리적으로 동등하지 않습니다.");
}
}
}


'JAVA > JAVA' 카테고리의 다른 글

제네릭(Generic) 타입의 상속과 구현  (0) 2018.06.09
제네릭(Generic) 와일드카드 타입  (0) 2018.06.09
제네릭(Generic)이란 ? 제네릭 타입이란?  (0) 2018.06.08
Thread 정리..??  (0) 2018.06.08
자바 기본 변수  (0) 2018.05.08

+ Recent posts