파라미터화된 타입(Parameterized Type)과 원시 타입(Raw Type)은 제네릭(Generics)과 관련된 두 가지 개념입니다. 이 두 개념은 제네릭 타입을 사용할 때 중요한 차이를 나타냅니다.
파라미터화된 타입 (Parameterized Type)
파라미터화된 타입은 제네릭을 사용하여 정의된 클래스, 인터페이스, 또는 메서드에 구체적인 타입 매개변수를 지정한 타입을 말합니다. 제네릭 타입은 여러 타입을 처리할 수 있도록 일반화되어 있으며, 파라미터화된 타입을 통해 제네릭 클래스나 메서드의 타입 매개변수를 특정 타입으로 지정할 수 있습니다.
예시:
class Box<T> { // 제네릭 클래스 정의
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
Box<String> stringBox = new Box<>(); // 파라미터화된 타입 사용
stringBox.setItem("Hello");
String value = stringBox.getItem();
위 예시에서 Box<T>
는 제네릭 클래스이고, Box<String>
은 이 제네릭 클래스를 파라미터화한 타입입니다. stringBox
객체는 String
타입의 데이터를 처리하도록 파라미터화되었습니다.
원시 타입 (Raw Type)
원시 타입(Raw Type)은 제네릭 클래스나 인터페이스에서 타입 매개변수를 명시하지 않고 사용하는 타입을 말합니다. 즉, 제네릭이 도입되기 전의 방식으로 제네릭 클래스를 사용하는 것을 의미합니다. 원시 타입을 사용할 때는 타입 매개변수가 없는 상태로 제네릭 타입을 사용할 수 있습니다.
예시:
Box rawBox = new Box(); // 원시 타입 사용
rawBox.setItem("Hello");
Object value = rawBox.getItem();
위 예시에서 Box
는 타입 매개변수가 지정되지 않은 원시 타입입니다. 원시 타입을 사용하면 타입 안전성이 보장되지 않으며, 컴파일러는 타입 관련 오류를 잡아낼 수 없습니다. 예를 들어, 원시 타입으로 사용된 Box
는 Object
를 반환하며, 내부적으로 어떤 타입이 들어갔는지 알 수 없습니다.
파라미터화된 타입과 원시 타입의 차이점
- 타입 안전성:
- 파라미터화된 타입: 제네릭 타입 매개변수를 지정함으로써 컴파일 시에 타입을 검사할 수 있어 타입 안전성을 제공합니다. 잘못된 타입이 사용될 경우 컴파일 오류가 발생합니다.
- 원시 타입: 타입 매개변수가 지정되지 않기 때문에, 컴파일러가 타입 안전성을 보장할 수 없습니다. 런타임에 타입 관련 오류가 발생할 가능성이 있습니다.
- 호환성:
- 파라미터화된 타입: 제네릭이 도입된 이후의 방식으로, 현대 자바 코딩에서 권장됩니다.
- 원시 타입: 제네릭이 도입되기 전의 코드를 호환하기 위해 존재합니다. 구 버전의 자바 코드와의 호환성을 위해 사용할 수 있지만, 새 코드에서 사용하는 것은 피해야 합니다.
- 타입 추론:
- 파라미터화된 타입: 타입 추론이 가능하여, 컴파일러가 타입을 명확하게 이해하고 처리할 수 있습니다.
- 원시 타입: 타입 추론이 불가능하며, 모든 것이
Object
로 처리되므로 제네릭 타입의 이점을 잃게 됩니다.
결론
- 파라미터화된 타입은 제네릭을 사용할 때 구체적인 타입 매개변수를 지정하여 타입 안전성과 코드의 재사용성을 높이는 현대적인 자바 프로그래밍 방식입니다.
- 원시 타입은 타입 매개변수가 없는 상태로 제네릭 타입을 사용하는 구 버전 방식으로, 주로 구 버전 코드와의 호환성을 위해 존재하지만, 타입 안전성이 떨어지므로 사용을 피하는 것이 좋습니다.
자바에서는 가능한 한 파라미터화된 타입을 사용하여 코드의 안전성과 유지보수성을 높이는 것이 권장됩니다.
'Java Study' 카테고리의 다른 글
Shallow copy와 Deep copy (0) | 2024.09.19 |
---|---|
어그리게이션(Aggregation)과 컴포지션(Composition) (0) | 2024.08.21 |
제네릭 타입 매개변수(T)와 와일드카드(?)의 역할 (0) | 2024.08.19 |
바운딩과 와일드카드의 차이 (0) | 2024.08.19 |
List와 ArrayList (0) | 2024.08.16 |