[Java] 지네릭 클래스와 지네릭 메서드

Euiyeon Park·2025년 2월 13일

Java

목록 보기
15/16
post-thumbnail

🍀 지네릭(Generic)

  • 자바의 지네릭(Generic)은 코드의 재사용과 타입 안정성을 높이기 위한 기능으로
    클래스나 메서드에서 사용할 데이터 타입을 컴파일 시에 결정할 수 있도록 한다.

1. 지네릭을 사용하면 컴파일 타임에 타입을 체크한다.

  • 컴파일 시 타입을 체크하면 잘못된 타입의 데이터 저장을 방지할 수 있다.
    • 타입 체크 강화
    • 객체의 타입 안정성을 높임
ArrayList<Fruit> fruitList = new ArrayList<Fruit>();	// ⭕ 정상 실행
ArrayList<Fruit> fruitList = new ArrayList<Apple>();	// ❌ 컴파일 에러
  • 💡런타임 에러(ClassCastException)를 최대한 컴파일 타임에 잡아내기 위한 방법을 고안
  • 💡컴파일러에게 더 많은 정보와 타입 정보를 제공해 컴파일 단계에서 오류르 잡는다.

2. 지네릭을 사용하면 형변환(Casting) 번거로움을 줄여준다.

  • 타입을 미리 지정하면, 불필요한 Object타입 사용과 형 변환을 줄일 수 있다.
ArrayList<Integer> list = new ArrayList<Integer>();

list.add(10);
list.add(20);
list.add("30"); 			// ❌String타입 추가 불가 - 타입 안정성을 높임
	
Integer i  = list.get(0);	// ⭕형 변환 생략 가능		
							// ❌Integer i = (Integer)list.get(0);

🍀지네릭 클래스

  • 지네릭 클래스는 클래스 선언 시 타입 매개변수를 지정해 클래스 전체에서 사용 가능하도록 한다.
  • 객체 생성 시 타입을 결정해 타입 안정성을 높일 수 있다.
class 클래스명<T>{
	private T 변수명;
    
    public void set(T 변수명) {...}
    public T get() {...}

지네릭 클래스 선언 방법

class 클래스명 {
	public <T> 반환타입 메서드명(T 매개변수) {...}
}

지네릭 클래스 사용 예제

class Box<T>{
	private T value;
    
    public void setValue(T value){
    	this.value = value;
    }
    
    public T getValue(){
    	return value;
    }
}

public class GenericClassExample{
	public static void main(String[] args){
    	Box<String> strBox = new Box<>();	// T를 String으로 설정
        strBox.setValue("Generic Class");
        
        Box<Integer> intBox = new Box<>();
        intBox.setValue(0519);      
   }
}
  • Box<T>T는 타입 매개변수로, 사용자가 원하는 타입을 지정할 수 있음
  • 객체 생성 시 Box<String>처럼 T의 구체적인 타입을 결정
  • 형 변환이 필요없고, 타입 안정성이 보장

🍀지네릭 메서드

  • 지네릭 메서드는 클래스 전체가 아니라, 특정 메서드에서만 지네릭을 적용할 때 사용한다.
  • 메서드 호출 시 타입을 결정할 수 있어 유연한 코드 작성이 가능하다.

🤍지네릭 메서드 특징

  • <T> 는 메서드 반환 타입 앞에 위치한다.
  • T의 타입은 메서드 호출 시 자동으로 유추된다.
  • 지네릭 메서드는 메서드 내부에서만 타입을 활용해, 클래스 전체에 영향을 주지 않는다.

지네릭 메서드 선언 방법

class 클래스명 {
	public <T> 반환타입 메서드명(T 매개변수) {...}
}

지네릭 메서드 사용 예제

class Utility{
	public static <T> void print(T data){
    	System.out.println("Data: " + data);
    }
}

public class GenericMethodExample{
	public static void main(String[] args){
    	Utility.print("Generic Method");
        Utility.print(100);
        Utility.print(5.19);
   }
}
profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글