본문 바로가기
IT/Java

컬렉션 프레임워크-제네릭 프로그래밍

by 어센트 2020. 1. 8.

제네릭 프로그래밍이랑 변수의 선언이나 매서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형을 변환 될 수 있도록 프로그래밍 하는 방식이다.  실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하기 때문에 안정적인 프로그래밍 방식이라 할 수 있다.

 

예를 들어 프린터 객체를 만든다고 하자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class GenericPrinter<extends Meterial> { //상위클래스 Metrial에 상속받은 클래스만 사용할 수 있도록 제한을 둠
 
    private T material;
 
    public T getMaterial() {
        return material;
    }
 
    public void setMaterial(T material) {
        this.material = material;
    }
    
    public String toString() {
        return material.toString();
    }
 
    public void printing() {
        material.doPrinting(); 
    }
}
 
cs

 

상속구조가 이렇게 되어있다고 가정하면 위의 코드는 Powder,Plastic클래스(Material은 추상클래스) 외에 다른 클래스는 GenericPrinter의 참조 자료형으로 사용할 수 없다.

 

테스트 클래스

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
public class GenericPrinterTest {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
        Powder powder = new Powder();
        powderPrinter.setMaterial(powder);    
        System.out.println(powderPrinter);
        
        
        GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
        Plastic plastic = new Plastic();
        plasticPrinter.setMaterial(plastic);    
        System.out.println(powderPrinter);
        
        powderPrinter.printing();
        
        plasticPrinter.printing();
        
        GenericPrinter printer = new GenericPrinter(); // 제네릭을 안쓰고도 호출할수있지만 그렇게 사용하지않음
        
    }
 
    
    
}
cs

Material클래스

1
2
3
4
5
public abstract class Meterial {
 
    public abstract void doPrinting();
}
 
cs

Platstic 클래스

1
2
3
4
5
6
7
8
9
10
11
12
 
public class Plastic extends Meterial{
 
    public String toString() {
        return "재료는 플라스틱입니다.";
    }
 
    @Override
    public void doPrinting() {
        System.out.println("플라스틱 프린팅 시작");        
    }
}
cs

Powder클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Powder extends Meterial {
 
    public String toString() {
        return "재료는 파우더입니다.";
    }
 
    @Override
    public void doPrinting() {
 
        System.out.println("파우더 프린팅 시작");
    }
}
 
cs

Water클래스 (Material에 상속되어 있지 않기 때문에 GenericPrinter에서 사용할 수 없다.)

1
2
3
4
5
public class Water {
    public String toString() {
        return "재료는 물입니다.";
    }
}
cs