이 포스팅은 자바의 신 1,2권의 내용으로 포스팅 되었습니다.
타입체크
를 해주는 기능 public class 클래스명 { ... }
public interface 인터페이스명 { ... }
자바 모든 클래스의 최상위 부모 클래스는 Object 클래스 이므로, 어떤 타입이든 기본 데이터 타입을 객체화 시킨 wrapperType 의 객체를 대입 받을 수 있다.
public class ViewrainDefault {
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
public class Main {
public static void main(String[] args) {
ViewrainDefault vd = new ViewrainDefault();
vd.setObject("제네릭");
String str = vd.getObject();
System.out.println(str);
}
}
위 경우 Main.java 에서 컴파일 에러가 발생한다.
즉 Object 를 구체적인 데이터 타입으로 명시화 해줘야 한다.
ViewrainGeneric.java
public class ViewrainGeneric <T> {
private T t;
public T getObject() {
return t;
}
public void setObject(T t) {
this.t = t;
}
}
public class Main {
public static void main (String[] args) {
ViewrainGeneric<String> vg = new ViewrainGeneric<String>();
vg.setObject("제네릭");
String str = vg.getObject();
System.out.println(str);
}
}
강제 타입변환이 발생하지 않는다.
Generic 이 없다면, 데이터 타입에 맞는 매번 새로운 클래스 또는 메소드를 작성해야 한다.
setObject 메소드를 부른다고 가정할때, 매번 데이터 타입에 맞는 메소드를 구현해야 한다. ㅠ.ㅠ
반복적인 코드 절약, 코드의 재사용성을 높여주는 이점을 취할 수 있어 사용이 용이하다.
import java.io.Serializable;
public class CastingDTO {
private Object object;
public void setObject(Object object){
this.object = object;
}
public Object getObject(){
return object;
}
}
public class GenericSample {
public static void main(String[] ar){
GenericSample ex = new GenericSample();
ex.checkCastingDTO();
}
public void checkCastingDTO(){
CastingDTO dto1 = new CastingDTO();
dto1.setObject(new String());
CastingDTO dto2 = new CastingDTO();
dto2.setObject(new StringBuffer());
CastingDTO dto3 = new CastingDTO();
dto3.setObject(new StringBuilder());
{... 생략 }
String temp1 = (String)dto1.getObject();
StringBuffer temp2 = (StringBuffer)dto2.getObject();
StringBuilder temp3 = (StringBuilder)dto3.getObject();
}
public void checkDTO(CastingDTO dto){
Object tempObject = dto.getObject();
if(tempObject instanceof String){
System.out.println("String dto");
}else if(tempObject instanceof StringBuffer){
System.out.println("StringBuffer dto");
}else if(tempObject instanceof StringBuilder){
System.out.println("StringBuilder dto");
}
}
}
dto1,2,3 객체가 setObject() 를 이용하여 object 값을 설정하고 있음
그러나, temp1,2,3 에 다시 dto1,2,3 을 대입하고 있는데.. 이때는 Object 객체가 String, StringBuffer, StringBuilder 이기 때문에 Cating 을 해줘야 한다.
또한 dto2 가 StringBuffer 인지 Builder 인지 헷갈릴 경우는 어떻게 할것인가..? 매번 instanceOf 를 사용할 수도 없고.. 이럴때 제네릭이 유용하다.
CastingGenericDTO.java
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;
}
}
public class GenericSample2 {
public static void main(String[] ar){
GenericSample2 ex = new GenericSample2();
ex.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 temp1 = dto1.getObject();
StringBuffer temp2 = dto2.getObject();
StringBuilder temp3 = dto3.getObject();
}
}
E : 요소 (Element)
K : 키 (Key)
N : 숫자 (Number)
T : 타입 (Type)
V : 값 (Value)
S,U,V : 두번째, 세번째, 네번째에 선언된 타입
public void wildcardMethod(WildcardGeneric<?> c) {
Object value = c.getWildcard();
System.out.println(value);
}
public void boundedWildcardMethod(WildcardGeneric <? extends Car> c) {
Car value = c.getWildcard();
System.out.println (value);
}
public class GenericWildcardSample {
public static void main(String[] ar){
GenericWildcardSample ex = new GenericWildcardSample();
ex.callGenericMethod();
}
public <T> void genericMethod(WildCardGeneric<T> c, T addValue){
c.setWildCard(addValue);
T value = c.getWildCard();
System.out.println(value);
// Teemo
}
public void callGenericMethod(){
WildCardGeneric<String> wildcard = new WildCardGeneric<String>();
genericMethod(wildcard, "Teemo");
}
}
Refference
https://onsil-thegreenhouse.github.io/programming/java/2018/02/17/java_tutorial_1-21/
https://limkydev.tistory.com/56