백/Java

[Java] 자바(Java) 제네릭(Generic)이란?

연지양갱 2023. 10. 24. 23:52
728x90
반응형
SMALL

제네릭(Generic)이란?

제네릭이란 클래스나 인터페이스, 메소드를 정의할 때 타입을 파라미터로 활용할 수 있게 하는 프로그래밍 기법입니다.

제네릭을 사용하면 재사용성이 높아지고, 타입 안정성이 향상되며, 명시적인 타입 변환(casting)을 줄일 수 있습니다.

즉 Generic을 사용하기 전에는 처음부터 타입을 정해줘서 변수를 생성합니다.

하지만 재사용성을 높히기 위해 type을 지정해주지 않고 변수를 사용할 때 type을 정할 수 있도록 합니다.

 

제네릭 타입

타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number

출처 : https://st-lab.tistory.com/153

원래 다른 값을 넣어두 되긴 하는데 위 표와 같이 압묵적인 규칙이라구 하네요!

 

제네릭 사용 방법

접근 지정자 class 클래스명<T> {
	// 타입 T를 사용한 코드
}

접근지정자 class 클래스명 < K, V > {
	// 타입 K, V를 사용한 코드
}

호출

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

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

 

 

제네릭(Generic)의 특징

1. 재사용성

제네릭을 사용하면 같은 코드를 다양한 타입에 대해 재사용할 수 있습니다.

예를 들어 List 인터페이스는 List<String>, List<Integer> 등과 같이 다양한 타입의 객체를 저장할 수 있도록 만들어 줍니다.

 

2. 타입 안정성

제네릭을 사용하면 컴파일 시점에 데이터를 타입 검사를 할 수 있으므로 런타임 에러를 줄일 수 있습니다. 예를 들어 List<String>에는 문자열만 추가할 수 있으며, 만약 다른 종류의 객체가 추가되려고 하면 컴파일 에러가 발생합니다.

 

3. 명시적인 형변환 감소

제네릭없이 컬렉션에서 객체를 가져올 때마다 해당 객체의 실제 타입으로 형변환(casting)을 해야합니다. 

하지만 제네릭을 사용하면 이런 작업이 필요 없습니다.

 

4. 제네릭 선언 및 사용

클래스나 인터페이스 선언 시 <T>와 같은 방식으로 제너릭 팔미터(T는 Type의 약자로 관례적으로 많이 사용)를 선언합니다.

 

 

예시 코드

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();

        }

    }

}

출처 : https://www.tcpschool.com/java/java_generic_concept

 

제네릭(Generic)은 자바의 중요한 특징 중 하나로, 코드의 유연성과 재사용성을 높이는 데 크게 기여합니다.

 

 

반응형