티스토리 뷰

Tip and Error/JAVA

Generic (class 자료형을 자유롭게)

geonwoopaeng@gmail.com 2021. 4. 23. 18:32

Generic 자료형


  • class에서 사용하는 변수의 자료형이 여러개인 경우

    -> 클래스의 자료형을 특정하지 않는 것

  • 컴파일 될 때 <T>가 원하는 자료형으로 바뀝니다.

  • 형변환을 일일이 안해줘도 됩니다.


ex)

//Circle.java
public class Circle {
    //..
}

//GenericEX.java //Generic class
public class GenericEX<T> {
    private T shape;

    public void setShape(T shape) {
        this.shape = shape;
    }

    public T getShape() {
        return shape;
    }

    public String toString() {
        return shape.toString();
    }
}

//Test.java
public class Test {
    public static void main(String[] args) {

        GenericEX<Circle> p = new GenericEX<>(); 
        //GenericEX<Circle> p = new GenericEX<Circle>(); 위와 같습니다.
        // 1.
        p.setShape(new Circle()); 
        // 2. 
        //Circle c = new Circle();
        //p.setShape(c);

        Circle p2 = p.getShape();
    }
}

<T extends class >


  • T 자료형의 범위 제한

  • 상속을 받지 않는 경우 <T>는 Object로 변환


// Figure.java
public abstract class Figure {
    //..
}

//Circle.java
public class Circle extends Figure{
    //..
}

//Rectangle.java
public class Rectangle {
    //..
}

//GenericEX.java //Generic class
public class GenericEX<T extends Figure> {
    private T shape;

    public void setShape(T shape) {
        this.shape = shape;
    }

    public T getShape() {
        return shape;
    }

    public String toString() {
        return shape.toString();
    }
}

//Test.java
public class Test {
    public static void main(String[] args) {
        // Circle만 상속을 받았기 때문에 Circle만 Generic이 가능합니다.
        GenericEX<Circle> p = new GenericEX<>(); 
        p.setShape(new Circle()); 
        Circle p2 = p.getShape();

        // GernericEX<Rectangle> r = new GenericEX<>(); 
        // Rectangle은 상속 받지 못했기 떄문에 불가
    }
}

Generic 메서드


  • public <자료형 parameter> 반환형 메서드 이름(자료형 parameter){}


//Point.java //두 점 class
public class Point<T, V> {
    T x;
    V y;

    Point (T x, V y) {
        this.x = x;
        this.y = y;
    }
    public T getX() {
        return x;
    }
    public V getY() {
        return y;
    }
}

//GenericMethod.java 
public class GenericMethod {
    publis static <T, V> double pointAdd(Point<T, V> a, Point<T, V> b) {
        double x = ((Number)a.getX()).doubleValue();
        double y = ((Number)b.getY()).doubleValue();

        return x + y;
    }
}

//Test.java
public class Test {
    public static void main(String[] args) {
        Point<Integer, Double> a = new Point<Interger, Double>(0, 0.0);
        Point<Integer, Double> b = new Point<>(10, 10.0);

        double result = GenericMethod.<Integer, Double>pointAdd(a,b);
        System.out.println(result);
    }
}

반응형
공지사항
최근에 올라온 글