자바/자바 입문 공부일지

자바 기초 공부 일지 37. 제네릭generic 메소드

Tomitom 2022. 11. 2. 12:00
반응형

▼ 제네릭 메소드

 

클래스 전부가 아닌 메소드 하나에 대해 제네릭을 정의합니다.

메소드의 선언부에 타입 변수를 사용한 메소드를 의미하며, 메소드 선언부에서 반환 타입 바로 앞에 위치합니다.

public static <T> void sort( ... ) { ... }

class BoxFactory {

   public static <T> Box<T> makeBox(T o) {

      Box<T> box = new Box<T>();   // 상자를 생성하고,

      box.set(o);   // 전달된 인스턴스를 상자에 담아서,

      return box;   // 상자를 반환한다.

   }

}

 

Box<String> sBox = BoxFactory.<String>makeBox("Sweet");

Box<Double> dBox = BoxFactory.<Double>makeBox(7.59);   // 7.59에 대해 오토 박싱 진행됨

 

Box<String> sBox = BoxFactory.makeBox("Sweet");

Box<Double> dBox = BoxFactory.makeBox(7.59);       // 7.59에 대해 오토 박싱 진행됨

 

출처 : 윤성우의 열혈 자바 프로그래밍

 

 

인스턴스 메소드는 인스턴스 존재 이후의 메소드입니다. 

따라서 멤버 변수를 제네릭 기반으로 정하고 메소드 자체는 그냥 만들어서 사용하는 경우가 많습니다. (편의상) 

 

클래스 메소드는 인스턴스가 없어도 독립적으로 기능을 제공할 수 있어야 하기 때문에 

클래스 메소드를 제네릭 기반으로 만드는 경우가 더 많습니다. 

 

 

하단은 제네릭 메소드에 대한 예제입니다. 

class Box<T> {      // 제네릭 클래스를 선언합니다.
    private T ob;
    
    public void set(T o) {    // 제네릭에 변수를 받는 메소드를 생성하고 
        ob = o;
    }
    public T get() {        // 제네릭의 받은 변수를 출력하는 메소드를 생성합니다. 
        return ob;
    }
}

class BoxFactory {      // 박스 공장 클래스를 생성합니다. 
    public static <T extends Number> Box<T> makeBox(T o) {  // Number 클래스에 제한하여 매개변수를 받는 MAKE BOX 제네릭 메소드를 생성합니다. 
        Box<T> box = new Box<T>();  // 박스 인스턴스를 생성하고 
        box.set(o);                 // 그 박스 안에 set으로 변수를 받습니다. 

        System.out.println("Boxed data: " + o.intValue());      // 박스 안의 데이터를 출력합니다. 
        return box;
    }
}

class Unboxer {         // 언박서 클래스를 생성합니다. 
    public static <T extends Number> T openBox(Box<T> box) {        // OPEN BOX 제네릭 메소드를 생성합니다. 
        System.out.println("Unboxed data: " + box.get().intValue());     // 그 안에 get으로 받은 변수의 값을 출력합니다. 
        return box.get();       
    }
}

class BoundedGenericMethod {        // 바운디드 제너릭 메소드 클래스를 생성합니다. 
    public static void main(String[] args) {
        Box<Integer> sBox = BoxFactory.makeBox(new Integer(5959));  // make 박스에 5959 정수를 담은 박스 공장 클래스로부터 정수 타입의 s박스 인스턴스를 생성합니다. 
        
        int n = Unboxer.openBox(sBox); // 언박싱하는 클래스에 s박스의 값을 인수로 넣은 변수 n을 생성합니다. 
        System.out.println("Returned data: " + n);  // 최종적으로 변수 n 출력 
    }
}

 

 

class Box<T> {      // 제네릭 클래스를 선언합니다.
    private T ob;
    
    public void set(T o) {    // 제네릭에 변수를 받는 메소드를 생성하고 
        ob = o;
    }
    public T get() {        // 제네릭의 받은 변수를 출력하는 메소드를 생성합니다. 
        return ob;
    }
}

class BoxFactory {      // 박스 공장 클래스를 생성합니다. 
    public static <T extends Number> Box<T> makeBox(T o) {  // Number 클래스에 제한하여 매개변수를 받는 MAKE BOX 제네릭 메소드를 생성합니다. 
        Box<T> box = new Box<T>();  // 박스 인스턴스를 생성하고 
        box.set(o);                 // 그 박스 안에 set으로 변수를 받습니다. 

        System.out.println("Boxed data: " + o.intValue());      // 박스 안의 데이터를 출력합니다. 
        return box;
    }
}

class Unboxer {         // 언박서 클래스를 생성합니다. 
    public static <T extends Number> T openBox(Box<T> box) {        // OPEN BOX 제네릭 메소드를 생성합니다. 
        System.out.println("Unboxed data: " + box.get().intValue());     // 그 안에 get으로 받은 변수의 값을 출력합니다. 
        return box.get();       
    }
}

class BoundedGenericMethod {        // 바운디드 제너릭 메소드 클래스를 생성합니다. 
    public static void main(String[] args) {
        Box<Integer> sBox = BoxFactory.makeBox(new Integer(5959));  // make 박스에 5959 정수를 담은 박스 공장 클래스로부터 정수 타입의 s박스 인스턴스를 생성합니다. 
        
        int n = Unboxer.openBox(sBox); // 언박싱하는 클래스에 s박스의 값을 인수로 넣은 변수 n을 생성합니다. 
        System.out.println("Returned data: " + n);  // 최종적으로 변수 n 출력 
    }
}

반응형