Generics_제약

2024. 3. 21. 17:39JAVA

1. 타입 변수에 넣는 타입은, 인스턴스 별로 다르게 대입 가능하다.

ex)

Zoo<Dog> DogArea = new Zoo();

Zoo<Cat> CatArea = new Zoo();

 

- static 멤버에 타입 변수는 사용할 수 없다.

ex>

class Zoo<T> {
	static T animal;	// 에러 발생
    static int compare(T t1, T t2){...}	// 에러 발생
}

왜 그럴까?

타입 변수에 대입하는 타입은 인스턴스 별로 다르게 대입 가능하다고 했다.

static에 타입변수?

 

static에 대해 잠시 복기 해보자.

 

static 키워드

사용 위치 = class, method, field

저장위치 = 클래스(메서드) 메모리 영역

 

클래스 메모리 영역 특징

- 프로그램 실행 시 static 키워드가 사용된 데이터들을 1회 생성하여 클래스 메모리 영역에 저장.

- 어디서든 사용할 수 있음. (공유됨)

 

위의 내용을 바탕으로 결론을 도출해보면,

인스턴스 별 대입 가능 vs 모두가 공용으로 사용 

이 된다.

 

이렇게 될 경우, 인스턴스 별 대입 가능하다는 제약과 기능이 무의미 해지므로, 컴파일 단계에서 static 을 사용하지 못하게 한 것이다.

 

2. 배열 생성 시 타입 변수 사용 불가. 타입 변수로 배열 선언은 가능

ex)

class Box<T>{
	T[] animalArray;
    
    T[] toArray(){
    	T[] tempArray = new T[itemArr.length];	// 에러.
    }
}

new 연산자를 사용하기 위해선, 생성할 인스턴스의 타입이 확정 돼 있어야 한다.

T에는 어떤 타입이 대입될지 불확실하므로 배열 생성 시 사용 불가하다.

 

 

'JAVA' 카테고리의 다른 글

java.lang_Object Class  (0) 2024.04.05
java.lang  (0) 2024.04.04
Generics_제한  (0) 2024.03.21
Optional<T>  (0) 2024.02.23
컬렉션_TreeSet  (0) 2024.02.20