ja

Generic

zod군 2014. 8. 18. 12:46


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);

}

}


}