인터페이스 사용 예
소개
추상 클래스의 사용 예의 인터페이스 버전입니다.
인터페이스의 의미·정의 방법은 알고 있지만, 어떤 때에 사용하는지·어떤 좋은 것이 있는 것인가.
그 예를 소개합니다.
갑자기 결론. 개조에 강해집니다.
추상 클래스, 일반화, 상속과 동일하며 개조에 강해집니다.
추상 클래스의 사용 예 에서 소개한 프로그램에 한층 더 개조 요구가 발생한 것을 예로서 소개합니다.
개조 대상 프로그램
우선은, 추상 클래스의 사용 예 로 소개한 프로그램의 습관입니다.
프린터를 관리하는 프로그램에서 처음에는 잉크젯 프린터와 레이저 프린터를 관리하여 프린터 정보를 나열했습니다.
거기에 관리할 수 있는 프린터로서 도트 임팩트 프린터를 추가해 주는 개조 요건이 왔으므로, 추상화(범화·계속)로 개조에 강한 프로그램을 만들었습니다.
클래스 구성:
멤버 변수 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);
}
Reference
이 문제에 관하여(인터페이스 사용 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ats-y/items/4eed17e3e8d6c1abfd2b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
추상 클래스, 일반화, 상속과 동일하며 개조에 강해집니다.
추상 클래스의 사용 예 에서 소개한 프로그램에 한층 더 개조 요구가 발생한 것을 예로서 소개합니다.
개조 대상 프로그램
우선은, 추상 클래스의 사용 예 로 소개한 프로그램의 습관입니다.
프린터를 관리하는 프로그램에서 처음에는 잉크젯 프린터와 레이저 프린터를 관리하여 프린터 정보를 나열했습니다.
거기에 관리할 수 있는 프린터로서 도트 임팩트 프린터를 추가해 주는 개조 요건이 왔으므로, 추상화(범화·계속)로 개조에 강한 프로그램을 만들었습니다.
클래스 구성:
멤버 변수 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);
}
Reference
이 문제에 관하여(인터페이스 사용 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ats-y/items/4eed17e3e8d6c1abfd2b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// 管理するプリンターを登録する。
IPrinter[] printers = {
new InkjetPrinter("Epson P1", 10),
// 略
new ThreeDPrinter(5),
};
// 管理しているプリンターを一覧表示する。
for(int i = 0; i < printers.length; i++ ){
// printers[i]の中身は何かわからないけど、
// printers[i]はIPrinter型なので
// getPrinterInfo()が実装されているのでそれを呼び出せる。
String printerInfo = printers[i].getPrinterInfo();
System.out.println(printerInfo);
}
Reference
이 문제에 관하여(인터페이스 사용 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ats-y/items/4eed17e3e8d6c1abfd2b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)