Languages/Java

[Java]제네릭(Generic)을 쉽게 이해하기(문법과 활용)

MoonSta 2023. 7. 21. 23:25

 이번 포스팅은 Java 5부터 등장한 제네릭(Generic)에 대하여 알아보겠습니다. 제네릭(Generic)은 일반화한다는 뜻을 가진 generalize에서 비롯된 말입니다. 그럼 이쯤에서 생각해 볼 수 있는 내용은 어떠한 것을 일반화를 하는 데 쓰인다. 라고 생각할 수 있습니다. JAVA에서 어떠한 것은 바로 자료형이다. 즉 자료형을 일반화함으로써 자료형에 종속적이지 않은 클래스를 정의할 수 있다.

 


 

왜 제네릭(Generic)을 사용하는 것일까?

List testList = new ArrayList();

testList.add("mooonstar");
testList.add(1000);

int i = 변수

String dst = (String)testList.get(i);

 

이와 같은 코드가 있으면 컴파일단계에서의 에러는 발생하지 않습니다. 하지만 프로그램 실행 도중 i가 1이 되는 상황이 발생한다면 testList에서 두 번째 요소는 int 형이기 때문에 캐스팅 관련 에러가 발생합니다. 이러한 이유로 인해 자료형을 국한하고 컴파일 단계에서 에러를 잡기 위하여 제네릭(generic)을 사용합니다. 같은 예제를 제네릭(generic)을 사용하여 바꿔보겠습니다. 

 

 


제네릭(Generic)을 사용한다면?

List<String> testList = new ArrayList<String>();

testList.add("mooonstar");
testList.add(1000);  ---> 타입이 맞지 않기 때문에 컴파일 에러 발생

int i = 변수

String dst = testList.get(i);

 

 String으로 제네릭(generic) 타입을 국한하게 되면 세 번째 코드에서 컴파일 에러를 발생시킵니다. 또한 마지막 줄에서는 위의 제네릭(generic)을 사용하지 않았을 때처럼 형 변환을 할 필요도 없습니다. 이러한 이유로 인해 제네릭(generic)을 사용합니다.

 

 


 

또 다른 제네릭(Genric)의 사용

추가적으로 제네릭(Generic) 타입은 클래스와 인터페이스에서도 사용한다.

 

클래스(Class)

class ClassGene<T> {
   private T t;
   public void T get() {
     return t;  
   }
   private void set(T t) {
      this.t = t;
   }
}

 

인터페이스(Interface)

interface InterfaceGene<T> {
       T.test(T, t);
}

 

인터페이스 구현부(Interface Implement)

class InterfaceGeneImpl implements InterfaceGene<String> { //구현부에서 자료형 지정
	@Override
    public String test(String t) {
       return null;
    }
}