본문 바로가기

인강 보습 (인프런,유데미,패스트캠퍼스)/나도코딩의 자바 기본편

제네릭스 - (1)

 

_01_Generics

public class _01_Generics {
    public static void main(String[] args) {
        // 제네릭스
        Integer[] iArray = {1, 2, 3, 4, 5};
        Double[] dArray = {1.0, 2.0, 3.0, 4.0, 5.0};
        String[] sArray = {"A", "B", "C", "D", "E"};

        printIntArray(iArray);
        printDoubleArray(dArray);
        printStringArray(sArray);

        System.out.println("-----------------------");

        printAnyArray(iArray);
        printAnyArray(dArray);
        printAnyArray(sArray);
    }

    // T : Type, K : Key, V : Value, E : Element <>
    private static <T> void printAnyArray(T[] array) {
        for (T t : array) {
            System.out.print(t + " ");
        }
        System.out.println();
    }

    private static void printStringArray(String[] sArray) {
        for (String s : sArray) {
            System.out.print(s + " ");
        }
        System.out.println();
    }

    private static void printDoubleArray(Double[] dArray) {
        for (double d : dArray) {
            System.out.print(d + " ");
        }
        System.out.println();
    }

    private static void printIntArray(Integer[] iArray) {
        for (int i : iArray) {
            System.out.print(i + " "); // 1 2 3 4 5
        }
        System.out.println();
    }
}

 

제네릭 클래스 - (1)

_02_GenericClass

 

public static void main(String[] args) {
    // 제네릭 클래스
    CoffeeByNumber c1 = new CoffeeByNumber(33);
    c1.ready();

    CoffeeByNickname c2 = new CoffeeByNickname("유재석");
    c2.ready();

    System.out.println("---------------------");

    CoffeeByName c3 = new CoffeeByName(34);
    c3.ready();

    CoffeeByName c4 = new CoffeeByName("박명수");
    c4.ready();

    System.out.println("---------------------");
    int c3Name = (int) c3.name;
    System.out.println("주문 고객 번호 : " + c3Name);

    String c4Name = (String) c4.name;
    System.out.println("주문 고객 이름 : " + c4Name);

    // c4Name = (String) c3.name;

        *Object 형을 통해 호출을 시도 but,  

        *c4Name = (String) c3.name;  // 즉 형변환이 안되는 문제 발생 

 

CoffeeByName

public class CoffeeByName {
    public Object name; // Integer, Double, String, BlackBox...

    public CoffeeByName(Object name) {
        this.name = name;
    }

    public void ready() {
        System.out.println("커피 준비 완료 : " + name);
    }
}

 

 

제네릭 클래스 - (2) 

_02_GenericClass

System.out.println("---------------------");

Coffee<Integer> c5 = new Coffee<>(35);
c5.ready();
int c5Name = c5.name;
System.out.println("주문 고객 번호 : " + c5Name);

Coffee<String> c6 = new Coffee<>("조세호");
c6.ready();
String c6Name = c6.name;
System.out.println("주문 고객 이름 : " + c6Name);

          * 제네릭스 클래스로 해결

Coffee

public class Coffee <T>{
    public T name;

    public Coffee(T name) {
        this.name = name;
    }

    public void ready() {
        System.out.println("커피 준비 완료 : " + name);
    }
}

 

제네릭 클래스 - (3) 

 

_02_GenericClass

CoffeeByUser<User> c7 = new CoffeeByUser<>(new User("강호동"));
c7.ready();

CoffeeByUser<User> c8 = new CoffeeByUser<>(new VIPUser("서장훈"));
c8.ready();

 

Chap09> user > User

public class User {
    public String name;

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

    public void addPoint() {
        System.out.println(this.name + "님, 포인트 적립되었습니다.");
    }
}

Chap09> user > VIPUser

public class VIPUser extends User {
    public VIPUser(String name) {
        super("특별한 " + name);
    }
}

Chap09> coffee > CoffeeByUser

import chap_09.user.User;

public class CoffeeByUser <T extends User>{
    public T user;

    public CoffeeByUser(T user) {
        this.user = user;
    }

    public void ready() {
        System.out.println("커피 준비 완료 : " + user.name);
        user.addPoint();
    }
}

        *특정 클래스만 상속하는 제네릭 클래스 

제네릭 클래스 - (4)

 

_02_GenericClass

        orderCoffee("김영철");
        orderCoffee(36);

        orderCoffee("김희철", "아메리카노");
        orderCoffee(37, "라떼");
    }

    public static <T> void orderCoffee(T name) {
        System.out.println("커피 준비 완료 : " + name);
    }

    public static <T, V> void orderCoffee(T name, V coffee) {
        System.out.println(coffee + " 준비 완료 : " + name);
    }
}