상속
자동차와 버스를 고려하십시오. 그들은 두 개의 다른 차량입니다. 그러나 여전히 스티어링, 브레이크, 기어, 엔진 등의 공통 속성을 공유
합니다. 상속 개념을 사용하면 다음과 같이 나타낼 수 있습니다.
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
이제 자전거 ...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
그리고 자동차 ...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
이것이 전부 상속 에 관한 것 입니다. 우리는 위에서 본 것처럼 객체를 더 간단한 기본 형식과 그 자식으로 분류하는 데 사용합니다.
추상 클래스
추상 클래스는 불완전한 객체입니다. 그것을 더 이해하기 위해 차량 비유를 다시 한번 생각해 봅시다.
차량을 운전할 수 있습니다. 권리? 그러나 다른 차량은 다른 방식으로 운전됩니다 ... 예를 들어 자전거를 운전하는 것처럼 자동차를 운전할 수 없습니다.
그렇다면 차량의 주행 기능을 나타내는 방법은 무엇입니까? 차량의 종류를 확인하고 자체 기능으로 운전하는 것이 더 어렵습니다. 새로운 유형의 차량을 추가 할 때 Driver 클래스를 반복해서 변경해야합니다.
다음은 추상 클래스와 메소드의 역할입니다. 상속하는 모든 자식이이 함수를 구현해야 함을 나타 내기 위해 drive 메서드를 abstract로 정의 할 수 있습니다.
차량 클래스를 수정하면 ...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
자전거와 자동차는 또한 운전 방법을 지정해야합니다. 그렇지 않으면 코드가 컴파일되지 않고 오류가 발생합니다.
간단히 말해서. 추상 클래스는 일부 불완전한 함수를 가진 부분적으로 불완전한 클래스이며 상속되는 자식은 자체적으로 지정해야합니다.
인터페이스
인터페이스가 완전히 불완전합니다. 속성이 없습니다. 그들은 상속받은 아이들이 무언가를 할 수 있음을 나타냅니다 ...
당신이 다른 유형의 휴대 전화를 가지고 있다고 가정하십시오. 그들 각각은 다른 기능을 수행하는 다른 방법을 가지고 있습니다. 예 : 사람에게 전화하십시오. 휴대 전화 제조업체가 수행 방법을 지정합니다. 여기서 휴대폰은 전화를 걸 수 있습니다. 즉, 전화를 걸 수 있습니다. 이것을 인터페이스로 표현해 봅시다.
public interface Dialable {
public void dial(Number n);
}
여기서 다이얼 러블 제조업체는 번호를 다이얼하는 방법을 정의합니다. 당신은 전화 번호를 제공해야합니다.
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
따라서 추상 클래스 대신 인터페이스를 사용하면 Dialable을 사용하는 함수 작성기는 속성에 대해 걱정할 필요가 없습니다. 예 : 터치 스크린 또는 다이얼 패드가 있습니까? 유선 전화 또는 휴대폰입니까? 전화 걸기 가능 여부 만 알면됩니다. Dialable 인터페이스를 상속 (또는 구현)합니까?
더 중요한 것은 언젠가 다이얼 러블을 다른 것으로 바꾸면
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
다이얼 러블을 사용하는 기능이 다이얼 러블 인터페이스에 지정된 것 이외의 세부 사항에 의존하지 않으며 또한 불가능하기 때문에 코드가 여전히 완벽하게 작동하는지 확인할 수 있습니다. 둘 다 Dialable 인터페이스를 구현하며 이것이 기능에 관심을 갖는 유일한 것입니다.
인터페이스는 공통 기능을 공유하는 한 객체간에 상호 운용성을 보장하기 위해 개발자가 일반적으로 사용합니다 (전화 번호로 전화를 걸어야하는 한 유선 또는 휴대폰으로 변경할 수있는 것처럼). 요컨대, 인터페이스는 속성이없는 훨씬 단순한 버전의 추상 클래스입니다.
또한 원하는만큼 인터페이스를 구현 (상속) 할 수 있지만 단일 상위 클래스 만 확장 (상속) 할 수 있습니다.
더 많은 정보
추상 클래스와 인터페이스