본문 바로가기
프로그래밍/java

java 제네릭 정리

by 뜨끔쓰 2019. 5. 2.
728x90
728x90

안녕하세요


오늘은 자바의 제네릭(Generic)에 대하여 공부해보려고합니다.




제네릭(Generic)이란?

제네릭은 데이터타입을 일반화 한다는 뜻을 담고있습니다.

java에도 버전이 있는데, 제네릭은 처음부터 있었던게 아닌 java 5버전부터 도입이 되었습니다. 그렇기 때문에 4버전까지는 꺽쇠를 이용한 제네릭이 존재하지 않았는데요. 그렇다면 새롭게 제네릭이라는 문법이 필요하게 된 이유가 무엇일까요? 아래의 예시와 사용법을 보며 공부해봅시다.




첫번째로 제네릭은 자료형에 의존적이지 않게 클래스를 정의 할 수 있게 만들어줍니다.

이게 무슨 뜻이냐면 예시를 보며 확인해봅시다.


class Box
{
   object boxType;
   public void setItem(Object boxType){
       this.boxType = boxType
   }
   public Object getItem(){
       return boxType;
   }
}


Box라는 클래스가 있습니다. Object의 형태로 어떠한 종류든 받아낼수도 있고 리턴해줄 수도 있는 클래스로 만들어주고 싶어서 만들었습니다.

그렇지만 값을 받을때는 캐스팅으로 명시적으로 형변환을 해줘야한다는 번거로움이 있습니다. 그럴때 해결하는 방법으로 제네릭이 클래스가 있습니다.



class Box<T>
{
   T boxType;
   
   public Box(T boxType){
       this.boxType = boxType;
   }
   public void setItem(T boxType){
       this.boxType = boxType
   }
   public T getItem(){
       return boxType;
   }
}


이런식으로 클래스명 옆에 꺽쇠를 이용하여 <T>라고 적어주었습니다. 꺽쇠안에는 굳이 T가 아닌 다른 문자도 상관없지만 통상적으로 아래의 문자들을 이용합니다.

  • E - Element
  • K - Key
  • N - Number
  • T - Type
  • V - Value
우리는 자료형을 사용하기 때문에 T를 사용 또한 기본자료형이 아닌 어떤 클래스도 사용이 가능합니다. 기본자료형을 사용하고싶다면 Wapper클래스를 이용하시면 되겠습니다.!


public static void main(String[] args) {

	Box<Integer> box = new Box<Integer>(12);
	int num = box.getItem();
	System.out.println("정수형: " + num);

	Box<String> box1 = new Box<String>("문자열입니다.");
	String str = box1.getItem();
	System.out.println("문자열: " + str);

	Box<Double> box2 = new Box<Double>(123.4567);
	double num2 = box2.getItem();
	System.out.println("실수형: " + num2);

}


이렇게 main을 작성하여 출려해보시면 어떤형의 자료형이든 받아낼 수 있으면 명시적으로 형변환 없이도 사용이 가능할 수 있습니다.


두번째로 제네릭 클래스는 자료형의 제한이 필요할때도 사용합니다.


제네릭 클래스를 작성할때 <T>를 이용하여 어떤 클래스도 사용이 가능하지만, 특정한 클래스만 사용 가능하도록 제한하는 방법이 있습니다.


class Box<T extends FruitBox>
{
   T boxType;
   
   public Box(T boxType){
       this.boxType = boxType;
   }
   public void setItem(T boxType){
       this.boxType = boxType
   }
   public T getItem(){
       return boxType;
   }
}


보시는 것 처럼 <T extends FruitBox> 이렇게 extends를 사용하여 작성하시면 T로 사용 가능한 클래스는 FruitBox클래스를 상속받고 있는 자식클래스만 사용이 가능하다고 제한을 뜻하는 키워드입니다.

또한 인터페이스도 마찬가지로 extends를 이용하여 작성합니다.


그렇다면 예를 들어 FruitBox클래스를 상속하고 KingBoxInterface인터페이스를 구현한 클래스로 제한을 두고 싶다면 아래와 같이 작성하시면 됩니다.


class Box<T extends FruitBox & KingBoxInterface>
{
   T boxType;
   
   public Box(T boxType){
       this.boxType = boxType;
   }
   public void setItem(T boxType){
       this.boxType = boxType
   }
   public T getItem(){
       return boxType;
   }
}


이렇게 작성하시면 FruitBox클래스를 상속하며 KingBoxInterface 인터페이스를 구현한 클래스로 제한을 둔다는 뜻이 됩니다.




이번에는 자바의 제네릭을 정리해보았습니다. 실제 업무에 제네릭클래스를 이용하여 설계를 할일은 그다지 많지 않다고 합니다. 

하지만 이미 작성되어 있는 제네릭클래스를 사용하기 위해선 꼭 필요하므로 충분한 이해와 숙지가 필요합니다. 그렇기때문에 매우매우 중요하니까 이해가 잘 가지 않는다면 직접 코드를 작성하며 공부하시길 추천드립니다.



728x90
반응형

댓글