본문 바로가기
JAVA

[JAVA] 제네릭 객체 생성 및 사용하기

by 정공자씨 2024. 4. 26.

 

 

 

용어 정리하고 가기

1. Type Parameter (타입 파라미터)
- generic 타입을 명시하기 위한 곳
- 정의된 타입 파라미터가 내부적으로 실제 타입으로 변환
- 예제 : T

2. Type Argument (타입 인수)
- 제네릭 클래스 생성 시에, 사용할 타입을 작성하는 곳
- 예제 : Integer

3. Parameterized Type 
- Type Argument에 의해서 Type Parameter(T)가 치환된 전체 데이터 타입
- 예제 : Age<Integer>

 

 

 

 

제네릭

  • 클래스나 인터페이스명 뒤에 "< >" 부호가 붙고, 그 사이에 타입 파라미터를 넣음 <T>
    • 데이터 타입을 파라미터로 가지는 클래스와 인터페이스를 선언하여 사용할 수 있음
  • 타입 파라미터는 일반적으로 대문자 알파벳 한 글자로 표현함
  • 특정 클래스나 인터페이스를 다양한 타입으로 사용 및 저장할 필요가 있는 경우에 제네릭을 사용하면 편리함
  • 제네릭을 통해 타입을 지정함으로써, 타입 변환(형 변환)을 줄이게 되어 프로그램 성능에 유리

 

 

 

제네릭의 선언과 생성

클래스, 인터페이스 메서드에서 아래와 같은 방법으로 제네릭을 선언할 수 있음

 

1. 제네릭 선언하기

// 클래스에 제네릭 선언하기
class GenericClass <T> {  // T: 타입 파라미터

    T element;

    void setElement(T element) { 
        this.element = element; 
    }

    T getElement() { 
        return element; 
    }
}

 

2. 제네릭 생성하기

클래스명<타입> 참조변수명 = new 클래스명<타입>();

클래스명<타입> 참조변수명 = new 클래스명<>();  // 생성자 다음의 타입은 생략 가능
  • 제네릭 클래스를 생성할 때에 사용할 타입을 명시하면, 정의된 타입 파라미터가 내부적으로 실제 타입으로 변환되어 처리가 됨
  • 클래스 내부에서 사용될 데이터의 타입을 외부에서 지정해 주는 것
  • 타입이 매개변수화 된 것

 

 

 

 

 

제네릭 객체 생성하고 사용하기

1. 제네릭 클래스
2. 제네릭 인터페이스
3. 제네릭 메서드

1. 제네릭 클래스

개념

  • 클래스 선언 시에, 클래스명 오른쪽에 <T>가 선언된 것
class GenericClass <T> { 

}

 

형태

1. 제네릭 클래스 선언

public class 클래스명 <T> { 
	
}

 

2. 제네릭 클래스의 인스턴스 생성

클래스명 <타입> 참조변수명 = new 클래스명<타입>();

클래스명 <타입> 참조변수명 = new 클래스명<>();  // 생성자 다음의 타입은 생략 가능

 

예제 

 

 

 

2. 제너릭 인터페이스

개념

  • 인터페이스 선언 시,인터페이스명 오른쪽에 <T>가 선언된 것
  • 인터페이스를 구현한 클래스에서도 오버라이딩한 메서드를 제네릭 타입에 맞춰서 구현해주어야 함

 

형태

1. 제네릭 인터페이스 선언

public interface 인터페이스명 <T> { 
	
}

 

2. 제네릭 인터페이스를 구현한 클래스

class 클래스명<T> implements 인터페이스명 <T> { 
	
}

 

3. 제네릭 인터페이스를 구현한 클래스의 인스턴스 생성

클래스명 <타입> 참조변수명 = new 클래스명<타입>();

클래스명 <타입> 참조변수명 = new 클래스명<>();  // 생성자 다음의 타입은 생략 가능

 

 

예제

interface Category<T> {
    public void addCategory(T t, int index);
    public T getCategory(int index);
}

// 인터페이스를 구현하는 클래스도 제네릭 타입 맞춰서 구현해야 함
class Animal<T> implements Category<T> { 
    private T[] array;

    public Animal() { // 인스턴스 생성시, array 배열 생성
        array = (T[]) new Object[5];
    }

    @Override
    public void addCategory(T element, int index) {
        array[index] = element;
    }

    @Override
    public T getCategory(int index) {
        return array[index];
    }
}
public class Test {
    public static void main(String[] args) {
        Animal<String> animal = new Animal();

        animal.addCategory("String Type의 강아지", 1);
        animal.addCategory("String Type의 고양이", 2);
        String name = animal.getCategory(2); 
        System.out.println(name);   //String Type의 고양이
    }
}

 

 

 

3. 제너릭 메서드

개념

  • 메서드 선언부에 <T>가 선언된 메서드
  • 직접 메서드에 <T> 제네릭을 설정함으로써, 동적으로 타입을 받아와 사용할 수 있는 독립적으로 사용 가능한 메서드

 

예제

1. 클래스의 타입 파라미터를 가져와서 사용하는 메서드

  • 클래스의 데이터 타입이 정해지면
  • 그 타입으로 해당 메서드들의 리턴 타입과 매개변수의 타입이 정해짐

 

 

2. 독립적으로 타입을 할당하여 운영하는 제네릭 메서드

  • 제네릭 클래스에 정의된 타입 파라미터와 제네릭 메서드에 정의된 타입 파라미터는 별개 

 

 

 

 

 

 

 

출처

 

 

1. Generic 기초

Java는 대표적인 정적 타입 언어입니다. 즉 컴파일 시점에 사용하는 변수의 타입이 결정되며, 따라서 명시적으로 변수의 타입을 지정하거나 추론이 가능해야합니다. 만약 클래스내 일부 변수에

cla9.tistory.com

 

☕ 자바 제네릭(Generics) 개념 & 문법 정복하기

제네릭 (Generics) 이란 자바에서 제네릭(Generics)은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 객체별로 다른 타입의 자료가 저장될 수 있도록 한다. 자바에서 배

inpa.tistory.com