language/Java

제네릭이란?

늉_늉 2020. 10. 6. 10:57

제네릭이라는 단어를 가끔 듣게 되는데

 

궁금해서 찾아보았다.

 

 

 

제네릭이란 클래스에서 사용할 타입을 클래스 외부에서 설정하는것 이라고한다.

 

 

선언은

 

클래스 <사용할 타입> 

 

 

이다.

 

 

<>안에 어떤 타임을 선언해 줘서 ArrayList, List등이 사용할 객체의 타입을 지정해 준다는 뜻.

 

import java.util.ArrayList;
import java.util.List;
 
public class Generics {
 
    public static void main(String[] args) {
        
        ArrayList<String> arrList = new ArrayList<String>();
        
        arrList.add("광어");
        arrList.add("우럭");
        arrList.add("참돔");
        
        for(int i=0; i<arrList.size(); i++){
            System.out.println("arrList : " + arrList.get(i));
        }
        
        List<Integer> list = new ArrayList<Integer>();
        list.add(123);
        list.add(456);
        list.add(789);
        
        for(int i=0; i<list.size(); i++){
            System.out.println("list : " + list.get(i));
        }
    }
 
}

 

ArrayList는 String으로 선언해줘서 String 객체만 다루며

 

List는 Integer로 선언해줘서 int형 객체만 다룬다.

 

 

 

이렇게 미리 사용할 객체의 타입을 명시해 줌으로써 얻는 이점은 

 

제네릭과 맞지않는 객체의 타입이 올 경우 컴파일 에러가 발생한다.

 

 

 

 

결론

 

1. 타입의안정성       

 

(의도하지 않은 타입의 객체가 저장되는 것을 막고, 다른 타입의 객체로 인한 타입 형태가 맞지 않아 발생하는 문제를 없애준다.)

 

 

2. 불필요한 형변환을 줄여 코드의 간결함

 

(타입을 미리 명시함으로써 다른 타입의 객체가 저장되지 않아 객체를 꺼내 사용할 시 형변환을 통한 타입을 맞출 필요가 없어 코드를 간결하게 줄일 수 있다.)

 

 

 

 

Generics의 다형성

 

 

위의 예시는 컬럭션 사용에서만의 예시이다.

 

제네릭은 클래스 , 인터페이스등 다양하게 사용 될 수 있다.

 

 

 

 

public class Generics {
 
    public static void main(String[] args) {
        
        ArrayList<Sports> arrList = new ArrayList<Sports>();
        arrList.add(new Sports());
        arrList.add(new Soccer());
        arrList.add(new Baseball());
        
        Sports sports = arrList.get(0);
        Soccer soccer = (Soccer) arrList.get(1);
    }
 
}
 
class Sports{}
 
class Soccer extends Sports{} //상속
 
class Baseball extends Sports{} //상속

 

 

Sports라는 클래스 타입의 ArrayList를 생성 하였다.

 

Sports클래스는 부모 클래스로 하위(자식) 클래스인 Soccer,Baseball 클래스가 부모클래스를 상속 받고 있다.

 

 

부모클래스 본인 뿐만 아니라 Soccer와 Baseball객체도 부모클래스타입으로 선언되 ArrayList에 저장 될 수 있다.

 

이는 제네릭의 다형성으로 부모클래스로부터 상속을 받았기에 가능한것이다.

 

 

 

다만, 꺼낼때는 자식클래스는 본인의 타입으로 다시 형변환 해줘야한다.

 

 

 

 

 

와일드 카드 

 

제네릭은 보통 하나의타입을 지정, 명시하지만 하나이상의 타입을 지정해야 하는 경우가 발생 할 수 있다.

 

이를 해결하기위해 와일드 카드를 사용한다.

 

 

 

와일드 카드란 '?'를 이용해 하나 이상의 타입을 가능하게 한다.

 

 

<?> : Unbounded WildCards 

 

 

제네릭타입<? extends 상위타입> :     Upper Bounded Wildcards ( 상위 클래스 제한  )

 

 

 

제네릭타입<? super 하위타입> :         Lower Bounded Wildcards ( 하위 클래스 제한 )

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

getOrDefault  (0) 2022.03.02
향상된 for문  (0) 2020.09.29
[Java] hashmap  (0) 2020.09.29