Language/Java

[Java] Generics

moguogu 2022. 10. 26. 17:07

1. 정의 

- 타입을 일반화 하는 것을 의미
- 클래스 내부에서 정하는 것이 아닌 사용자 호출에 의해 타입이 지정되는 것
- class / interface / method 등의 타입을 파라미터로 사용할 수 있게 해주는 역할
- Java 5 부터 추가된 개념 

ex) List<String> list = new ArrayList<>(); // <>는 diamond라고도 하고 제네릭 표현식임 

 

2. 사용하는 이유 

1) 재사용성 증가 : 여러 타입의 파라미터를 삽입해 객체를 생성할 수 있기 때문에 코드를 간결하게 하고, 재사용성을 높인다

2) 컴파일 시 타입 에러 발견 가능 : 컴파일시 잘못 사용되는 문제점을 발견할 수 있기 때문에 런타임 단계에서 발견 될 가능성을 방지한다

3) 컴파일러가 타입 변환 수행: 컴파일 단계에서 타입 캐스팅을 해주기 때문에 불필요한 타입 캐스팅을 할 필요 없어진다

 

3. 사용법

//클래스 선언
public class temp1<T> {...}
//인터페이스 선언
public interface temp2<T> {...}

 

4. 와일드 카드 (Unknown type) 

- Unbound WildCard:
         List<?>와 같이 사용한다
         내부적으로는 Object로 정의되어서 사용되고 모든 타입을 인자로 받을 수 있다
- Upper Bounded WildCard:
         List<? extends Foo> 와 같은 형태로 사용한다
         클래스의 자식 클래스만을 인자를 받을 수 있다
- Lower Bounded WildCard:
         List<? super Foo> 와 같은 형태로 사용한다
         upper bound와는 반대로 특정클래스의 부모 클래스만을 인자로 받는다 

 

사용예시

1. upper bounded wildcard

import java.util.Arrays;
import java.util.List;
 
class WildcardDemo {
    public static void main(String[] args)
    {
 
        // Upper Bounded Integer List 선언
        List<Integer> list1 = Arrays.asList(4, 5, 6, 7);
 
        // printing the sum of elements in list 결과 값 출력
        System.out.println("Total sum is:" + sum(list1));
 
        // Double list 선언
        List<Double> list2 = Arrays.asList(4.1, 5.1, 6.1);
 
        // printing the sum of elements in list
        System.out.print("Total sum is:" + sum(list2));
    }
 
 	//upper bounded wildcard를 매개변수로 설정
    private static double sum(List<? extends Number> list)
    {
        double sum = 0.0;
        for (Number i : list) {
            sum += i.doubleValue();
        }
 
        return sum;
    }
}

//결과 값
//Total sum is:22.0
//Total sum is:15.299999999999999

extends 는 상한을 지정해 준다 

Integer, Double list를 각각 선언한 후에, sum 함수로 전달해서 element들을 모두 더한 결과 값을 출력시킨다

두 list 모두 Number의 하위 객체 이므로 선언 및 사용이 가능함을 확인할 수 있다 

 

2. Lower Bounded Wildcard 

import java.util.Arrays;
import java.util.List;
 
class WildcardDemo {
    public static void main(String[] args)
    {
        // Lower Bounded Integer List 선언 
        List<Integer> list1 = Arrays.asList(4, 5, 6, 7);
 
        // Integer list object is being passed
        printOnlyIntegerClassorSuperClass(list1);
 
        // Number list 선언
        List<Number> list2 = Arrays.asList(4, 5, 6, 7);
 
        // Integer list object is being passed
        printOnlyIntegerClassorSuperClass(list2);
    }
 
    public static void printOnlyIntegerClassorSuperClass(
        List<? super Integer> list)
    {
        System.out.println(list);
    }
}

//결과 값 
//[4, 5, 6, 7]
//[4, 5, 6, 7]

super는 하한을 지정해준다 

Integer, Number list를 선언한 후에, print 하는 함수로 전달한다

두 자료형 모두 Integer의 상위 객체 이므로 선언 및 사용이 가능함을 확인할 수 있다

 

3. Unbounded Wildcard

import java.util.Arrays;
import java.util.List;
 
class unboundedwildcardemo {
    public static void main(String[] args)
    {
 
        // Integer List 선언
        List<Integer> list1 = Arrays.asList(1, 2, 3);
 
        // Double list 선언 
        List<Double> list2 = Arrays.asList(1.1, 2.2, 3.3);
 
        printlist(list1);
 
        printlist(list2);
    }
 
    private static void printlist(List<?> list)
    {
        System.out.println(list);
    }
}
//결과
//[1, 2, 3]
//[1.1, 2.2, 3.3]

와일드카드 ?는 경계가 없다

따라서 어떤 자료형이든 상관 없이 object로 받아 실행한다 

 

 

 

참고

https://life-with-coding.tistory.com/489

 

[JAVA] 자바 제네릭(Generic) 기본 및 활용

목차 1. 제네릭이란? 2. 제네릭 타입이란? 3. 제네릭을 사용하는 이유 4. 제네릭 타입 예제 📌 1. 제네릭이란? 제네릭(Generic)이란 "타입을 일반화"하는 것을 의미하며 클래스 내부에서 정하는 것이

life-with-coding.tistory.com

https://velog.io/@eversong/Java-Generic-WildCard%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

 

Java Generic, WildCard에 대해서

Generic은 입력되는 객체의 타입을 보장하기 위해 사용된다. 입력으로 정해진 객체 혹은 그의 부모, 자식 등으로 다양한 객체 타입을 하나의 코드로 사용할 수 있는 편리한 기능이다.E: Element, 컬렉

velog.io

https://www.geeksforgeeks.org/wildcards-in-java/

 

Wildcards in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

'Language > Java' 카테고리의 다른 글

Java Basic  (0) 2022.07.22