도담이 먹여 살려야하는 집사

Generic Type 본문

JAVA

Generic Type

천재도담 2020. 8. 26. 20:41

Generic Type (제너릭 타입)

Collection 클래스로 데이터 기본 저장공간은 Object.

일반적인 코드를 작성한 후, 이 코드를 다양한 타입의 객체에 대하여 재사용하는 프로그래밍 기법이다. 

Object타입 저항을 타입이 타당한가에 대한 문제점으로부터 도출되었다. 이는 타입 강제가 가능하도록 하게하는 것과 같은 의미이다. (객체생성 >> 타입) == 강제 형변환(Casting) 을 하지 않겠다. >> 클래스에서 사용할 타입을 클래스 외부에서 설정하는 타입

제너릭타입을 사용하는 시점은 클래스 설계시에 제너릭 적용 코드 이다.

 

ArrayList의 기능은 똑같지만 리스트에 담는 내용물은 다를 경우(= List의 기능은 같음, 사용하는 타입이 서로 다름) -> Generic을 사용

List<String> strList = new ArrayList<>();
List<object> objList = new ArrayList<>();
//List의 기능을 사용하는건 같지만 list에 담는 내용물은 서로 다름 (= 타입이 다름)
class MyGen<T> { //type parameter
	T obj;
	void add(T obj) {
		this.obj = obj;
	}
	T get() {
		return this.obj;
	}
	
}
class Person extends Object{
	int age = 100;
	
}

여기서 T는 Generic변수이고 타입이 아직 정해져 있지 않다. 

T는 main method에서 객체가 생성될때 T의 타입이 정해진다. 

public class Ex06_Generic {

	public static void main(String[] args) {
		MyGen<String> mygen = new MyGen<String>();
		//<String>을 위에 있는 T에 모두 넣음 T->String 으로 바뀌는게 제너릭 
		mygen.add("문자열");
		String str = mygen.get();
		System.out.println(str);
		}
        }

여기서 T가 String의 타입으로 정해짐. -> 이제 MyGen은 String 타입만 받을 수 있다. 

<T>가 String 타입으로 정해짐

ArrayList list = new ArrayList(); //저장 공간의 타입 : Object[] elements
		list.add(10);
		list.add(new Person());
		list.add("홍길동");
		
        //출력
		for(Object obj : list) {
			//person 객체는 나이 출력하고 나머지는 값을 출력
			//System.out.println(obj);
			//Person@6d06d69c 주소값이 나옴 person을 하이캐스팅 해야함 
			//객체인것과 아닌것 
			
            if(obj instanceof Person) {
				Person p = (Person) obj;
				System.out.println(p.age);
			}else {
				System.out.println(obj);
			}
		}

위 코드와 같은경우 person객체는 나이를 출력하고 나머지는 값을 출력 하고자 할때 person을 하이캐스팅 하여야함.  하지만 이 경우 제너릭타입을 사용한다면, 

	ArrayList<Person> plist = new ArrayList<Person>();
		plist.add(new Person());
		plist.add(new Person());
		for(Person p : plist) {
			System.out.println(p.age);
		}
		

person 객체의 나이만 출력이 가능해짐. 

 


Generic Type in Method

메소드 제너릭 타입은 class에 generic type을 선언하지 않고, 각 메소드 마다 Generic Type을 선언해 사용 할 수 있다. 

 

메소드 파라미터의 T가 선언 되어 있다면, 리턴타입 바로 앞에 <T>제너릭 타입을 선언해 주어야 한다. 

	//사용자 계좌 목록 확인 
	public ArrayList<Account> findAccounts(String name) { 
    //제어자(public,static) + <제너릭> + 리턴타입
		ArrayList<Account> userAccounts = new ArrayList<Account>();
		for (Account act : this.accounts) {
			if (name.equals(act.getName())) {
				userAccounts.add(act);
			}
		}
		return userAccounts;
	}
 
    
    //******************************************************************************
    
    public class Arrays{

public static <T> void swap(T[] array, int i, int j){
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}

배열에 들어있는 요소의 타입이 키본타입만 아니면 swap메서드로 배열에 들어있는 요소를 교환할 수 잇음.

 

'JAVA' 카테고리의 다른 글

This  (0) 2020.08.31
final  (0) 2020.08.27
Array_Basic  (0) 2020.08.23
상속(Inheritance)-1  (1) 2020.08.19
Class (클래스)  (0) 2020.08.13
Comments