ultra_dev
제네릭이란 본문
제네릭
데이터의 타입을 일반화(Generalize)하는 것을 제네릭(Generic)이라고 할 수 있다. 이러한 제네릭은 클래스나 메서드에서 사용할 데이터 타입을 컴파일 시에 미리 지정할 수 있다. 따라서 컴파일 시에 미리 타입 검사(Type Check)를 수행할 수 있다. 클래스나 메소드를 일반화시키는 기법
타입 검사를 컴파일 시에 수행하면 다음과 같은 장점을 얻을 수 있다.
1. 클래스나 메서드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.
3. 타입에 대해 유연성과 안정성을 확보한다.
4. 런타임 환경에 영향을 주지 않는 전처리 기술이다.
JDK 1.5 이전에서는 여러 타입을 사용하는 대부분의 클래스나 메소드에서 인수나 반환값으로 Object 타입을 사용했음
하지만 이 경우에는 반환된 Object 객체를 다시 원하는 타입으로 타입 변환해야 하며, 이때 오류가 발생할 가능성 존재
But 제네릭을 사용하면 컴파일 시에 미리 타입이 정해지므로, 타입 검사나 타입 변환과 같은 번거로운 작업을 생략할 수 있게 됨
제네릭의 제거 시기
자바 코드에서 선언되고 사용된 제네릭 타입은 컴파일 시 컴파일러에 의해 자동으로 검사되어 타입 변환됨
이후 코드 내의 모든 제네릭 타입은 제거되어, 컴파일된 class 파일에는 어떠한 제네릭 타입도 포함되지 않게 됨
이런 식으로 동작하는 이유는 제네릭을 사용하지 않는 코드와의 호환성을 유지하기 위해서임
제네릭의 장점
- 컴파일 시에 타입이 결정되므로 보다 안전한 프로그래밍 가능
- 런타임 타입 충돌 문제 방지
- 개발시 타입 캐스팅 절차 불필요
컬렉션이란?
컬렉션이란 쉽게 말해서 객체들의 모음, 객체들의 컨테이너
컬렉션을 사용하는 가장 큰 이유는 응용프로그램들은 실행 중에 생겨나고 사라지는 객체들의 개수를 예측할 수 없기 때문
고정 크기의 배열을 사용한다면 프로그램 작성에 매우 어려움을 느끼게 됨
하지만 컬렉션은 이런 고정 크기의 배열이 가지는 단점을 극복하고 가변 개수의 객체들을 쉽게 삽입하고, 삭제와 검색을 할 수 있는 가변 크기의 컨테이너
컬렉션 클래스에서 왜 제네릭을 사용하는가
컬렉션은 객체만 저장 가능.
제네릭을 사용하면 형변환이 필요없음
지정한 타입과 다른 타입의 참조변수를 선언하면 컴파일타임에 오류가 발생한다는 것이 중요포인트
만약 오브젝트 타입으로 담아버리면 추후 다시 캐스팅작업이 필요하고 오류 발생 가능성 증가
제네릭을 사용하면 컴파일 시에 미리 타입이 정해지므로, 타입 검사나 타입 변환과 같은 번거로운 작업을 생략할 수 있게 됨
+
static 변수에는 제네릭을 사용할 수 없다.
static 변수는 인스턴스에 종속되지 않는 클래스 변수로써 모든 인스턴스가 공통된 저장공간을 공유하게 되는 변수
static 변수에 제네릭을 사용하려면, GenericArrayList 에서는 Integer 타입으로, GenericArrayList 에서는 String 타입으로 사용될 수 있어야 하는데 하나의 공유변수가, 생성되는 인스턴스에 따라 타입이 바뀐다는 개념 자체가 말이 안되는 것이다.
그래서 static 변수에는 제네릭을 사용할 수 없다.
static 변수는 값 자체가 공유되기 때문이다. 값 자체가 공유되려면 타입에 대한 정보도 있어야 한다.
+
static 메서드에는 제네릭을 사용할 수 있다.
static 메서드의 경우 메서드의 틀만 공유된다고 생각하면 된다. 그리고 그 틀 안에서 지역변수처럼 타입 파라미터가 다양하게 오가는 형태로 사용될 수 있는 것이다.
'Computer Science' 카테고리의 다른 글
parameter vs argument (0) | 2023.03.30 |
---|---|
B-Tree (0) | 2023.03.29 |
MSA(Micro Service Architecture) (0) | 2023.03.29 |
인덱스(INDEX)에 대해 (0) | 2023.03.28 |
DI(Dependency Injection) 의존 관계 주입 (0) | 2023.03.28 |