Jun's Blog

[Java] 예제를 보며 Generic에 대해 알아보자 본문

High Java/Generic

[Java] 예제를 보며 Generic에 대해 알아보자

Fizzyelf 2020. 10. 22. 19:36

가변형 인수 => 메서드의 매개변수의 갯수가 실행될 때마다 다를 때 사용한다.

- 가변형 인수는 메서드 안에서는 배열로 처리된다.

- 가변형 인수는 한 가지 자료형에만 사용할 수 있다.

public class T01_ArgsTest {
	
	// 배열을 이용한 메서드
	// 매개변수로 받은 정수들의 합계를 구하는 메서드(이 정수들의 개수는 상황에 따라 다르다.)
	public int sumArr(int[] data) {
		int sum = 0;
		for(int i=0; i<data.length; i++) {
			sum += data[i];
		}
		return sum;
	}
	
	// 가변형 인수를 이용한 메서드
	public int sumArg(int...data) {
		int sum = 0;
		for(int i=0; i<data.length; i++) {
			sum += data[i];
		}
		return sum;
	}
	
	// 가변형 인수와 일반적인 인수를 같이 사용할 경우에는 가변형 인수를 제일 뒤쪽에 배치해야 한다.
	public String sumArg2(String name, int...data) {
		int sum = 0;
		for(int i=0; i<data.length; i++) {
			sum += data[i];
		}
		return name + "씨 점수 : " + sum;
	}
	
	
	public static void main(String[] args) {
		
		T01_ArgsTest at = new T01_ArgsTest();
		
		int[] nums = {100, 200, 300};
		System.out.println(at.sumArr(nums));
		System.out.println(at.sumArr(new int[] {1,2,3,4,5}));
		System.out.println();
		
		System.out.println(at.sumArg(100, 200, 300));
		System.out.println(at.sumArg(1,2,3,4,5));
		System.out.println();
		
		System.out.println(at.sumArg2("홍길동", 1,2,3,4,5,6,7,8,9));
	}
}

출력 결과 화면


Generic Calss 만드는 방법

 

형식)

    class 클래스명 <제너릭 타입 글자> {

         제너릭타입글자 변수명;    // 변수선언에 제너릭을 사용할 경우

          . . .

 

         제너릭타입글자 메서드명() {    // 반환값이 있는 메서드에 사용

              . . .

              return 값;

          }

          . . . 

     }

 

--Generic 타입 글자--

 T => Type
 K => Key
 V => Value
 E => Element(자료구조에 들어가는 항목들을 나타낼 때 사용)

 

import java.util.Iterator;

class NonGeneric{
	private Object val;

	public Object getVal() {
		return val;
	}

	public void setVal(Object val) {
		this.val = val;
	}

}

class MyGeneric<T>{
	private T val;

	public T getVal() {
		return val;
	}

	public void setVal(T val) {
		this.val = val;
	}
}

public class T02_GenericTest {

	public static void main(String[] args) {
		NonGeneric ng1 = new NonGeneric();
		ng1.setVal("가나다라");
		
		NonGeneric ng2 = new NonGeneric();
		ng2.setVal(100);
		
		String rtnNg1 = (String)ng1.getVal();
		System.out.println("문자열 반환값 rtnNg1 => " + rtnNg1 );
		
		Integer irtnNg2 = (Integer)ng2.getVal();
		System.out.println("정수 반환값 rtnNg1 => " + irtnNg2);
		System.out.println();
		
		MyGeneric<String> mg1 = new MyGeneric<String>();
		MyGeneric<Integer> mg2 = new MyGeneric<>();
		
		mg1.setVal("우리나라");
		mg2.setVal(500);
			
		rtnNg1 = mg1.getVal();
		irtnNg2 = mg2.getVal();
		
		System.out.println("제너릭 문자열 반환값 : " + rtnNg1);
		System.out.println("제너릭 정수형 반환값 : " + irtnNg2);
	}
}

출력 결고 화면


class Util {
   /**
    * 제너릭 메서드<T, R> R method(T t) 파라미터 타입과 리턴타입으로 타입파라미터를 가지는 메서드 선언방법: 리턴타입 앞에<>
    * 기호를추가하고 타입파라미터를 기술 후 사용함.
    * 
    * @param p1
    * @param p2
    * @return
    */

   public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {

      boolean keyCompare = p1.getKey().equals(p2.getKey());
      boolean valuecCompare = p1.getKey().equals(p2.getValue());

      return keyCompare && valuecCompare;
   }
}

/**
 * 멀티타입<K,V> 가지는 제너릭 클래스
 *
 * @param <K>
 * @param <V>
 */

class Pair<K, V> {
   private K key;
   private V value;

   public K getKey() {
      return key;
   }

   public void setKey(K key) {
      this.key = key;
   }

   public V getValue() {
      return value;
   }

   public void setValue(V value) {
      this.value = value;
   }

   public Pair(K key, V value) {
      super();
      this.key = key;
      this.value = value;
   }
   
   // 키와 값 출력한느 메서드
   public <K,V> void displayAll(K key, V value) {
	   System.out.println(key.toString() + " : " + value);
   }

}

public class T03_GenericMethodTest {
   public static void main(String[] args) {

      Pair<Integer, String> p1 = new Pair<Integer, String>(1, "홍길동");

      Pair<Integer, String> p2 = new Pair<Integer, String>(1, "홍길동");
      // 구체적 타입을 일시적으로 지정
      boolean result1 = Util.compare(p1, p2);

      if (result1) {

         System.out.println("논리적(의미)으로 동일한 객체임.");
      }else {
         System.out.println("논리적(의미)으로 동일한 객체아님.");
      }
      
      Pair<String, String> p3 = new Pair<String, String>("001", "홍길동"); 
      Pair<String, String> p4 = new Pair<String, String>("001", "홍길동");
      
      boolean result2 = Util.compare(p3, p4);
      
      if (result2) {

         System.out.println("논리적(의미)으로 동일한 객체임.");
      }else {
         System.out.println("논리적(의미)으로 동일한 객체아님.");
      }
      
      // 제너릭 메서드 호출
      p1.<String, Integer>displayAll("키값", 1234);
   }

}

출력 결과 화면

Comments