인터페이스 사용 예

소개



추상 클래스의 사용 예의 인터페이스 버전입니다.
인터페이스의 의미·정의 방법은 알고 있지만, 어떤 때에 사용하는지·어떤 좋은 것이 있는 것인가.
그 예를 소개합니다.

갑자기 결론. 개조에 강해집니다.



추상 클래스, 일반화, 상속과 동일하며 개조에 강해집니다.
추상 클래스의 사용 예 에서 소개한 프로그램에 한층 더 개조 요구가 발생한 것을 예로서 소개합니다.

개조 대상 프로그램



우선은, 추상 클래스의 사용 예 로 소개한 프로그램의 습관입니다.

프린터를 관리하는 프로그램에서 처음에는 잉크젯 프린터와 레이저 프린터를 관리하여 프린터 정보를 나열했습니다.
거기에 관리할 수 있는 프린터로서 도트 임팩트 프린터를 추가해 주는 개조 요건이 왔으므로, 추상화(범화·계속)로 개조에 강한 프로그램을 만들었습니다.

클래스 구성:


멤버 변수 mModelName(모델명)과 mPaper(용지 잔량)를 일반화, 프린터 정보를 돌려주는 getPrinterInfo() 함수를 추상화하고 있습니다.

새로운 개조 요건



이번에는 한층 더 「관리하는 프린터의 종류에 3D프린터를 추가해 그 프린터 정보도 표시해 주었으면 한다」라고 하는 요건이 왔다고 합니다.

도트 임팩트 프린터를 추가했을 때와 같이 AbstractPrinter를 상속해… 라고 해도 할 수 없는 것은 아니지만, 3D 프린터는 종이에 인쇄하는 것은 아니기 때문에, mPaper(용지 잔량)는 불필요합니다.
사용하지 않는 멤버 변수는 프로그램을 보수할 때 방해가 되지 않는 것이 좋다.

그럼, 독립적인 3D 프린터 클래스를 만드는가?
그렇다면 추상 클래스의 사용 예 의 추상 클래스를 사용하지 않는 프로그램처럼 중복이 되고…

그럼 어떻게 하면 좋을까.
인터페이스로 해결해 봅시다.

인터페이스를 이용해 개조해 보기



먼저 인터페이스를 만듭니다.

//
// プリンターインターフェイス
//
interface IPrinter{

    // 一覧表示用プリンタ情報を返す
    String getPrinterInfo();
}

프린터 인터페이스 IPrinter를 구현하는 형태로 3D 프린터 클래스를 만듭니다.
//
// 3Dプリンター
//
class ThreeDPrinter implements IPrinter{

    // 材料容量
    private int mMaterial;

    // コンストラクタ
    public ThreeDPrinter(int material){
        mMaterial = material;
    }

    // 一覧表示用プリンタ情報を返すメソッド 
    public String getPrinterInfo(){

        return "[3D]開発中3Dプリンター" + " 印刷可能容量:" + mMaterial + "リットル";
    }
}

AbstractPrinter 클래스에도 프린터 인터페이스 IPrinter를 구현합니다.
//
// プリンターの抽象クラス
//
abstract class AbstractPrinter implements IPrinter{
    // 略
}

관리할 프린터를 저장하는 배열 유형을 AbstractPrinter에서 IPrinter로 변경합니다.
    public static void main(String[] args) throws Exception {

        // 管理するプリンターを登録する。
        IPrinter[] printers = {
            new InkjetPrinter("Epson P1", 10),
            new InkjetPrinter("Canon C1", 20),
            new LaserPrinter("Xerox X1", 100),
            new LaserPrinter("Richo R1", 50),
            new LaserPrinter("Richo R2", 200),
            new DotimpactPrinter("NEC N1", 100),
            new DotimpactPrinter("Oki O1", 50),
            new ThreeDPrinter(5),
        };

        // 管理しているプリンターを一覧表示する。
        for(int i = 0; i < printers.length; i++ ){
            String printerInfo = printers[i].getPrinterInfo();
            System.out.println(printerInfo);
        }
    }

이것만.
실행해 봅시다.

실행 결과
[インクジェット]Epson P1 印刷可能枚数:10
[インクジェット]Canon C1 印刷可能枚数:20
[レーザー]Xerox X1 印刷可能枚数:100
[レーザー]Richo R1 印刷可能枚数:50
[レーザー]Richo R2 印刷可能枚数:200
[ドットインパクト]NEC N1 印刷可能枚数:100
[ドットインパクト]Oki O1 印刷可能枚数:50
[3D]開発中3Dプリンター 印刷可能容量:5リットル

할 수 있어요!
추상 클래스의 사용 예 때와 같이 관리하는 변수도 늘어나지 않고, 표시하는 처리도 변경하지 않고 할 수 있었습니다.
htps: //파이자. 이오 / p 로지 cts / ws sJJV wbZf 0 vXHrsGjg

클래스 구성:


요약



인터페이스도 형이군요. 그래서 변수의 형태로 사용할 수 있습니다.
인터페이스형의 변수에는, 그 인터페이스를 구현하고 있는 클래스의 오브젝트를 포함할 수 있습니다.
// 管理するプリンターを登録する。
IPrinter[] printers = {
    new InkjetPrinter("Epson P1", 10),
    // 略
    new ThreeDPrinter(5),
};

ThreeDPrinter 클래스도 AbstractPrinter에서 파생된 각 클래스도 IPrinter 인터페이스를 구현하므로 IPrinter 형식의 변수에 개체를 저장할 수 있습니다.
그리고 getPrinterInfo() 함수를 정의하고 있는 IPrinter형의 변수는, 그 안에 들어 있는 객체의 상세한 것은 모르지만 getPrinterInfo() 함수를 구현하고 있는 것만은 확실하기 때문에 그것을 호출할 수 있다 합니다.
// 管理しているプリンターを一覧表示する。
for(int i = 0; i < printers.length; i++ ){
    // printers[i]の中身は何かわからないけど、
    // printers[i]はIPrinter型なので  
    // getPrinterInfo()が実装されているのでそれを呼び出せる。
    String printerInfo = printers[i].getPrinterInfo();
    System.out.println(printerInfo);
}

좋은 웹페이지 즐겨찾기