인터페이스와 추상 클래스의 차이점은 정확히 무엇입니까?
답변
인터페이스
인터페이스는 계약입니다 . 인터페이스를 작성하는 사람은 ” 이봐, 나는 그런 식으로 보는 것을 받아들입니다 “라고 말하고, 인터페이스를 사용하는 사람은 ” 좋아요. 내가 쓰는 클래스는 그렇게 보입니다 “라고 말합니다 .
인터페이스는 빈 쉘 입니다. 메소드의 서명 만 있습니다. 이는 메소드에 본문이 없음을 의미합니다. 인터페이스는 아무것도 할 수 없습니다. 패턴 일뿐입니다.
예를 들어 (의사 코드) :
// I say all motor vehicles should look like this:
interface MotorVehicle
{
void run();
int getFuel();
}
// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{
int fuel;
void run()
{
print("Wrroooooooom");
}
int getFuel()
{
return this.fuel;
}
}
인터페이스를 구현하는 것은 클래스가 아니고 이름이 많기 때문에 CPU를 거의 소비하지 않으므로 값 비싼 조회가 필요하지 않습니다. 임베디드 장치와 같이 중요 할 때 유용합니다.
추상 수업
인터페이스와 달리 추상 클래스는 클래스입니다. 그것들을 상속받을 때 찾아야하기 때문에 사용하기가 더 비쌉니다.
추상 클래스는 인터페이스와 비슷하게 보이지만 더 많은 것이 있습니다. 동작을 정의 할 수 있습니다. ” 이 수업은 그렇게 생겼어야하고 공통점이 있으므로 공란을 채우십시오! ” 라고 말하는 사람에 대한 것입니다 .
예를 들면 다음과 같습니다.
// I say all motor vehicles should look like this:
abstract class MotorVehicle
{
int fuel;
// They ALL have fuel, so lets implement this for everybody.
int getFuel()
{
return this.fuel;
}
// That can be very different, force them to provide their
// own implementation.
abstract void run();
}
// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
void run()
{
print("Wrroooooooom");
}
}
이행
추상 클래스와 인터페이스는 다른 개념으로 간주되지만 구현으로 인해 해당 설명이 때때로 사실이 아닙니다. 때때로, 그들은 당신이 생각하는 것조차도 아닙니다.
Java에서는이 규칙이 강력하게 적용되는 반면, PHP에서는 인터페이스가 메소드가 선언되지 않은 추상 클래스입니다.
파이썬에서 추상 클래스는 ABC 모듈에서 얻을 수있는 프로그래밍 트릭이며 실제로 메타 클래스와 클래스를 사용하고 있습니다. 인터페이스는이 언어의 오리 타이핑과 더 관련이 있으며 설명자와 호출자를 호출하는 특수 메소드 (__method__ 메소드)가 혼합되어 있습니다.
프로그래밍과 마찬가지로 다른 언어로는 이론, 실습 및 실습이 있습니다.
답변
추상 클래스 와 인터페이스 의 주요 기술적 차이점 은 다음 과 같습니다.
-
추상 클래스는 상수, 멤버, 메소드 스텁 (본문이없는 메소드) 및 정의 된 메소드를 가질 수 있지만 인터페이스는 상수 및 메소드 스텁 만 가질 수 있습니다 .
-
추상 클래스의 메소드와 멤버는 가시성 으로 정의 할 수 있지만 , 인터페이스의 모든 메소드는
public
(기본적으로 public 으로 정의 됨)으로 정의해야합니다 . -
추상 클래스를 상속 할 때 구체적인 자식 클래스 는 추상 메서드를 정의해야 하지만 추상 클래스는 다른 추상 클래스를 확장 할 수 있으며 부모 클래스의 추상 메서드는 정의 할 필요가 없습니다.
-
마찬가지로 다른 인터페이스를 확장하는 인터페이스 는 부모 인터페이스의 메소드를 구현할 책임 이 없습니다 . 인터페이스가 구현을 정의 할 수 없기 때문입니다.
-
자식 클래스는 단일 클래스 (개요 또는 구체적) 만 확장 할 수있는 반면 인터페이스는 확장하거나 클래스가 여러 다른 인터페이스를 구현할 수 있습니다 .
-
자식 클래스는 가시성 이 같거나 적은 추상 메소드를 정의 할 수 있지만, 인터페이스를 구현하는 클래스는 가시성이 동일한 메소드를 정의해야합니다 (공용).
답변
인터페이스에는 기능의 정의 / 서명 만 포함되며, 공통 서명뿐만 아니라 몇 가지 공통 기능이있는 경우 추상 클래스를 사용해야합니다. 추상 클래스를 사용하면 동시에 동작과 기능을 모두 제공 할 수 있습니다. 추상 클래스를 상속받는 다른 개발자는 공백 만 채우면되기 때문에이 기능을 쉽게 사용할 수 있습니다.
http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html
http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html
http://www.dotnetbull.com/2011/11/what-is-interface-in -c-net.html
답변
설명은 여기에서 찾을 수 있습니다 : http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm
추상 클래스는 프로그래머가 부분적으로 만 구현하는 클래스입니다. 하나 이상의 추상 메소드를 포함 할 수 있습니다. 추상 메소드는 단순히 메소드가 하위 클래스에서 구현되어야 함을 프로그래머에게 알리는 기능 정의입니다.
인터페이스는 추상 클래스와 유사합니다. 실제로 인터페이스는 클래스 및 추상 클래스와 동일한 네임 스페이스를 차지합니다. 따라서 클래스와 이름이 같은 인터페이스를 정의 할 수 없습니다. 인터페이스는 완전히 추상적 인 클래스입니다. 그 메소드 중 어느 것도 구현되지 않으며 클래스 서브 클래스 대신 해당 인터페이스를 구현한다고합니다.
어쨌든 인터페이스에 대한이 설명이 다소 혼란 스럽습니다. 보다 일반적인 정의는 다음과 같습니다 . 인터페이스는 클래스를 구현해야하는 계약을 정의합니다. 인터페이스 정의는 구현 코드없이 공개 멤버의 서명으로 구성됩니다.
답변
많은 답변에서 이미 언급 된 차이점을 강조하고 싶지 않습니다 (인터페이스의 변수에 대한 공개 정적 최종 수정 자 및 추상 클래스의 보호 된 개인 메소드 지원)
간단히 말해서 다음과 같이 말하고 싶습니다.
인터페이스 : 여러 관련없는 객체로 계약을 구현하려면
추상 클래스 : 여러 관련 개체간에 동일하거나 다른 동작을 구현하려면
오라클 문서에서
다음과 같은 경우 추상 클래스 사용을 고려하십시오 .
- 밀접하게 관련된 여러 클래스간에 코드를 공유하려고합니다.
- 추상 클래스를 확장하는 클래스에는 많은 공통 메소드 또는 필드가 있거나 public 이외의 액세스 수정 자 (예 : 보호 및 개인)가 필요합니다.
- 비 정적 또는 최종이 아닌 필드를 선언하려고합니다.
다음과 같은 경우 인터페이스 사용을 고려하십시오 .
- 관련없는 클래스가 인터페이스를 구현할 것으로 기대합니다. 예를 들어, 많은 관련이없는 객체가
Serializable
인터페이스 를 구현할 수 있습니다. - 특정 데이터 유형의 동작을 지정하려고하지만 누가 그 동작을 구현하는지는 신경 쓰지 않습니다.
- 여러 유형의 상속을 활용하려고합니다.
추상 클래스는 구체적인 클래스와 “is”관계를 설정합니다. 인터페이스는 클래스에 “있다”기능을 제공합니다.
Java
프로그래밍 언어를 찾고 있다면 다음과 같은 몇 가지 추가 업데이트가 있습니다.
Java 8은 메소드 기능 을 제공하여 클래스 interface
와 abstract
클래스 사이의 간격 을 어느 정도 줄 default
였습니다. 인터페이스에 메소드 구현 이 없으므로 더 이상 유효하지 않습니다.
자세한 내용은이 설명서 페이지 를 참조하십시오.
더 잘 이해하기위한 코드 예제에 대해서는이 SE 질문을 살펴보십시오.
답변
몇 가지 중요한 차이점 :
테이블 형태로 :
으로 javapapers에서 조에서 언급 :
1. 주요 차이점은 Java 인터페이스의 메소드는 내재적으로 추상적이며 구현이 불가능하다는 것입니다. Java 추상 클래스에는 기본 동작을 구현하는 인스턴스 메소드가있을 수 있습니다.
2. Java 인터페이스에 선언 된 변수는 기본적으로 final입니다. 추상 클래스에는 비 최종 변수가 포함될 수 있습니다.
Java 인터페이스의 멤버는 기본적으로 공용입니다. Java 추상 클래스는 개인, 보호 등과 같은 일반적인 클래스 멤버의 풍미를 가질 수 있습니다.
4.Java 인터페이스는 키워드 “구현물”을 사용하여 구현해야합니다. 키워드“extends”를 사용하여 Java 추상 클래스를 확장해야합니다.
5. 인터페이스는 다른 Java 인터페이스 만 확장 할 수 있으며 추상 클래스는 다른 Java 클래스를 확장하고 여러 Java 인터페이스를 구현할 수 있습니다.
6. Java 클래스는 여러 인터페이스를 구현할 수 있지만 하나의 추상 클래스 만 확장 할 수 있습니다.
7. 인터페이스는 절대적으로 추상적이며 인스턴스화 할 수 없습니다. Java 추상 클래스도 인스턴스화 할 수 없지만 main ()이 있으면 호출 할 수 있습니다.
8. 자바 추상 클래스와 비교할 때 자바 인터페이스는 추가 간접 처리가 필요하므로 느립니다.
답변
요점은 다음과 같습니다.
- 초록은 객체 지향 입니다. 그것은 ‘객체’가 가져야 할 기본 데이터 및 / 또는 기능을 제공합니다. 객체의 기본 특성 인 객체의 기능과 수행 가능한 작업에 관심이 있습니다. 따라서 동일한 추상 클래스에서 상속 된 객체는 기본 특성 (일반화)을 공유합니다.
- 인터페이스는 기능 지향적 입니다. 객체가 가져야하는 기능을 정의합니다. 인터페이스에 정의 된 이러한 기능을 수행 할 수있는 오브젝트가 무엇이든 상관 없습니다. 다른 모든 것을 무시합니다. 객체 / 클래스는 여러 기능 그룹을 포함 할 수 있습니다. 따라서 클래스가 여러 인터페이스를 구현할 수 있습니다.