[JAVA] Generic
제네릭 타입
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 오버라이딩