generic

nero·2023년 3월 2일
0

Java-Basics

목록 보기
4/4

제네릭이란?

컴파일 타임에 타입을 체크함으로 써 코드의 안정성을 높여주는 기능

List<T>  -> List<String>

제네릭 미사용

// 제네릭 미사용
List list = new ArrayList<>();
list.add("test");

String str = (String)list.get(0); 

// 제네릭 사용
List<String> list = new ArrayList<>();

list.add("test");
list.add(1); //Complie Error

왜 제네릭을 사용해야 하는가


  • Java 5부터 추가된 타입으로 컴퍼일 과정에서 잘못된 타입 사용을 제거
  • 컬렉션, 람다식, 스트림, NIO 사용

이점

  • 컴파일 시 강한 타입 쳌크를 할 수 있다.

    • 자바 컴파일러는 제네릭 코드에 대해 강한 타입 체크를 함 → 잘못 사용된 타입 문제점 제거
    • 컴파일시에 체크하여 사전에 방지
  • 타입변환(Casting)을 제거한다

    • 불필요한 타입 변환은 프로그램 성능 저하 요인
    • 타입 강제하여 요소 찾아올때 타입변환을 미리 차단

배열과 제네릭의 차이 ?

List<Object> obj = new ArrayList<Integer>(); ???

//배열
Object[] obj = new Integer[1];   // 공변

//제네릭
List<Object> obj = new ArrayList<Integer>(); // error 무공변
  • 배열은 Object로 변환이 가능하나 제네릭은 컴파일 에러를 일으킨다. 그이유는 바로 공변과 무공변의 차이이다.

제네릭 타입


제네릭 타입이란 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.

// 타입 파라미터 T
public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}

// 비제네릭
class Category {
	private Object object;

	public void set(Object object){
		this.object = object;	
	}

}

// 제너릭
class Category<T> {
	private T t;

	public void set(T t) {
		this.t =t ;
	}
}
  • Object 타입을 사용하면 모든 종류의 자바 객체를 저장할 수 있으나 타입변환 빈번 이를 방지하는 것이 제네릭 타입
  • 타입 파라미터는 변경되어 재구성됨
  • 제네릭은 클래스를 설계할 때 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체했다가 실제 클래스가 사용될 때 구체적인 타입을 지정함으로써 타입 변환을 최소화 시킨다.

제네릭 메소드


제네릭 메소드는 아규먼트, 리턴타입으로 타입 파라미터를 갖는 메소드를 말한다

호출 방법 2

  • 명시적 지정
  • 컴파일러가 타입 추정
pubic <T> Box<T> boxting(T t){...}

참고

profile
겸손하게 배우는 개발자입니다

0개의 댓글