제네릭
제네릭(Generic)은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. < > 안에 타입변수 또는 타입매개변수를 넣어서 지정해준다
위의 그림은 아래의 코드를 간략화한 것이다. p1.info와 p2.info의 데이터 타입은 결과적으로 아래와 같다.
p1.info : String
p2.info : StringBuilder
그것은 각각의 인스턴스를 생성할 때 사용한 <> 사이에 어떤 데이터 타입을 사용했느냐에 달려있다.
복수의 제네릭
복수의 제네릭을 사용할 때는 <T, S>와 같은 형식을 사용한다. 여기서 T와 S 대신 어떠한 문자를 사용해도 된다. 하지만 묵시적인 약속이 있기는 하다. 제네릭은 기본 데이터 타입에서는 사용할 수 없고, 참조 데이터 타입에 대해서만 사용할 수 있다.
new Integer는 기본 데이터 타입인 int를 참조 데이터 타입으로 변환해주는 역할을 한다. 이러한 클래스를 래퍼(wrapper) 클래스라고 한다.
제너릭은 데이터 타입을 알고있으면 생략 가능하며 메소드에도 적용할 수 있다. 또한 제네릭으로 올 수 있는 데이터 타입을 특정 클래스의 자식으로 제한할 수 있다. 위와 같이 상속뿐 아니라 인터페이스(구현)관계에서도 사용할 수 있다.
제네릭의 장점
- 객체 타입의 안정성을 제공한다
- 타입 체크와 형변환을 생략할 수 있으므로 코드가 간결해진다. (타입을 지정해줌으로써 형 변환 예외인 ClassCastException 방지가능)
Arraylist
배열은 불편한점 중에 한가지가 한번 정해진 배열의 크기를 변경할 수 없다는 점이다. 이러한 불편함을 컬렉션즈 프레임워크를 사용하면 줄어든다. 그중 하나인 arraylist이다.
위의 예제는 배열을 사용하는 기존예제였고, 밑에 예제가 arraylist를 이용한 예제이다. 배열의 크기에 지정할 필요없이 추가하는대로 배열을 생성할 수 있다. 배열의 경우 값의 개수를 구할 때 .length를 사용했지만 ArrayList는 메소드 size를 사용한다. 또한, 특정한 값을 가져올 때 배열은 [인덱스 번호]를 사용했지만 컬렉션은 .get(인덱스 번호)를 사용한다. 배열리스트를 사용할 때 몇가지 주의할 점이 있다.
위의 예제는 컴파일 오류가 발생한다. ArrayList의 메소드 add의 입장에서는 인자로 어떤 형태의 값이 올지 알 수 없다. 그렇기 때문에 모든 데이터 타입의 조상인 Object 형식으로 데이터를 받고 있다. (쉽게 설명하면 배열리스트의 데이터 타입은 오브젝트이다 예를들면 아래와 같은 모습일 것이다.)
ArrayList 내에서 add를 통해서 입력된 값은 Object의 데이터 타입을 가지고 있고, get을 이용해서 이를 꺼내도 Object의 데이터 타입을 가지고 있게 된다. 따라서 원하는 데이터 타입으로 형변환을 해줘야 한다. (String)으로 강제로 형변환을 할 수도 있지만 이제는 타입의 안정성을 위해 제네릭을 활용할 수도 있다.
제네릭을 사용하면 ArrayList 내에서 사용할 데이터 타입을 인스턴스를 생성할 때 지정할 수 있기 때문에 데이터를 꺼낼 때(String val = al.get(i);) 형변환을 하지 않아도 된다.
'Java' 카테고리의 다른 글
Java 기초 입문 10일차 (Collections Framework, Iterator, Map) (0) | 2022.12.07 |
---|---|
Java 이클립스 (eclipse) 단축키 모음 (0) | 2022.12.07 |
Java 기초 입문 8일차 (Object, enum, 참조) (0) | 2022.11.27 |
Java 기초 입문 7일차 (예외처리 throws, checked, unchecked) (0) | 2022.11.24 |
Java 기초 입문 6일차 (Interface, 다형성, Exception, multi catch) (0) | 2022.11.23 |