1cm

자바 프로그래밍_Day_20_제네릭스(Generics) 본문

국비지원_Java/Java Programming_1

자바 프로그래밍_Day_20_제네릭스(Generics)

dev_1cm 2021. 9. 21. 23:47
반응형



2021.09.13

 

 

     > 제네릭스(Generics)

       -> JDK1.5부터 제공되는 기능이다.

       -> 클래스나 메소드 내부에서 다룰 데이터의 클래스 타입을 지정하거나, 컬렉션이 다룰 클래스 타입을 제한하여 한 가지 종류의 클래스만 저장할 수 있게 한 기능이다.

 

     > 제네릭스(Generics)를 사용하는 이유

       -> 컴파일 단계에서 '잘못 된 타입을 사용할 수 있는 문제'를 제거하기 위해.

       -> 컬렉션에 저장된 여러 종류의 객체를 꺼내서 사용할 때, 객체의 종류에 따라 매번 형 변환을 해야하기 때문에 코드가 복잡해진다.

       -> 컬렉션, 람다식(함수적 인터페이스), 스트림, NIO에서 널리 사용한다.

       -> API Document 해석에 어려움을 겪어 학습에 제한이 생기기 때문.

 

 

     > 제네릭스(Generics) 장점

       -> 컴파일 시 강한 타입 체크 가능 (실행 시, 컴파일 시 에러 방지)

       -> 타입 변환 제거가 가능

       -> 오브젝트 타입을 사용하면 모든 객체를 사용할 수 있다는 장점이 있지만 불러올 때 잘못된 형변환이 생길수 있으므로 성능 저하가 발생할 수 있다. -> 제네릭스를 사용하면 성능 향상에 장점이 있다.

좌) 제네릭스 적용 전 / 우) 제네릭스 적용 후

 

 

 

     > 제네릭스(Generics) 타입과 표현식

       -> 타입을 파라미터로 가지는 클래스와 인터페이스 선언 시 클래스 또는 인터페이스 이름 뒤에 "< >"부호를 붙이고 사이에는 타입 파라미터가 위치한다.

1
2
3
4
5
6
7
[표현식]
클래스명<클래스 타입> 레퍼런스 = new 생성자<클래스타입>();
클래스명<클래스 타입> 레퍼런스 = new 생성자<>();            // JDK1.7부터 적용, 타입 추론
 
[사용예시]
ArrayList<Book> list1 = new ArrayList<Book>();
ArrayList<Book> list2 = new ArrayList< >();
cs

       -> <> : 다이아몬드 연산자

       -> 클래스 또는 인터페이스 뒤에 파라미터 설정 -> 앞에 있는 타입을 보고 유추해서 자동으로 설정해준다.

 

 

     > 제네릭스(Generics)가 설정된 레퍼런스를 인자로 넘기는 경우

       -> 메소드 쪽에서 받아주는 매개 변수도 제네릭스가 적용되어야 한다.

1
2
3
4
5
6
7
8
9
예) ArrayList<Book> list = new ArrayList<Book>();
    BookManager bm = new BookManager();
    bm.printInformation(list);
 
 
// BookManager Class
    public void printInformation(ArrayList<Book> list){
        ...
    }
cs

 

 

     > 제네릭스(Generics)가 설정된 레퍼런스를 리턴하는 경우

       -> 메소드의 반환형에도 제네릭스가 적용되어야 한다.

1
2
3
4
예)    public ArrayList<Book> getInformation(){
    ArrayList<Book> list = new ArrayList<Book>();
    return list;
    }
cs

 

 

 

     > 클래스에서 제네릭스(Generics) 사용

       -> 예) class 클래스명<영문자> {

                  영문자 레퍼런스;

                  }

 

       -> *영문자

 

            -> 저장될 타입은 영문자로 지정, 일반적으로 대문자를 사용 (ex, T, E, K, V)

 

타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number

 

            -> 클래스 타입이 미정인 경우, 객체 생성 시 정해지는 클래스 타입을 영문자가 받아 영문자 사용 위치에 적용된다.

 

            -> 컴파일 시 타입 파라미터가 구체적인 클래스로 변경된다.

 

            -> 필요한 시점에 타입을 지정할 수 있다.

 

 

 

     > 멀티 타입 파라미터

       -> 제네릭스 타입은 두 개 이상의 타입 파라미터 사용이 가능하며 각 타입 파라미터를 콤마로 구분한다.

       -> 객체를 생성할 때 원하는 타입으로 변경이 된다.

 

 

     > 제네릭스(Generics) 타입의 상속과 구현

       -> 제네릭스 타입을 부모 클래스로 사용해야 할 경우 타입 파라미터는 자식 클래스에도 적어줘야 한다. (자식-부모 동일)

 

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

 

       -> ex)

 

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

 

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

 

 

 

       -> 구체적인 타입 제한

            -> 상속 및 구현 관계를 이용해 타입 제한이 가능하며, 상위 타입은 클래스 뿐 아니라 인터페이스도 가능하다.

 

            -> public <T extends 상위 타입> 리턴타입 메소드(매개변수, ...){ ... }

 

            -> 단, 중괄호 { } 안에서 타입 파라미터 변수로 사용 가능한 것은 상위타입의 멤버(필드, 메소드)로 제한되어, 하위 타입에만 있는 필드와 메소드는 사용이 불가능하다.

            -> 구현하는 내용에 따라서는 구체적인 타입을 제한해야 될 수도 있다.

            -> 메소드 안에서 사용될 데이터들의 자료형을 실행하는 시점을 지정할 수 있다.

 

 

 

 

     > 제네릭스(Generics) 코드 실습과 출력 결과

 

     > chap4.MyGenerics

 

 

 

     > chap4.Application

 

반응형
Comments