20180803
- Generic(제너릭) 제너릭스
-> 클래스내부에서 사용할 데이터타입을 외부에서 지정하는 기법
-> jdk 1.5부터 제공되는 기능
-> 데이터타입을 정해두지않고 동적으로 처리하기 위해 사용
-> Class -> 기본형 데이터는 못들어온다.(정수,논리,문자,실수는 들어올수 없다.)
-> 래퍼클래스 -> int -> Integer로 바꿔서 써야된다.(기본형데이터를 쓰고싶다면 이렇게 써야
한다.)
int -> Integer
boolean -> Boolean
--------------------------------------------------
AnimalMgr m1 = new AnimalMgr(new Tiger(100));
AnimalMgr m2 = new AnimalMgr(new Bear(200));
System.out.println(((Tiger)m1.data).hp);
===============================================
class AnimalMgr{
// public Object data;//데이터라는 녀석의 자료형이 Object형태이다. 모든클래스의 조상
이였다.
// public AnimalMgr(Object data) {
// this.data=data;
// }//이게 생성자인데 Object라는 형태인데 이건 모든클래스의 조상클래스이므로
// //결국에는 타이거는 베어든 다받을수 있다는 것이다.
// //이걸 보고 다형성이라 했다.
//}
이럴경우 다운캐스팅을 했기때문에 형변환이 필요하다.
----------------------------------------------------
=====================================================
AnimalMgr<Tiger> m3 = new AnimalMgr<Tiger>(new Tiger(100));
AnimalMgr<Bear> m4 = new AnimalMgr<Bear>(new Bear(200));
System.out.println(m3.data.hp);
-------------------------------------------------------
class AnimalMgr<T>{
public T data;
public AnimalMgr(T data) {
this.data=data;
}
}
제너릭을 쓸경우 다형성을 안썼기때문에 다 불러올수가 있다.
---------------------------------------------------------------
package kh.java.run;
import kh.java.test.Generic;
public class Run {
public static void main(String[] args) {
Generic<String,Integer> g = new Generic<String,Integer>("Hello",100);
//이렇게 해놓으면 T라고지정한게 다 String형태로 바뀐다.
//문자형하나 정수형 하나를 넣었다.
System.out.println(g.getData1());
System.out.println(g.getData2());
Generic<Double,Character> g1 = new Generic<Double,Character>(3.14,'A');
//객체를 만들때 사용하겠다. 앞으로 적용할때 편리하게 사용가능하다.
System.out.println(g1.getData1());
System.out.println(g1.getData2());
//AnimalMgr m1은 주소를 저장하는데 상속관계가 아니여서 못받을텐데 받을수 있는 이유는
//Object때문이다.
//AnimalMgr참조형변수 m1을 만들어 AnimalMgr형태의 객체를 넣는데 new Tiger를 넣는데
//왜가능하냐면 Object형은 결국 모든클래스의 조상클래스이기때문이다.
//Tiger이라는건 hp는 100으로 초기화해서 만든다는 것이다.
AnimalMgr m1 = new AnimalMgr(new Tiger(100));//Tiger객체 주소
//m1이라는 주소를 따라간후 animalMgr형태가 있었고 이 안에 데이터변수가 있었다.
//데이터 변수안에 또 주소가 있고 주소를 따라가면 tiger이라는 녀석이 있었다.
//tiger안에 또 hp라는 변수가 있을 것이다.
//m1에서 객체찾아 data가서 data에서 tiger에hp를달라했는데에러가뜬다.
//데이터라는곳을 따라간다면 tiger이라는게 있을텐데 그주소를 data에 저장을 해놓았다.
//data는 Object 참조형변수로 저장을 해놓았다.
//다형성을 적용한 경우에 부모가갖고있는거만 호출이 가능하다.
//Object엔 hp라는 변수는 없다.
AnimalMgr m2 = new AnimalMgr(new Bear(200));//Bear객체 주소
System.out.println(((Tiger)m1.data).hp);
//이렇게 써줘야 가능하다.
//제너릭을 쓸경우 다운캐스팅이 필요가 없다.
//제너릭 코드
AnimalMgr<Tiger> m3 = new AnimalMgr<Tiger>(new Tiger(100));
AnimalMgr<Bear> m4 = new AnimalMgr<Bear>(new Bear(200));
System.out.println(m3.data.hp);
//다형성을 쓰지 않아서 형변환을 안해도 상관이 없다.
//제너릭 코드 끝
Generic g11 = new Generic("Hello",100);
//명시를 안하고 이런식으로 써보면 된다.
System.out.println(g.getData1());
System.out.println(g.getData2());
//이렇게 해버리면 정상적으로 인지가 가능하다.
//데이터만 넘겨줘도 데이터를 보고 어떤 타입인지 인지를 한다.
//Object a = new Tiger(10);이것도된다.
}
}
class Tiger{
public int hp;
public Tiger(int hp) {
this.hp=hp;
}
}
class Bear{
public int hp;
public Bear(int hp) {
this.hp=hp;
}
}
//class AnimalMgr{
// public Object data;//데이터라는 녀석의 자료형이 Object형태이다. 모든클래스의 조상이였다.
// public AnimalMgr(Object data) {
// this.data=data;
// }//이게 생성자인데 Object라는 형태인데 이건 모든클래스의 조상클래스이므로
// //결국에는 타이거는 베어든 다받을수 있다는 것이다.
// //이걸 보고 다형성이라 했다.
//}
class AnimalMgr<T>{
public T data;
public AnimalMgr(T data) {
this.data=data;
}
}
'IT일반과목 > java' 카테고리의 다른 글
자바 제너릭 다형성 (0) | 2018.08.03 |
---|---|
자바 제너릭(Generic)2 (0) | 2018.08.03 |
MVC패턴으로 소스 짜보기2 (0) | 2018.08.02 |
MVC패턴으로 소스 짜보기 (0) | 2018.08.02 |
자바 Collections 2 (0) | 2018.08.01 |