본문 바로가기
공부/자바 (Java)

[Java] 제네릭 프로그래밍

by Lagooni 2022. 1. 6.

제네릭 프로그래밍이란?

변수의 선언이나 메서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형으로 변환 될 수 있도록 프로그래밍 하는 방식이다.

실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적인 프로그래밍 방식이다.

자료형 매개 변수 T

여러 참조 자료형으로 대체 될 수 있는 부분을 하나의 문자로 표현한것. (Type의 약자 T를 사용)

사용 예) 다른 타입에 대한 프린터(다른 재료 사용)

더보기

클래스 옆에 <T>를 표시해준다. (임시 객체)

public class GenericPrinter<T> {

    private T material;

    public T getMaterial() {
        return material;
    }

    public void setMaterial(T material) {
        this.material = material;
    }

    @Override
    public String toString() {
        return material.toString();
    }
}

결과를 간단히 확인하기 위해 Plastic 객체를 만들어 toString메소드를 오버라이딩 한다.

public class Plastic {

    public String toString(){
        return "재료는 Plastic 입니다.";
    }
}

GenericPrinter를 만들어둔 Plastic 타입으로 선언한다. 

Plastic 인스턴스를 만들고 setMaterial에 넣어준다.

plasticPrinter은 Plastic 클래스에서 오버로딩한 "재료는 Plastic 입니다." 가 결과로 출력된다.

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

        GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<>();
        Plastic plastic = new Plastic();
        plasticPrinter.setMaterial(plastic);
        System.out.println(plasticPrinter);
    }
}

제너릭 타입으로 쓸 수 있는 클래스를 한정하는 방법(상위 클래스 상속)

<T extends 클래스명>

public class GenericPrinter<T extends Meterial> {

    private T material;

    public T getMaterial() {
        return material;
    }

    public void setMaterial(T material) {
        this.material = material;
    }

    @Override
    public String toString() {
        return material.toString();
    }
}

사용할 클래스에만 상속해서 사용한다.

public class Powder extends Meterial{

    @Override
    public String toString() {
        return "재료는 Powder 입니다.";
    }
}

제네릭 메서드: 메서드 매개변수를 자료형 매개변수로 사용하는 메서드

메서드 내에서의 자료형 매개 변수는 메서드 내에서만 유효함(지역변수와 같은 개념)

class Shape<T>{
	public static<T, V> double makerRectangle(Point<T,V> p1, Point<T,V> p2){
    	...
    }
}

Shape의 T와 makeRectangle의 T는 전혀 다른 의미이다.

일반 클래스에서도 제네릭메서드를 사용할 수 있다.


왜 제네릭이 필요할까?

1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있습니다.

2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있습니다.

댓글