제네릭이란?
- 어떤 값이 하나의 참조 자료형이 아닌 여러 참조 자료형을 사용할 수 있도록 프로그래밍 하는 것을 '제네릭(Generic) 프로그래밍' 이라고 한다.
- 제네릭 프로그램은 참조 자료형이 변환될 때 이에 대한 검증을 컴파일러가 하므로 안정적
- 여러 참조 자료형이 쓰일 수 있는 곳에 특정한 자료형을 지정하지 않고 클래스나 메서드를 정의한 후 사용하는 시점에 어떤 자료형을 사용할 것인지 지정하는 방식
제네릭의 필요성
- 자료형 별로 메소드를 만들면 코드의 효율성이 떨어진다. 그래서 Object로 세팅을 하게 되면 변환 시 Object가 되기 때문에 반드시 형변환을 해야 하는 번거로움이 생긴다. 이럴때 사용시점에 자료형을 지정하는 제네릭 방식을 사용한다.
- 자바의 컬렉션프레임워크에는 어떤 자료형이라도 담을 수 있다. 하지만 사용하다 보니 반복문으로 동일 자료형의 연산을 하거나, 클래스의 메소드를 호출하는 것이 쉽지 않다.(instanceof로 확인 casting 해야 하는 불편함)
- 그래서 컬렉션 프레임워크(set, List, Map)에는 담을 자료형을 한가지로 한정해서 담는 것이 좋다.
ㅇ 제네릭 클래스 정의하기
- 다이아몬드 연산자<> : ArrayList 옆에 붙어서 <> 안에 자료형을 명시한다. 자료형 선언 후 생성 시에는 생략 가능
- ArrayList<String> list = new ArrayList<>( );
- 자료형 매개변수 T와 static : T의 자료형이 정해지는 순간 제네릭 클래스의 인스턴스가 생성되는 순간, 따라서 T의 자료형이 결정되는 시점보다 빠르기 때문에 static 변수의 자료형이나 static 메서드 내부 변수의 자료형으로 T를 사용할 수 없다.
ㅇ 제네릭 메서드 활용하기
- public <자료형 매개변수> 반환형 메서드이름 (자료형 매개변수 …) { }
==> 다양한 종류를 담을 수 있지만, 가져와서 반복문으로 뽑아서 처리하기 힘들다 보니 가급적이면 하나의 형태만 담는 걸 권장한다. 제네릭
제네릭 에러 발생 예제
ArrayList<Person> list = new ArrayList<Person>();
- 리스트에 담는 타입을 Person(클래스)만 담을 수 있다.
- 이제 다른 형태는 담을 수 없다.
- 만약 다른 형을 담으려고 하면 아래와 같은 오류 메시지가 나온다.
ListTest04.java:31: error: no suitable method found for add(String)
list.add("Kate");
^
method Collection.add(Person) is not applicable
(argument mismatch; String cannot be converted to Person)
method List.add(Person) is not applicable
(argument mismatch; String cannot be converted to Person)
method AbstractCollection.add(Person) is not applicable
(argument mismatch; String cannot be converted to Person)
method AbstractList.add(Person) is not applicable
(argument mismatch; String cannot be converted to Person)
method ArrayList.add(Person) is not applicable
(argument mismatch; String cannot be converted to Person)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get
full output
1 error
다양한 형태의 값을 리스트배열에 담으면 아래와 같은 노트가 나온다
Note: ListTest03.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
- double은 기본 자료형
- Double은 기본자료형 double 객체로 만들어 주는 클래스 Wrapper 클래스
- Wrapper 클래스는 기본자료형 8개 만큼 가진다.
- 컬렉션프레임 워크는 기본자료형을 상대하지 않고, 객체를 상대한다.
list.add(5); // 자동 포장한다. new Integer(5) auto Boxing
'Java | spring > Java Basic' 카테고리의 다른 글
JAVA Exception 예외 처리 (0) | 2019.05.08 |
---|---|
자료구조, Stack 스택과 큐 Queue (0) | 2019.05.07 |
배열과 컬렉션프레임워크(List, set, map)의 차이 (0) | 2019.05.07 |
JAVA 자바, Wrapper 클래스 (0) | 2019.05.07 |
JAVA 기본 클래스(Object, toString, equals 등) (0) | 2019.05.07 |
댓글