Just Do It

Generic

by 핫도구
반응형

Generic은 일반적인 코드를 작성하고 이 코드를 다양한 타입의 객체에 대하여 재사용하는 프로그래밍 기법 - 간단하게 컴포넌트화 느낌

 

1. 기존방식

 - Object를 이용한 방식

 - 다양한 클래스에 적용할 수 있는 다목적용 기능을 만들기 위해 모든 클래스의 조상인 Object Type으로하면 가능은

   하지만 형변환이 불가능한 경우 사용시에도 컴파일오류가 없지만 런타임오류가 발생한다.

 - 이러한 상황을 방지하기 위한 프로그래밍 기법의 Generic 프로그래

class Store {
	private Object data;

	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}
	
}

Store s1 = new Store(); // 인스턴스화
System.out.println(s1.setData("짜장면")); // 짜장면
s1.setData(123); // 자동형변환 int 123 => Integer 123
System.out.println("Object test1_2 => "+((Integer)s1.getData() + 200)); // 323
s1.setData(1.2423); // 자동형변환 double 1.2423 => Double 1.2423
s1.setData(new Car(123, 2.2, "porsche", 's', "Aqua"));
System.out.println("Object test2 => "+s1.getData()); //  [마력 : 123hp, 가격 : $2.2, 브랜드 : porsche, 색깔 : Aqua, 등급 : s]

 

그래서 Generic 방식으로 사용한다.

2. Generic 방식

 - 다양한 클래스에 적용할 수 있는 다목적용 기능을 만들기 위해 클래스 멤버변수의 타입을 T(임의의 알파벳)로 표현한 후 

   실행코드에서 결정하여 사용하는 프로그래밍 기법

 - 결정된 타입 이외에는 사용이 불가능하다.

class StoreG<T> {
	private T data;

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}
	
}

StoreG g1 = new StoreG();
g1.setData("GenericTest");
g1.setData(123);
g1.setData(new Car());
		
// Integer로 사용
StoreG<Integer> g2 = new StoreG<Integer>();
g2.setData(123456); // fine
//g2.setData(123.456); // compile error 
//g2.setData(new Car()); // compile error
System.out.println("Generic test1 => "+(g2.getData() + 200));  // 123656
		
// Car Type
StoreG<Car> g3 = new StoreG<Car> ();
g3.setData(new Car(123, 2.2, "porsche", 's', "Aqua"));
System.out.println("Generic test2 => "+g3.getData()); //  [마력 : 123hp, 가격 : $2.2, 브랜드 : porsche, 색깔 : Aqua, 등급 : s]
//g3.setData("아아"); // compile Error
		
		
// 기본자료형 사용 불가능(객체x) -> wrapper 클래스 사용
//StoreG<int> i3 = new StoreG<int>(); // 불가능
StoreG<Integer> i3 = new StoreG<Integer>(); // 가능

 

Class의 멤버 변수를 <T>로 선언한 후 인스턴스 선언 시 wrapper class를 <>에 넣어서 선언 해주면 같은 type만 넣을 수 있다.

 

이를 활용한 간단한 예이다.

class GenArray<T> {
	
	private T data[];
	
	// public getter/setter
	public T[] getData() {
		return data;
	}
	
	public void setData(T[] data) {
		this.data = data;
	}
	
	public void arrayPrint() {

		for (T t : data) {
			System.out.print(t+", ");
		
		}
	}
}

// String
GenArray<String> g1 = new GenArray<String>();
String[] s1 = {"porsche","mercedes","tslr"};
g1.setData(s1);
g1.arrayPrint(); // porsche, mercedes, tslr, 
		
System.out.println("----------");
// Integer
GenArray<Integer> g2 = new GenArray<Integer>();
Integer[] s2 = {1,2,3,4,5,12,6,6,66};
g2.setData(s2);
g2.arrayPrint(); // 1, 2, 3, 4, 5, 12, 6, 6, 66, 
System.out.println("----------");
				
// Character(char)
GenArray<Character> g3 = new GenArray<Character>();
Character[] s3 = {'1','a','s','d','f'};
g3.setData(s3);
g3.arrayPrint(); // 1, a, s, d, f,
		
// Car
//Car car = new Car();
GenArray<Car> g4 = new GenArray<Car>();
Car[] s4 = {new Car(123, 2.2, "porsche", 's', "Aqua"), new Car(4353, 3.345, "mercedes", 'a', "red")};
g4.setData(s4);
g4.arrayPrint(); // [마력 : 123hp, 가격 : $2.2, 브랜드 : porsche, 색깔 : Aqua, 등급 : s], [마력 : 4353hp, 가격 : $3.345, 브랜드 : mercedes, 색깔 : red, 등급 : a],
반응형

'JAVA > OLD' 카테고리의 다른 글

Set(HashSet, TreeSet, LinkedHashSet)  (0) 2024.07.29
List 인터페이스 (ArrayList & LinkedList)  (0) 2024.07.29
StringBuffer & StringBuilder  (0) 2024.07.27
String method  (0) 2024.07.27
String's Basic  (0) 2024.07.27

블로그의 정보

AquaMan

핫도구

활동하기