hyeonga_code
Java의 신2_Chapter 3_Generic 본문
2024.04.01
-- 메소드 개발과 함께 JUnit 과 같은 테스트 코드를 작성하는 것이 좋다.
- JUnit
-- 메소드나 클래스 같은 작은 단위를 쉽게 테스트 할 수 있도록 도와주는 프레임워크
- 제네릭_Generic
-- 타입 형변환에서 발생할 수 있는 문제점을 사전_컴파일 시 에 없애기 위해 사용된다.
-- 명시적으로 타입을 지정할 때 사용
package base.generic;
import java.io.Serializable;
public class CastingGenericDTO<T> implements Serializable {
private T object;
public void setObject(T obj) {
this.object = obj;
}
public T getObject() {
return object;
}
}
---- T가 아닌 다른 이름을 지정해도 컴파일 시 문제되지 않는다.
---- <> 내에는 현재 존재하는 클래스를 사용해도 되고, 존재하지 않는 것을 사용해도 무관하다.(가상의 타입 이름)
------ 클래스 이름의 명명 규칙과 동일하게 지정하는 것이 좋다.
------ 지정한 이름은 클래스 내에서 하나의 타입 이름처럼 사용할 수 있다.
package base.generic;
public class GenericSample {
public static void main(String[] args) {
GenericSample sample = new GenericSample();
sample.checkGenericDTO();
}
public void checkGenericDTO() {
CastingGenericDTO<String> dto1 = new CastingGenericDTO<String>();
dto1.setObject(new String());
CastingGenericDTO<StringBuffer> dto2 = new CastingGenericDTO<StringBuffer>();
dto2.setObject(new StringBuffer());
CastingGenericDTO<StringBuilder> dto3 = new CastingGenericDTO<StringBuilder>();
dto3.setObject(new StringBuilder());
String str = dto1.getObject();
StringBuffer bf = dto2.getObject();
StringBuilder sb = dto3.getObject();
}
}
---- 제네릭을 사용하면 형변환을 하지 않아도 된다.
---- 제네릭을 사용하지 않은 경우
public class GenericDTO implements Serializable {
private Object object;
public void setObject(Object obj) {
this.object = obj;
}
public Object getObject() {
return object;
}
}
/*
>>>
String str = (String)dto1.getObject();
StringBuffer bf = (StringBuffer)dto2.getObject();
StringBuilder sb = (StringBuilder)dto3.getObject();
*/
-- 제네릭 타입 이름
E // 요소
K // 키
N // 숫자
T // 타입
V // 값
S, U, V // 두 번째, 세 번째, 네 번째 선언된 타입
-- 제네릭 <?>_wildcard 타입
---- 어떤 타입이 되어도 상관없이 호환된다.
---- 메소드 내부에서는 해당 타입을 모르기에 Object로 처리해야 한다.
---- 넘어오는 타입이 정해져 있는 경우 메소드 내에서 instanceof 예약어를 사용하여 해당 타입을 확인하면 된다.
public void wildcartStringMethod(WildcarGeneric<?> c) {
Object value = c.getWildcard();
if(value instanceof String){
// ?가 String인 경우 실행
}
}
---- wildcard는 메소드의 매개변수로만 사용하는 것이 좋다.
---- 와일드 카드로 객체를 선언하는 경우 특정 타입으로 값을 지정하는 것은 불가능하다.
-- < ? extends 클래스이름 >_Bounded Wildcards
---- 클래스를 상속 받은 모든 클래스만 사용이 가능하다.
-- 매개 변수로 사용된 객체에 값을 추가할 수 없으나, 메소드의 반환 타입에 사용하는 경우 값을 할당할 수 있다.
public <T> void genericMethod(WildcardGeneric<T> c. T addValue){
c.setWildcard(addValue);
T value = c.getWildcard();
}
---- 리턴 타입 앞에 제네릭 타입을 선언하고 매개변수에서 사용하는 경우 컴파일 시 문제되지 않는다.
---- 값을 할당할 수 있다.
'Java' 카테고리의 다른 글
Java의 신2_Chapter 5_Collection Set Queue (0) | 2024.04.02 |
---|---|
Java의 신2_Chapter 4_Collection List (0) | 2024.04.02 |
Java의 신2_Chapter 2_ java.lang 패키지 (0) | 2024.04.02 |
Java의 신_Chapter 17_Annotation (0) | 2024.03.29 |
Java의 신_Chapter 16_Nested Class (0) | 2024.03.29 |