[JAVA] 정리/클래스(Class)_타입(Type)

제네릭 클래스(Generic)

쎈코 2023. 2. 23. 00:50

public class Ex69_Generic {

public static void main(String[] args) {

//Ex69_Generic.java

클래스 종류
1. 클래스
2. 인터페이스
3. 추상 클래스
4. enum
5. 제네릭 클래스


제네릭, Gnenric        <T>   <>안에 자료형을 넣어줄땐 첫글자를 꼭 대문자로 설정해야 함. 값형을 넣는게 아니기 때

: 클래스, 메소드에서 사용할 데이터 타입을 나중에 확정하는 기법
1. 제네릭 클래스 > 0
2. 제네릭 메소드



요구사항] 클래스 설계

1. 멤버 변수 선언 > int
2. 멤버 변수를 중심으로 여러가지 행동을 하는 메소드 선언

추가사항 1] String 중심으로 하는 똑같은 클래스를 추가 설계
추가사항 2] boolean 중심으로 하는 똑같은 클래스를 추가 설계
추가사항 3] double 중심으로 하는 똑같은 클래스를 추가 설계
추가사항 4] byte 중심으로 하는 똑같은 클래스를 추가 설계
추가사항 5] Calendar 중심으로 하는 똑같은 클래스를 추가 설계
추가사항 6] Scanner 중심으로 하는 똑같은 클래스를 추가 설계
...
무한대 클래스

 

 

 

요구사항]
WrapperInt n1 = new WrapperInt(10);                          //WrapperInt 클래스 n1에 10을 넣음

System.out.println(n1.getData());                                 //10
System.out.println(n1.getData() * 2);                           //20
System.out.println(n1.toString());                                 //data = 10
System.out.println();


WrapperObject n2 = new WrapperObject(20);             //Object 클래스에 20을 넣음

System.out.println(n2.getData());                                 //20
System.out.println((int)n2.getData() * 2);                     //그냥하면 에러. integer로 다운캐스팅 필요 
//지금처럼 명확히 기억하고 있으면 큰 문제는 없지만 다운캐스팅 할 값을 잊으면 문제
System.out.println(n2.toString());                                  //data = 20
System.out.println();

 

 

매번 이렇게 클래스나 메소드에 들어가는 자료형을 기억하고 있으면 문제가 되지 않지만, 상황 따라 다르게 넣어야 할 때도 있음. 그럴때 쓰는게 Generic <>

 



Wrapper<Integer> n3 = new Wrapper<Integer>(30);  //클래스나 메소드에 들어갈 자료형을 객체생성 시 설정
System.out.println(n3.getData());                                 //30
System.out.println(n3.getData() * 2);                           //60. 다운캐스팅 없이 바로 int로 꺼낼 수 있음
System.out.println();

 

 

추가사항 1
WrapperString s1 = new WrapperString("홍길동");

System.out.println(s1.getData());
System.out.println(s1.getData().length());
System.out.println(s1.toString());
System.out.println();


WrapperObject s2 = new WrapperObject("아무개");

System.out.println(s2.getData());
// System.out.println(s2.getData().length()); //.length 불가능. 문자열 그자체로 들어있는게 아니기 때문
System.out.println(((String)s2.getData()).length());  //String으로 다운캐스팅 해줘야함
System.out.println(s2.toString());
System.out.println();



Wrapper<String> s3 = new Wrapper<String>("이클립스");         // 이 객체가 가져온 클래스의 자료형을 String으로 설정
System.out.println(s3.getData());
System.out.println(s3.getData().length());
System.out.println(s3.toString());
System.out.println();

 

 

추가사항 2
WrapperBoolean b1 = new WrapperBoolean(true);

System.out.println(b1.getData());
System.out.println(b1.getData() ? "참" : "거짓");
System.out.println(b1.toString());
System.out.println();


WrapperObject b2 = new WrapperObject(false);

System.out.println(b2.getData());
System.out.println((boolean)b2.getData() ? "참" : "거짓");
System.out.println(b2.toString());
System.out.println();


Wrapper<Boolean> b3 = new Wrapper<Boolean>(true);

System.out.println(b3.getData());
System.out.println(b3.getData() ? "참" : "거짓");
System.out.println();

 

 

 

 

class Wrapper<T>{

private T data;

public Wrapper(T data) {              인자리스트에 들어올 값이 어떤 자료형인지 알 수 없음
this.setData(data); 
}

public T getData() {
return data;
}

public void setData(T data) {
this.data = data;
}

@Override
public String toString() {

return "data=" + data;
}

}