Language/JAVA

[JAVA] Generic

inji_ 2023. 8. 27. 22:49

제네릭 타입

 

1. 정의

- 제너릭 : 타입을 결정하지 않고 클래스를 설계

- >사용할 때 구체적인 타입을 결정함!

- >결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 제네릭 타입이라고 함.

2. 제네릭 타입 의미

- 하나의 코드를 다양한 타입의 객체에 재사용하는 객체 지향 기법

3. 제네릭 타입의 장점

- 컴파일 할 때 타입을 점검하기 때문에 실행 도중 발생할 오류 사전 방지!

- 우선 아무거나 담게하면 그걸 다시 밖으로 꺼낼 때는 어떤 타입인지 모르게됨.

> 꺼낼 때 type check를 해야함.

> Generic 사용하면 사용할 때 타입에 대한 제한을 걸어 두기에 type check 안해도 됨.

- 제네릭 쓰면 불필요한 타입 변환이 없어서 프로그램 성능 향상된다.

 

cf. 자바 객체지향 원칙

SOLID원칙

SRP,OCP,LSP,DIP,...

SRP -> 객체는 단 하나의 책임만을 가져야 한다.

ex) 계산기에는 계산 기능만 넣어야지 다른 기능 가지면 안됨

OCP -> 확장에는 열려있고, 수정에는 닫혀있어야 한다.

-> 기존 클래스 변경하지 않도록 대상 클래스의 환경을 변경할 수 있도록 설계해야 함.

ex) ArrayList 다 담을 수있게 하면 확장될 때마다 프로그램이 고쳐짐(type에 따라서)

-> OCP 원칙 위반 -> 제네릭 타입을 써야함.

4. 제네릭 타입 선언

- class 클래스 이름<타입 매개변수>{

필드;

메서드;

}

package Chapter09;
 
import java.util.ArrayList;
 
public class GenericClassDemo1{
    public static void main(String[] args){
 
    ArrayList<Vino> arrayListVino = new ArrayList<>(); //이 ArrayList에는 클래스가 Vino인 것만 담을 수 있음.
    arrayListVino.add(new Vino());
 
    ArrayList<Cerveza> arrayListCerveza = new ArrayList<>();
    arrayListCerveza.add(new Cerveza());
 
    Cup<Vino> vinoCup =new Cup();
    vinoCup.setBeverage(new Vino();) //Vino type객체가 매개 변수로 들어가서 Cup class에서 필드로도 선언되고, 메소드로도 선언됨.
    Vino beverage = VinoCup.getBeverage();
    //VinoCup.getBeverage();가 어떤 변수에 담기는 지 알아보려면 ctrl+alt+v -> Vino 타입이 되는 것을 알 수 있다.
    //Cup 클래스 안에 들어갔지만 제네릭으로 받아졌기 때문에 Vino의 원래 type을 그대로 수용받아서 Cup class안에서 Vino type으로 사용될 수 있다.
 
    Cup<Cerveza> cervezaCup = new Cup();
    cervezaCup.setBeverage(new Cerveza());// 마찮가지로 Cerveza 타입의 객체로 Cup Class의 매개변수로 들어갈 수 있음.
    //Cup class는 받는 매개변수에 따라서 그 type에 맞춰줄 수 있는 프로페셔널..!

   }
}
class Beverage{}
class Vino extends Beverage{}
class Cerveza extends Beverage{}
/*제네릭 타입 선언*/
class Cup<T>{
    //선언할 때는 type상관없이 다 담을 수 있음
    /*필드 선언*/
    private T beverage;
    /*생성자 선언*/
 
    /*메소드 선언*/
    public T getBeverage(){return beverage;}
    public void setBeverage(T beverage) {this.beverage =beverage;}
 
}

5. 제네릭 상속 및 타입 한정

6. 제네릭 메서드

<타입매개변수> 반환타입 메서드 이름(...){

}

-메서드 선언 부에 적은 제테릭으로 리턴 타입, 파라미터 타입이 정해지는 메소드

cf.

객체가 같은 건지 비교하세요-> equals 오버라이딩

객체의 내부에 정의된 값(필드 값)비교-> compareTO 오버라이딩