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;
}
}
'[JAVA] 정리 > 클래스(Class)_타입(Type)' 카테고리의 다른 글
| 클래스_오브젝트(Object) (0) | 2023.02.23 |
|---|---|
| 향상된 for문 for(자료형 변수명 : 배열명) (0) | 2023.02.23 |
| 클래스_enum (0) | 2023.02.22 |
| 클래스_상속 자격(extends, implements) (0) | 2023.02.22 |
| 클래스_추상화 클래스(abstract) (0) | 2023.02.22 |