public class Generic2 {
public static void main(String[] args) {
ObjectClass obj = new ObjectClass();
// Object 타입으로 선언했으므로 모든 자료형 전달 가능
obj.setValue("홍길동");
System.out.println("값 : "+obj.getValue());
obj.setValue(123);
System.out.println("값 : "+obj.getValue());
obj.setValue('c');
System.out.println("값 : "+obj.getValue());
//char c = obj.getValue(); // 컴파일 에러 발생!
// c = (char)obj.getValue(); // 형변환 필요
/*
* Object 타입으로 저장했기 떄문에
* 변수에 데이터를 받아올 때 형변환 필요
* 단, 각각의 데이터의 자료형에 맞는 변수 필수!
*
*/
}
}
class ObjectClass {
// 모든 자료형을 전달받을수 있는 오브젝트 타입으로 선언
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
----------------------------------------------------------------------------------------------------------------
public class Generic3 {
public static void main(String[] args) {
/*
* 제네릭
* 메서드나 클래스를 사용할시 필요한 데이터 형을 지정 가능하다.
* 정의시에는 자료형을 결정하지 않고
* 가상의 자료형으로 정의해놓고
* 객체 생성 시 실제 사용할 자료형을 명시하는 것.
* (반드시 클래스타입만 사용 가능)
*/
GenericClass<Integer> obj1 = new GenericClass<Integer>();
// obj1 객체의 가상의 자료형 T 는 Integer 로 대체된다.
// Obj1 객체에서 사용할 수 있는 자료형은
// 무조건 정수형이어야만 한다.(강제성 부여됨)
obj1.setValue(1);
System.out.println(obj1.getValue());
int num = obj1.getValue();
// 만일 다른 자료형을 사용하고 싶을 경우
GenericClass<String> obj2 = new GenericClass<String>();
// ojb2 객체의 T 는 String 형으로 대체
obj2.setValue("홍기이일동");
String str = obj2.getValue();
}
}
// 제네릭(Generic) 클래스 작성 시 가상의 자료형을 클래스에서 정의
// 선언할 클래스명 뒤에 <> 를 붙여서 제네릭타입 선언한다.
// 보통 한 글자 영문 대문자 사용(주로 T , E 를 많이 사용)
// 결국 가상의 자료형도 자료형의 일종이므로
// 기존 자료형이 명시되는 자리에 들어갈수 있다.
// 아직 아무것도 확정되지 않는 자료형
// 객체 생성시 어떠한 자료형으로 변환이 가능하도록 만들어져있다.
class GenericClass <T> {
// T 라는 자료형을 임시 자료형으로 사용 가능하도록 정의됨.
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
----------------------------------------------------------------------------------------------------------------
import java.util.*;
import javax.lang.model.element.*;
public class Generic_Ex {
public static void main(String[] args) {
/*
* HashSet 객체 생성 시 정수형 데이터만 사용하도록 선언
*
*/
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
// set.add(3.14); 컴파일 에러 발생(Integer 타입이 아니다.)
List<String> list = new ArrayList<String>();
list.add("이순신");
list.add("홍길동");
// list.add(3); 컴파일 에러 발생(String 타입이 아니다.)
// HashMap 생성시
// 키는 정수형, 값은 문자열형으로 선언
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "딸기");
map.put(2, "바나나");
// map.put("3", "딸기"); 컴파일 에러 발생 <Integer , String> 이므로 앞에는 정수형이 들어가야된다.
Map<String, String> map2 = new HashMap<String, String>();
map2.put("앞", "뒤");
set.add(3);
set.add(4);
set.add(5);
set.add(6);
// 향상된 for 문 이용하여 set 객체 데이터 모두 출력
for(int num : set){
// set 은 이미 Integer 로 선언이 되어 있다.
// 제네릭을 사용하여 set 객체의 자료형을
// Integer(정수형)타입으로 강제했기 때문에
// int 형 변수로 전달받아도 아무런 문제가 없다.
// 즉, 데이터 타입의 안정성 보장
System.out.println(num);
}
// iterator 를 활용하여 set 객체 데이터 모두 출력
Iterator<Integer> nums = set.iterator();
while(nums.hasNext()){
// 정수형 데이터가 보장되므로
// int 형 변수에 바로 데이터 저장 가능.
int num = nums.next();
System.out.println(num);
}
}
}