1. 제네릭 클래스가 받을 수 있는 인수 자료형에 제한 거는 것
(1) 사전 준비 - 우리가 받고 싶은 특정 자료형을 클래스로 만든다.
//1. 부모 클래스
public class User {
public String name;
public User(String name) {
this.name = name;
}
public void addPoint(){
System.out.println(this.name + " 님, 포인트 적립되었습니다. ");
}
}
//2. 자식 클래스
public class VIPUser extends User {
public VIPUser(String name) {
//부모의 생성자를 쓰겠다는 말 : super(); , 부모의 매소드를 쓰겠다는 말 super.매소드_이름;
// name을 넣으면, 앞에 "특별한"이라는 말이 같이 인스턴스 변수에 들어가도록 조치
super("특별한 " + name);
}
}
(2) 자료형 가려 받을 수 있는 제네릭스 클래스 생성!
// 받을 수 있는 인수 제한:
// T extends User = User나 User를 상속받은 자식 클래스만 인수로 받아들이겠다.
public class CoffeeByUser <T extends User>{
//User 계열의 객체를 인스턴스 변수로 받겠다.
public T user;
public CoffeeByUser (T user) {
this.user = user;
}
// 변수로 받은 객체 안의 변수와 매소드를 이용한 것임.
public void ready(){
System.out.println("커피 준비 완료 : " + user. name);
user.addPoint();
}
}
(3) 제네릭 클래스 선언
//<> 안에는 우리가 쓸 자료형에 대해 쓰면 된다.
// 두번째 녀석은 VIPUser를 쓰니까 꺽새 안을 <VIPUser>로 써도 된다.
//()안은 생성자에 필요한 요소를 쓰면 되는데, 인수의 User도 객체 생성 시 인수가 필요하므로,
// 이중으로 들어갔다.
// 이건 들어올 인수에 대한 것이므로,
//부모 클래스의 참조변수로 자식 클래스의 인스턴스를 가르키는 다형성의 원리와 다르다.
CoffeeByUser<User> c7 = new CoffeeByUser<>(new User("강호동"));
c7.ready();
CoffeeByUser<User> c8 = new CoffeeByUser<>(new VIPUser("서장훈"));
c8.ready();
<결과 값>
커피 준비 완료 : 강호동
강호동 님, 포인트 적립되었습니다.
커피 준비 완료 : 특별한 서장훈
특별한 서장훈 님, 포인트 적립되었습니다.
2. 제네릭 매소드에 인수를 2개 이상 받을 때 어떻게 하는 지
(1) 일반적인 제네릭 매소드 복습
*선언
// 인수의 자료형에 맞게, 기능하게 되어있음.
public static <T> void orderCoffee(T name) {
System.out.println("준비 완료: " + name );
}
*호출
orderCoffee("김영철");
orderCoffee(36);
<결과>
준비 완료: 김영철
준비 완료: 36
(2) 인수가 두 개 이상 쓰이는 제네릭 매소드
*선언
public static <T,V> void orderCoffee(T name, V coffee) {
System.out.println(coffee + " 커피 준비 완료: " + name );
}
*호출
orderCoffee("김희철", "아메리카노");
orderCoffee(37, "라떼");
<결과>
아메리카노 커피 준비 완료: 김희철
라떼 커피 준비 완료: 37
3. 스스로 변수 바꿔가 해보기
public class Customer {
public String name;
public String PhoneNumber;
public Customer(String name, String Number) {
this.name = name;
this.PhoneNumber = Number;
}
public void Call() {
System.out.println(name + "님의 전화번호 " + PhoneNumber + "로 연락하겠습니다.");
}
}
public class Vip extends Customer{
public Vip(String name, String Number) {
super("장기 이용 회원이신" +name, Number);
}
}
public class Call_Our_Customer <T extends Customer> {
public T Customer;
public Call_Our_Customer(T User){
this.Customer = User;
}
public void AutoCall (){
System.out.println("call to " + Customer.name + "his PhoneNumber is " + Customer.PhoneNumber);
Customer.Call();
}
}
import WorkOut_Myself.Customer.Call_Our_Customer;
import WorkOut_Myself.Customer.Customer;
import WorkOut_Myself.Customer.Vip;
public class Generics_Myself {
public static void main(String[] args) {
Call_Our_Customer<Customer> c1 = new Call_Our_Customer<>(new Customer("김계란","010***52091"));
Call_Our_Customer<Vip> c2 = new Call_Our_Customer<>(new Vip("팍팍팍", "0101*456790"));
c1.AutoCall();
c2.AutoCall();
}
}
'Language > Java' 카테고리의 다른 글
[JAVA] ArrayList (0) | 2023.02.07 |
---|---|
[JAVA] Wrapper Class (0) | 2023.02.07 |
[JAVA] Generic Class (0) | 2023.02.03 |
[JAVA] Generics (0) | 2023.02.02 |
[JAVA] Interface (인터페이스) (0) | 2023.02.02 |