quilt code

[고급자바] 제너릭 (1) 본문

daily/고급자바

[고급자바] 제너릭 (1)

김뱅쇼 2023. 2. 2. 18:55

1. Args

가변형 인수 : 메소드 매개변수의 개수가 실행될 때마다 다를때 사용함
1) 가변형 인수는 메소드 안에서는 배열로 처리된다.
2) 가변형 인수는 한가지 자료형만 사용할 수 있다.

1) 배열을 이용한 메소드 (매개변수로 받은 정수들의 합계를 구하는 메소드(이 정수들의 개수는 상황에 따라 다르다)

1
2
3
4
5
6
7
8
9
10
public class T01ArgsTest {
 
    public int sumArr(int[] data) {
        int sum = 0;
        for(int i=0; i<data.length; i++) {
            sum += data[i];
        }
        
        return sum;
    }
cs

 

2)  가변형 인수를 이용한 메소드

1
2
3
4
5
6
7
8
    public int sumArg(int...data ) {
        int sum = 0;
        for(int i=0; i<data.length; i++) {
            sum += data[i];
        }
        
        return sum;
    }
cs

 

3) 가변형 인수와 일반적인 인수를 같이 사용(가변형 인수를 제일 뒤쪽에 배치해야 한다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    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) {
        T01ArgsTest at = new T01ArgsTest();
        
        int[] nums = {100200300};
        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(100200300));
        System.out.println(at.sumArg(1,2,3,4,5));
        
        System.out.println(at.sumArg2("홍길동"1,2,3,4,5,6,7,8));
        
        
        
        
    }
 
}
cs

 

2. Generic


제너릭 클래스 만드는 방법
<형식>
    class 클래스명<제너릭타입글자> {
         제너릭타입글자 변수명;   // 변수선언에 제너릭을 사용할 경우

          ...

          제너릭타입글자 메소드명() {   // 반환값이 있는 메소드에서 사용할 경우
                     ...
                    return 값;
     }
       ...
}


제너릭타입글자
T : Type
K : Key
V : Value
E : Element (자료구조에 들어가는 요소들을 나타낼 때 사용)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class T02GenericClassTest {
 
    public static void main(String[] args) {
        
        NonGenericClass ng1 = new NonGenericClass();
        ng1.setVal("가나다라");
        
        NonGenericClass ng2 = new NonGenericClass();
        ng2.setVal(100);
        
        String rtnVal1 = (String) ng1.getVal();
        System.out.println("문자열 반환값 rtnVal1 : " + rtnVal1);
        
        Integer irtnVal2 = (Integer) ng2.getVal();
        System.out.println("정수형 반환값 irtnVal2 : " + irtnVal2);
        System.out.println();
        
        MyGeneric<String> mg1 = new MyGeneric<String>();
        MyGeneric<Integer> mg2 = new MyGeneric<Integer>();
        
        mg1.setVal("우리나라"); // 타입 체크
        mg2.setVal(500);
        
        rtnVal1 = mg1.getVal();
        irtnVal2 = mg2.getVal();
        
        System.out.println("제너릭 문자열 반환값 : " + rtnVal1);
        System.out.println("제너릭 정수형 반환값 : " + irtnVal2);
        
    }
     
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
class NonGenericClass{
    private Object val;
 
    public Object getVal() {
        return val;
    }
 
    public void setVal(Object val) {
        this.val = val;
    }
    
    
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
 
class MyGeneric<T>{
    private T val;
 
    public T getVal() {
        return val;
    }
 
    public void setVal(T val) {
        this.val = val;
    }
}
cs

 

** 제너릭 메소드에 대하여

  • 파라미터 타입과 리턴타입으로 타입문자(글자)를 가지는 메소드
  • 선언방법 : 리턴타입 앞에 <> 기호를 추가하고 타입문자를 기술 후 사용한다.
1
2
3
4
5
6
7
8
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        
        boolean keyCompare = p1.getKey().equals(p2.getKey());
        boolean valueCompare =p1.getValue().equals(p2.getValue());
        
        return keyCompare && valueCompare;        
    }
}
cs

 

1) 멀티타입 <K,V>를 가지는 제너릭 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Pair<K, V>{
    
    private K key;
    private V value;
    
    public Pair(K key, V value) {
        super();
        this.key = key;
        this.value = 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 <K, V> void displayAll(K key, V val) {
        System.out.println(key + " : " + val);
    }
        
    
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class T03GenericMethodTest {
    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.<Integer, String>compare(p1, p2);
        
        if(result1) {
            System.out.println("논리(의미)적으로 동일한 객체임.");
        } else {
            System.out.println("논리(의미)적으로 동일한 객체가 아님.");
        }
        
        Pair<StringString> p3 = new Pair<StringString>("001","홍길동");
        Pair<StringString> p4 = new Pair<StringString>("002","홍길동");
        
        boolean result2 = Util.<StringString>compare(p3,p4);
        
        if(result1) {
            System.out.println("논리(의미)적으로 동일한 객체임.");
        } else {
            System.out.println("논리(의미)적으로 동일한 객체가 아님.");
        }
        
        p1.<String, Integer>displayAll("홍길동"100);
    }
 
}
cs

'daily > 고급자바' 카테고리의 다른 글

[고급자바] 와일드 카드  (0) 2023.02.03
[고급자바] 제너릭 (2)  (0) 2023.02.03
[고급자바] 컬렉션 프레임워크(4)  (0) 2023.02.02
[고급자바] Student 과제  (0) 2023.02.02
[고급자바] Lotto 과제  (0) 2023.02.02