쿠쿠의기록

제네릭 클래스 (generic class)에 사용법(간결하게!) 본문

개발에 대한 기본 지식/쿠쉬쿠쉬블로깅

제네릭 클래스 (generic class)에 사용법(간결하게!)

쿠쿠트레인 2023. 6. 9. 11:01

제네릭(generic) 이란?

=> 자바에서 제네릭(generic)이란 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미

: 제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다

 

장점 (컴파일 시에 미리 타입 검사(type check)를 수행 시)

1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다

2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다

 

JDK 1.5 이전 - 여러 타입을 사용하는 대부분의 클래스나 메소드에서 인수나 반환값으로 Object 타입을 사용

=> 하지만 반환된 Object 객체를 다시 원하는 타입으로 타입 변환해야 하며, 이때 오류가 발생할 가능성도 존재

 

sol) JDK 1.5부터 도입된 제네릭 사용하여 컴파일 시(타입 지정), 타입 검사나 변환과 같은 작업을 생략할 수 있게 됨

 

제너릭 선언 및 생성

##선언##
class MyArray<T> {
    T element;
    void setElement(T element) { this.element = element; }
    T getElement() { return element; }
}

=> 'T'를 타입 변수, 임의의 참조형 타입 의미, 다른 문자 사용 가능, 여러 개일 경우 쉼표(,)로 구분

=> 클래스에서뿐만 아니라 메소드의 매개변수나 반환값으로 사용 가능

##생성
MyArray<Integer> myArr = new MyArray<Integer>();

##인스턴스 생성 시 타입 생략 가능
MyArray<Integer> myArr = new MyArray<>(); // Java SE 7부터 가능함.

=> Integer 타입 사용하는 예제
=> 제네릭 클래스 생성 시 실제 타입 명시 (정의된 타입 변수 => 실제 타입 변환 처리)

 

제네릭 예제

import java.util.*;

class LandAnimal { public void crying() { System.out.println("육지동물"); } }
class Cat extends LandAnimal { public void crying() { System.out.println("냐옹냐옹"); } }
class Dog extends LandAnimal { public void crying() { System.out.println("멍멍"); } }
class Sparrow { public void crying() { System.out.println("짹짹"); } }

class AnimalList<T> {
    ArrayList<T> al = new ArrayList<T>();

    void add(T animal) { al.add(animal); }
    T get(int index) { return al.get(index); }
    boolean remove(T animal) { return al.remove(animal); }
    int size() { return al.size(); }
}

public class Generic01 {
    public static void main(String[] args) {
        AnimalList<LandAnimal> landAnimal = new AnimalList<>(); // Java SE 7부터 생략가능함.

        landAnimal.add(new LandAnimal());
        landAnimal.add(new Cat());
        landAnimal.add(new Dog());
        // landAnimal.add(new Sparrow()); // 오류가 발생함.

        for (int i = 0; i < landAnimal.size() ; i++) {
            landAnimal.get(i).crying();
        }
    }
}
##실행 결과

#육지동물
#냐옹냐옹
#멍멍

=> Cat, Dog 클래스 LandAnimal 클래스 상속 클래스 : AnimalList<LandAnimal>에 추가 가능

=> Sparrow 클래스 타입 다름 (추가 불가능)

 

출처 : http://tcpschool.com/java/java_generic_concept