본문 바로가기

Language/Java

[JAVA]Generics 심화

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