제네릭

색인

    제네릭

    제네릭이란 무엇입니까?

    • 다른 형식의 개체를 처리하는 메서드 또는 컬렉션 클래스에 대한 컴파일 타임 형식 검사.하는 기능
    • 유형 안정성 보장그래서 지정된 유형 이외의 입력을 방지할 수 있습니다.
    • 유형 검사 및 캐스팅 건너뛰기그래서 코드가 짧다

    예 1

    제네릭 의약품을 사용하기 전에

    package javaStandard.chapter12;
    
    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};
            String() sArray = {"A", "B", "C", "D", "E"};
    
            printIntegerArray(iArray);
            printDoubleArray(dArray);
            printStringArray(sArray);
    
        }
    
        private static void printIntegerArray(Integer() iArray) {
            for (Integer i : iArray) {
                System.out.println(i + " ");
            }
            System.out.println();
        }
    
        private static void printDoubleArray(Double() dArray) {
            for (Double i : dArray) {
                System.out.println(i + " ");
            }
            System.out.println();
    
        }
    
        private static void printStringArray(String() sArray) {
            for (String i : sArray) {
                System.out.println(i + " ");
            }
            System.out.println();
        }
    }

    제네릭 의약품을 사용한 후

    package javaStandard.chapter12;
    
    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};
            String() sArray = {"A", "B", "C", "D", "E"};
    
            printAnyArray(iArray);
            printAnyArray(dArray);
            printAnyArray(sArray);
        }
    
        private static <T> void printAnyArray(T() array) {
            for (T t : array) {
                System.out.println(t + " ");
            }
            System.out.println();
        }
    }
    • 제네릭을 사용하기 전에 인쇄하려는 형식에 적합한 메서드를 선언해야 했습니다.
    • 하지만 이 과정은 너무 길고 번거롭기 때문에 제네릭으로 메서드를 선언하면 간결하게 표현할 수 있습니다.
    • 제네릭을 사용하는 경우 type에 관계없이 printAnyArray를 통해 출력되는지 확인할 수 있습니다.
    • Type의 첫 글자인 T를 사용하므로 철자가 어떤 식으로든 상관 없습니다.

    예 2

    package javaStandard.chapter12.coffee;
    
    public class Coffee<T> {
        public T name;
    
        public Coffee(T name) {
            this.name = name;
        }
    
        public void ready() {
            System.out.println("커피 준비 완료 : " + name);
        }
    }
    
    package javaStandard.chapter12;
    
    import javaStandard.chapter12.coffee.*;
    import javaStandard.chapter12.user.User;
    import javaStandard.chapter12.user.VIPUSer;
    
    public class _02_GenericClass {
        public static void main(String() args) {
            //제네릭스
            
            Coffee<Integer> c5 = new Coffee<>(35);
            c5.ready();
    
            Coffee<String> c6 = new Coffee<>("조세호");
            c6.ready();
        }
    }

    결과

    더보기

    커피가 준비되었습니다: 35
    커피가 준비됐다 : 조세호

    • 커피 클래스에서는 모든 유형을 다음과 같이 분류했습니다. 표시되고 사용될 때 값에 대한 적절한 유형이 결정되었습니다.
    • 필요한 유형으로 코드를 작성할 수 있기 때문에 더 편리합니다.

    예 3

    package javaStandard.chapter12.coffee;
    import javaStandard.chapter12.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();
        }
    }
    package javaStandard.chapter12.user;
    
    public class User {
        public String name;
    
        public User(String name) {
            this.name = name;
        }
    
        public void addPoint() {
            System.out.println(this.name + "님, 포인트 적립되었씁니다.");
        }
    }
    
    package javaStandard.chapter12;
    
    import javaStandard.chapter12.coffee.*;
    import javaStandard.chapter12.user.User;
    import javaStandard.chapter12.user.VIPUSer;
    
    public class _02_GenericClass {
        public static void main(String() args) {
            //제네릭스
    
            CoffeeByUser<User> c7 = new CoffeeByUser<User>(new User("강호동"));
            c7.ready();
    
            CoffeeByUser<User> c8 = new CoffeeByUser<>(new VIPUSer("서장훈"));
            c8.ready();
        }
    }

    결과

    더보기

    커피가 준비됐다: 강호동
    강호동, 포인트가 쌓였다.
    커피가 준비됐다: 스페셜 서장훈
    스페셜 서장훈, 포인트가 쌓였다.

    • 공개 클래스 CoffeeByUser
      { // 어떤 타입이든 상관없지만 User 클래스에서 상속받은 T를 사용해야 한다는 뜻입니다.

    청소

    • 과거에는 서로 다른 타입을 다루는 메서드의 파라미터나 리턴 타입으로 객체 타입 참조 변수를 많이 사용했고, 타입 변환이 불가피했다.
    • 이제 제네릭을 사용하고 개체 유형 대신 원하는 유형을 지정하기만 하면 됩니다!