본문 바로가기

IT일반과목/java

자바 제너릭(Generic)

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;

}

}


=============================================================================
package kh.java.test;

public class Generic<T,E> {//2개의 데이터를 쓸수 있다.
private T data1;//변수만들때 접근제어지시자 쓰고 데이터타입 써줘야되는데
//그냥 T라고 임의지정을 해놓았다.
private E data2;
public Generic() {
}//생성자 만들었다.
public Generic(T data1, E data2) {
this.data1=data1;
this.data2=data2;
}

public T getData1() {
return data1;
}
public void setData1(T data1) {
this.data1=data1;
}
public E getData2() {
return data2;
}
public void setData2(E data2) {
this.data2=data2;
}


//만약 T자리에 String가 들어간다면 코드에 문제가 없다.
}



'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