Generics

지네릭스란(Generics)란?

  • 다양한 타입의 객체를 다루는 메서드, 컬렉션에 객체를 제한하는 기능
  • 특정 메서드나 컬렉션에 들어가는 자료형을 제한하는 것이다.

지네릭스의 필요성

  • String 객체만 들어가길 원하는 ArrayList가 있다고 가정 시 여러가지 문제점 있다.
public static void main(String[] args){
	List strList = new ArrayList();
}

 

  • 컴파일러가 실행(런타임) 전에 확인할 때는 문제가 없다고 했지만, 런타임 시 다음과 같이 에러 발생
public static void main(String[] args) {
        List strList = new ArrayList();
        strList.add(10);
        String s1 = (String)strList.get(0);
        System.out.println(s1);
    }

 

3가지 문제점?

  1. 문자열이 아닌 정수형이 추가된다.
  2. 정수형 타입은 문자열로 형변환 연사자를 사용하여 형변환을 할 수 없다
  3. 실제 런타임 시 데이터가 들어가기에 컴파일러가 잡아내지 못한다.

지네릭스 사용

// <> 안에 자료타입 입력 시 해당 자료타입만 해당 컬렉션이 담을 수 있게 된다.
public static void main(String[] args){
	List<String> strList = new ArrayList<>();
}
  • 다음과 같이 지네릭스를 활용하니 지정한 타입 외에는 컴파일 시점에서 체크해 줄 수 있기에 프로그램에 신뢰성과 안정성을 확보할 수 있다.

지네릭스와 다형성

  • 다음과 같이 클래스의 상속관계가 형성되어 있다고 가정해보면, 최상위 클래스인 Animal타입으로 지네릭스를 지정하면 Animal만 컬렉션에 담을 수 있을까?|
    → 정답은 상속관계에 있는 3개 클래스의 모든 객체를 저장할 수 있다.
class Animal{}
class Bird extends Animal{}
class Sparrow extends Bird{}
class Eagle extends Bird{}

public class Generic {
    public static void main(String[] args) {
        List<Animal> animals = new ArrayList<>();
        animals.add(new Sparrow());
        animals.add(new Eagle());
        animals.add(new Bird());
        animals.add(new Animal());

        for (Animal animal : animals) {
            System.out.println(animal.getClass().getName());
        }
    }
}

//========= 결과 ===========
Sparrow
Eagle
Bird
Animal

지네릭스 클래스

  • 클래스 명 옆에 지네릭스를 붙여서 선언한 클래스를 지네릭 클래스라 한다.
  • 클래스 내부적으로 지네릭스가 사용되는 클래스이다.
  • 지네릭스에 들어가는 자리의 변수를 타입변수, 타입 매개변수라 한다.
  • 타입변수로서 들어간 문자는 타입 문자라 한다.(=문자는 어떤 것을 넣어도 상관 X)
    • <T>는 타입 변수로 객체 생성 시 해당 객체에 어느 자료형이든 저장 가능하단 뜻
  • 원시타입은 일반 클래스를 의미한다.
class Box<T> {
    ArrayList<T> list = new ArrayList<>();
    
    void add (T item) { list.add(item); }
    T get(int i){ return list.get(i); }
}

public class Generic {
    public static void main(String[] args) {
        Box<String> box = new Box<>();
    }
}

------------------------------------------------------------------

class Box {
    ArrayList<String> list = new ArrayList<>();
    
    void add (String item) { list.add(item); }
    String get(int i){ return list.get(i); }
}
  • 실제 타입변수에는 객체가 생성 시 타입이 지정된다.
  • 객체 생성 시 지정된 타입은 타입문자가 있는 부분들을 대체하여 채워진다

참고자료

지네릭스(Generics) - 지네릭 소개, 지네릭 클래스 :: 컴퓨터 공부하는 블로그 (tistory.com)

 

지네릭스(Generics) - 지네릭 소개, 지네릭 클래스

지네릭스란(Generics)란? 다양한 타입의 객체를 다루는 메서드, 컬렉션에 입력 가능한 객체를 제한하게 하는 기능이다. 좀 더 직관적으로 쓰자면 특정 메서드나 컬렉션에 들어가는 자료형을 제한

sgcomputer.tistory.com

 

'P.L > Java' 카테고리의 다른 글

컬렉션 프레임워크(List, Set, Map)  (0) 2023.05.11
열거형(enums)  (0) 2023.03.26
유용한 배열 사용 - java.util.Arrays 클래스  (0) 2023.02.08
예외처리(Exception handling)  (0) 2023.02.01
java.lang.Character 클래스  (0) 2023.01.28