본문 바로가기
Java

[Java] 제네릭 (Generic)

by 스응 2023. 2. 17.
728x90
728x90

제네릭 프로그래밍

  - 다양한 자료형이 적용될 수 있는 클래스를 만드는 것

  - 선언 시 클래스의 자료형을 명시하지 않음

      → 추후 해당 클래스를 인스턴스화(new)할 때 자료형이 정해짐 (.class 파일도 이 시점에 생성됨)

      ⇒ 변수의 이름과 기능이 동일하면서, 자료형만 달라지는 변수들을 사용할 때 고려

  - 컬렉션 프레임워크에서 많이 사용됨

      : 알고리즘을 활용해서 보다 빠르게 자료 구조를 검색하고, 데이터를 삽입할 수 있는 프레임워크

 

#  장점

  - 인스턴스화할 때, 다이아몬드 연산자(< >) 사이에 자료형을 명시함

      → 가독성을 높임

  - 자료형을 잘못 사용했을 때, 컴파일 시점 오류가 발생함

      → 자료형의 변환이 컴파일러에 의해 검증되므로, 안정성이 높음

  - java 파일의 수를 줄일 수 있음

      ex) double result, int result, float result

            이 세 가지 변수를 생성하려면 a.java, b.java, c.java 각 파일로 따로 만들어야 함

            → 제네릭을 사용하면 파일 하나로 생성할 수 있음

  - 메서드의 반환 자료형에 제네릭을 넣으면, 하나의 메서드만 만들어도

    상황에 따라 다른 자료형을 리턴할 수 있게 됨

 

Object 클래스를 사용할 때와 비교

  - 최상위 클래스 Object를 사용하는 경우에도 제네릭과 비슷한 효과가 있음

     (다형성을 이용하여 Object 타입으로 바라봄)

      → 그러나, 이 방법을 사용하면 하위 클래스의 메서드/멤버변수를 호출할 때마다

           다운 캐스팅을 해야 하기 때문에 번거로움

 

 


제네릭 프로그래밍 방법

// 클래스 파일 : 선언 방법 //

public class 클래스명<T> {  // T : 대체문자

    // 제네릭 자료형 선언  :: T 자료형으로 선언한 변수
    private T 변수명;

    // 제네릭 메서드 정의  :: T 자료형을 반환하는 메서드
    public T 메서드명(매개변수) {
        ...
    }

    // 제네릭 메서드 정의 2  :: T 자료형 변수를 매개변수로 받는 메서드
    public 반환자료형 메서드명(T 변수) { 
        ...
    }

} // end of class

-----------------------------------------
// 메인 함수 파일 : 사용 방법 //

public static void main(String[] args) {

    // 사용할 자료형 인스턴스화
    자료형a 참조변수a = new 자료형a();

    // 제네릭 인스턴스화
    클래스명<자료형a> 참조변수 = new 클래스명<>();
    
    // 다운 캐스팅을 하지 않아도 자료형a로 사용할 수 있음

} // end of main

#  <대체문자>

  - 아무 문자를 사용해도 문제가 발생하지 않으나, 가급적 의미가 있는 약자로 사용하는 것이 좋음 

T E K V
Type Element Key Value

 

특정 클래스를 상속받은 자식 클래스만 허용

// 클래스 파일의 선언부 //

public class 클래스명<T extends 부모클래스> {
    // 그 외 문법은 동일함

 

  - 상속을 이용하여 T 자료형의 범위를 제한할 수 있음

      → 부모 클래스를 상속받지 않은 클래스가 제네릭 자료형으로 접근하려고 하면 컴파일 오류

  - 부모 클래스는 추상 메서드로 구현

 

320x100
반응형

'Java' 카테고리의 다른 글

[Java] 자료 구조  (0) 2023.02.21
[Java] 쓰레드 (Thread)  (0) 2023.02.19
[Java Swing] 메서드 및 함수 모음  (1) 2023.02.17
[Java Swing] 이벤트 리스너 (Event Listener)  (0) 2023.02.17
[Java] 내부 클래스와 익명 클래스  (0) 2023.02.16

댓글