[ JAVA ] 제네릭

신범철·2022년 7월 26일
0

자바

목록 보기
16/20
post-custom-banner

면접 질문 유형

Q : 제네릭에 대해 설명해주세요.
A : 자바에서 제네릭은 데이터의 타입을 일반화한다는 것을 의미합니다. 제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법입니다. 이로써 제네릭은 자바의 타입 안정성을 맡고 있습니다. 컴파일 과정에서 타입체크를 해주는 기능으로 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줍니다.

제네릭

일반적인 코드를 작성하고, 이 코드를 다양한 객체에 대하여 재사용하는 프로그래밍 기법이다.
타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 해준다.(실행시에 타입에러가 나는 거보다는 컴파일시에 미리 타입을 강하게 체크해서 에러를 사전에 방지)

public class CastingDTO<T> {
    private T object;

    public void setObject(T object) {
        this.object = object;
    }

    public T getObject() {
        return object;
    }
}

제네릭 타입

  • 선언시 클래스 또는 인터페이스 이름 뒤에 <> 부호가 붙는다.(<> 안에는 클래스와 같이 구체적인 타입을 지정해줘야한다.)
  • <> 사이에는 타입 파라미터가 위치한다.

타입 파라미터란?

타입 파라미터는 제네릭 클래스/인터페이스에 사용되며 타입이 정해지지 않은 파라미터이다.
자바에서는 타입 파라미터는 사용자가 임의로 지정할 수 있으나, 일반적으로 영문 대문자 한글자를 사용한다. 관례적으로 사용하는 제네릭 타입 변수명은 아래와 같다.

  • T : 참조 타입
  • E : 요소
  • K : 키
  • V : 값
  • N : 숫자

사용예제

public class CastingDTO<T> {
    private T object;

    public void setObject(T object) {
        this.object = object;
    }

    public T getObject() {
        return object;
    }
}

public class GenericSample {
    public static void main(String[] args) {
        GenericSample sample = new GenericSample();
        sample.checkCastingDTO();
    }

    public void checkCastingDTO() {
        CastingDTO<String> dto1 = new CastingDTO<>();
        dto1.setObject(new String());

        CastingDTO<StringBuffer> dto2 = new CastingDTO<>();
        dto2.setObject(new StringBuffer());

        CastingDTO<StringBuilder> dto3 = new CastingDTO<>();
        dto3.setObject(new StringBuilder());
    }
}

제네릭 타입 사용 이유

  1. 재사용성 증가
    • 제네릭 타입은 여러 타입의 파라미터를 삽입해 객체를 생성할 수 있기 때문에 코드가 간결하고 재사용성을 높일 수 있다.
  2. 컴파일 시 타입 에러 발견 가능
    • 제네릭 타입의 경우 컴파일시 잘못 사용되는 타입 문제점을 제거하기 위해 강하게 타입 체크를 수행한다. 이 덕분에 컴파일 이후 런타임 단계에서 타입 문제가 발생될 가능성을 방지한다.
  3. 컴파일러가 타입변환 수행
    • 컴파일 단계에서 컴파일러가 타입 캐스팅을 수행해주기 때문에 불필요하게 코드에서 타입 캐스팅을 해줄 필요가 없다.

참고문헌

📗두잇 자바 완전 정복

제네릭 면접 질문

제네릭 기본
제네릭 기본2

제네릭 추가자료

profile
https://github.com/beombu
post-custom-banner

0개의 댓글