왜 인터페이스인가 ??????
개로 시작합니다. 특히, 퍼그 .
퍼그에는 다양한 동작이 있습니다.
public class Pug {
private String name;
public Pug(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Arf!"; }
public boolean hasCurlyTail() { return true; } }
그리고 당신은 래브라도를 가지고 있습니다.
public class Lab {
private String name;
public Lab(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Woof!"; }
public boolean hasCurlyTail() { return false; } }
퍼그와 랩을 만들 수 있습니다 :
Pug pug = new Pug("Spot");
Lab lab = new Lab("Fido");
그리고 우리는 그들의 행동을 불러 낼 수 있습니다 :
pug.bark() -> "Arf!"
lab.bark() -> "Woof!"
pug.hasCurlyTail() -> true
lab.hasCurlyTail() -> false
pug.getName() -> "Spot"
개 사육장을 운영하고 있으며 내가 살고있는 모든 개를 추적해야한다고 가정 해 봅시다. 나는 별도의 배열에 내 퍼그와 래브라도을 저장해야합니다 :
public class Kennel {
Pug[] pugs = new Pug[10];
Lab[] labs = new Lab[10];
public void addPug(Pug p) { ... }
public void addLab(Lab l) { ... }
public void printDogs() { // Display names of all the dogs } }
그러나 이것은 분명히 최적이 아닙니다. 경우 좀 푸들을 수용 할 도, 나는 푸들의 배열을 추가 내 개집 정의를 변경해야합니다. 사실, 나는 개 종류마다 별도의 배열이 필요합니다.
통찰력 : 퍼그와 래브라도 (푸들)는 개 유형이며 같은 행동을 취합니다. 즉, 우리는 (이 예의 목적을 위해) 모든 개가 짖을 수 있고 이름을 가질 수 있으며 곱슬 꼬리를 가질 수도 있고 말지 않을 수도 있다고 말할 수 있습니다. 인터페이스를 사용하여 모든 개가 할 수있는 일을 정의 할 수 있지만 특정 행동 유형을 구현하기 위해 특정 유형의 개에 맡겨 두십시오. 인터페이스는 "모든 개가 할 수있는 일이 있습니다"라고 말하지만 각 행동이 어떻게 수행되는지는 말하지 않습니다.
public interface Dog
{
public String bark();
public String getName();
public boolean hasCurlyTail(); }
그런 다음 Pug 및 Lab 클래스를 약간 변경하여 Dog 동작을 구현합니다. 퍼그는 개이고 랩은 개라고 말할 수 있습니다.
public class Pug implements Dog {
// the rest is the same as before }
public class Lab implements Dog {
// the rest is the same as before
}
이전과 마찬가지로 여전히 퍼그와 랩을 인스턴스화 할 수 있지만 이제는 새로운 방법을 사용할 수 있습니다.
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
이것은 d1은 개일뿐만 아니라, 특히 퍼그입니다. d2는 또한 개, 특히 실험실입니다. 동작을 호출 할 수 있으며 이전과 같이 작동합니다.
d1.bark() -> "Arf!"
d2.bark() -> "Woof!"
d1.hasCurlyTail() -> true
d2.hasCurlyTail() -> false
d1.getName() -> "Spot"
추가 작업이 모두 필요한 곳입니다. Kennel 클래스가 훨씬 단순 해졌습니다. 하나의 배열과 하나의 addDog 메소드 만 필요합니다. 둘 다 개인 어떤 물건과도 잘 어울립니다. 즉, Dog 인터페이스를 구현하는 객체입니다.
public class Kennel {
Dog[] dogs = new Dog[20];
public void addDog(Dog d) { ... }
public void printDogs() {
// Display names of all the dogs } }
사용 방법은 다음과 같습니다.
Kennel k = new Kennel();
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
k.addDog(d1);
k.addDog(d2);
k.printDogs();
마지막 문장은 스팟 피도
인터페이스는 인터페이스를 구현하는 모든 클래스가 공통으로 공유 할 일련의 동작을 지정할 수있는 기능을 제공합니다. 결과적으로, 어떤 종류의 특정 객체를 미리 알 필요가없고 인터페이스를 구현하는 객체 만 보유 할 변수와 컬렉션 (예 : 배열)을 정의 할 수 있습니다.