본문 바로가기
💾 Backend/자바

💖자바 제네릭💖

by 정람지 2023. 5. 19.

💎제네릭(Generic)💎

데이터의 타입을 일반화하는 것

클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법

필요에 따라 여러 자료형으로 바꿀 수 있게! 어떤 참조 자료형이 아닌 여러 참조 자료형을 사용할 수 있도록!


💎제네릭의 필요성

1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있음.

2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있음

 

+ Object 사용하면?

Object는 모든 클래스의 최상위 클래스이므로 모든 클래스는 Object로 변환할 수 있음.

하지만 하위 클래스로 변환할 때는 직접 형 변환을 해야 하는 단점이 있음.


💎제네릭 쓰기

선언시 클래스 또는 인터페이스 이름 뒤에 “<타입 파라미터>”

+ <> 다이아몬드 연산자

public class 제네릭클래스<T>{

	private T 변수;
    
    public T getter메소드(){
    	return 변수;
    }
    public T setter메소드(T 변){
    	this.변수 = 변;
    }
}

//public interface InterfaceName<T> { ... }
//사용할 때
제네릭클래스<사용하고픈 자료형> 인스턴스명 = new 제네릭클래스<사용하고픈 자료형>();

💎타입 파라미터(자료형 매개변수,제네릭 타입,일반화시킨 타입)

컬렉션의 요소는 객체들만 가능!(int,double,..불가) 

제네릭 클래스 내에서 제네릭 타입의 객체 생성 불가(new 불가)

💎타입 파라미터(자료형 매개변수,제네릭 타입,일반화시킨 타입) 많이 쓰이는 것
T
E : element
K : key
V : value

+💎Static 변수/ 메소드에서

타입 파라미터가 정해지는 순간은 제네릭 클래스의 인스턴스가 생성되는 순간이다.

 Static 변수나 메서드는 인스턴스가 생성되기 이전에 생성되므로 

여기에서 제네릭을 사용할 수 없다.

단 클래스에 제네릭 쓸 때!

메소드 단독으로 쓸 때는 Static 써도 된다.

 

 

+💎제네릭에서 대입된 자료형을 명시하지 않는 경우

컴파일 오류는 아님

하지만 컴파일러가 어떠한 자료형을 사용한 것인지 알 수 없으므로 강제 형변환이 필요

 

+💎여러 개 가능~

< T, V >...

 

+💎제네릭 타입 상속

타입 파라미터는 자식 클래스에도 기술해야 함 (+ 추가적인 타입 파라미터 가능)

 

+💎제너릭 인터페이스

구현한 자식 클래스도 제네릭 타입으로

 

+💎제너릭 배열

제네릭 클래스/인터페이스 타입의 배열 선언 불가

제네릭 타입 배열 선언은 허용


💎<T extends 클래스>  쓰기

T 자료형에 사용할 자료형을 제한함

 

제네릭 클래스에 사용할 자료형의 클래스들을 하나의 추상 클래스(A)에서 상속받게 한 후,

public class 제네릭클래스<T extends A>{
	//코드
}

이러면 A라는 클래스를 상속받지 않은 클래스를 자료형으로 쓸 시(T) 오류 발생

 

+ 원래 제네릭을 사용한 클래스에서는

T를 이용해서 Object 클래스의 멤버밖에 못 썼지만, 

상속 이용 시 A클래스의 멤버도 이용 가능

 

+💎와일드카드 타입

 


💎제네릭 메서드

접근제한자 <자료형 매개변수> 반환형 메서드명(자료형매개변수..){}

이 자료형은 메소드 내에서만 사용


+

 

정적 클래스(Static Class)

정적 클래스는 new 키워드를 사용해서 인스턴스를 만들 수 없음/정적 클래스는 생성자를 포함할 수 없음

정적 클래스의 모든 멤버는 static으로 선언되어야 함

정적 클래스는 객체들이 처음 호출될 때 생성되고 프로그램이 종료될 때 해제됨 - 정적 클래스는 어디서든 접근 가능

 

+

내부(중첩) 클래스

클래스 내부에 선언된 또 다른 클래스

보통 사용자 클래스 자료형이 필요할 때 클래스 내에 선언되어 사용

보통 두 클래스가 서로 긴밀한 관계가 있거나, 하나의 클래스 또는 메소드에서만 사용되는 클래스일 때 이용

 

+

자바7부터

Vector<Integer> v = new Vector<>(); //자동추론!

자바 10부터

var v = new Vector<Integer>(); //자동추론!