hyeongwoo's blog

[Java] 제네릭 본문

JAVA

[Java] 제네릭

toribro 2024. 2. 12. 20:38

제네릭(Generic)

제네릭은 하나의 값에 여러 데이터 타입을 가질수 있게  만드는 방법이다.  제네릭은 클래스나 메소드에서 사용할 내부 데이 타입을 컴파일시의 미리 지정한다.

제네릭을 사용하면 타입을 유연하게 처리할 수 있으며 컴파일단계에서 타입체크를하여 잘못된 타입을 사전에 방지 할 수 있다. 외부에서 직접 타입을 지정해주기 때문에 코드를 관리하기도 편하다.

ArrayList<String> arr1=new ArrayList<String>();
ArrayList<Integer> arr2=new ArrayList<Integer>();
ArrayList<Double> arr3=new ArrayList<Double>();

자바에서 제공하는 ArrayList 클래스가 여러개의 타입을 갖는 예시이다. 직접 코드를 작성시에 타입을 지정해 줄 수있다.

 

 

아래는 제네릭 클래스 예시 코드이다.

public class Box<T> {
                
	private T[] ob;
	private int size;

	public Box(T[] ob,int size) {
		super();
		this.ob = ob;
		this.size=size;
	}

	public T[] getOb() {
		return ob;
	}

	public void setOb(T[] ob) {
		this.ob = ob;
	}
	
	
	public int getSize() {
		return size;
	}

	public void setSize(int size) {
		this.size = size;
	}
    
    //제네릭 메소드 
	public static <T> Box<T> makeBox(T[] o,int size){
		
		Box<T> box =new Box<T>(o,size);
		box.setOb(o);
		
		return box;
	}
	
}

 

 

 

제네릭 타입 매개변수

  • 위의 클래스 Box<T> 에서 <>안의 T를 타입 매개변수라고 한다. (T가 아닌 다른 문자여도 상관없다.)
  • T는 어떠한 클래스타입도 받아드릴 준비가 되었다는 의미이다.

아래는 타입매개변수에  String,Integer,Double 형 자료형타입을 넣어서 Box객체들을 생성하였다. 단 타입매개변수의  타입은 참조 타입만 들어갈수 있다.

Box<String> box1 =new Box<String>();
Box<Integer> box2 =new Box<Integer>();
Box<Double> box3 =new Box<Double>();

 

 

타입 매개변수의 이름 규칙

  •  한 문자로 이름을 짓는다
  •  대문자로 이름을 짓는다.
타입 설명
<T> Type
<K> Key
<N> Number
<E> Element
<V> Value

<>의 문자는 아무문자나 들어가도 되고 심지어는 한 글자이상의 문자가 들어가도 된다. 하지만 위의 규칙을 지키는것이 관례이다.

 

 

제네릭 클래스의 타입인자 제한

  • 제네릭 타입을 특정 타입으로 제한 시킬수있다.
class Box<T extends Number>{}

제네릭타입을 Number를 상속받은 클래스만 올수 있도록 제한한다.

제네릭 타입 제한이 중요한 이유

public class Box<T extends Number>{
  private T num;

  public Box(T a){
  	 this.num=a;
  }
  
  public int getNum(){
    return this.num.intValue();//숫자형만 허용이 가능
  }


}

위의 코드 처럼 특정 타입의 메소드가 사용될 시 타입을 제한해 주어야한다.

'JAVA' 카테고리의 다른 글

[Java] 접근제한자  (0) 2024.02.13
[Java] 컬렉션  (0) 2024.02.12
[Java] final  (0) 2024.02.10
[Java] IO_(입출력스트림)  (0) 2024.02.02
[Java] None_Static영역과 Static영역  (0) 2024.02.02