추상 클래스, 인터페이스의 차이점 및 사용시기


15

최근에는 OOP를 둘러보기 시작했습니다. 이제는 추상 클래스와 인터페이스의 차이점에 대해 더 많이 읽을수록 혼란스러워집니다. 지금까지 어느 것도 인스턴스화 할 수 없습니다. 인터페이스는 골격을 결정하는 구조적 청사진입니다. 코드를 부분적으로 구현할 수있어 초록이 다릅니다.

나는 나의 특정한 상황을 통해 이것들에 대해 더 배우고 싶습니다. 약간의 배경 정보를 더 원한다면 첫 번째 질문에 대한 링크가 있습니다. 새 수업에 적합한 디자인 모델은 무엇입니까?

내가 만든 두 가지 클래스는 다음과 같습니다.

class Ad {
    $title;
    $description
    $price;

    function get_data($website){  }

    function validate_price(){  }
 }


class calendar_event {
    $title;
    $description

    $start_date;

    function get_data($website){ //guts }

    function validate_dates(){ //guts }
 }

보시다시피이 클래스는 거의 동일합니다. 아니 여기에 표시하지만, 다른 기능이있다 like get_zip(), save_to_database()내 수업에 걸쳐 일반적이다. 또한 클래스와 관련된 모든 일반적인 방법과 속성 (예 : 마일리지, 무게)을 갖는 다른 클래스의 자동차 및 애완 동물을 추가했습니다.

이제 DRY 원칙 을 위반했으며 여러 파일에서 동일한 코드를 관리하고 변경하고 있습니다. 나는 보트, 말 또는 다른 것과 같은 더 많은 수업을 계획하고 있습니다.

인터페이스 또는 추상 클래스를 사용하는 곳입니까? 내가 추상 클래스에 대해 이해 한 것으로부터, 나는 슈퍼 클래스를 추상 클래스에 내장 된 모든 공통 요소를 가진 템플릿으로 사용하고, 이후 클래스에서 특별히 필요한 항목 만 추가 할 것이다. 예를 들면 다음과 같습니다.

abstract class content {
    $title;
    $description


    function get_data($website){  }

    function common_function2() { }
    function common_function3() { }
 }


class calendar_event extends content {

    $start_date;

    function validate_dates(){  }
 }

또는 인터페이스를 사용하고 이것들이 매우 유사하기 때문에 각 서브 클래스가 무결성을 위해 사용해야하는 구조를 만들고 각 클래스를 책임지는 최종 개발자에게 맡겨야합니다. 공통 기능의 세부 사항. 제 생각에는 특정 클래스의 요구에 따라 일부 '공통적 인'기능을 조정해야 할 수도 있습니다.

위의 모든 사항에도 불구하고, 추상 클래스와 인터페이스의 이유와 이유를 완전히 이해하고 있다고 생각되면 반드시 올바른 방향으로 생각하지 말고 올바른 방향으로 나아가십시오.

감사!


온라인에는 좋은 예가 많이 있습니다. 나는 이것이 그들 중 하나라고 생각합니다. javapapers.com/core-java/abstract-and-interface-core-java-2/…
Siva

답변:


26

평신도의 관점에서 :

인터페이스"할 수있는 것으로 / 처리 할 수있는" 유형의 관계를위한 것입니다.

추상적 인 (구체적인) 클래스"is" 종류의 관계를위한 것입니다.

다음 예를보십시오.

class Bird extends Animal implements Flight;
class Plane extends Vehicle implements Flight, AccountableAsset;
class Mosquito extends Animal implements Flight;
class Horse extends Animal;
class RaceHorse extends Horse implements AccountableAsset;
class Pegasus extends Horse implements Flight;

Bird, Mosquito그리고 Horse 있습니다 Animals . 그들은 관련이 있습니다. 그들은 Animal과 같은 일반적인 방법을 상속 eat(), metabolize() and reproduce()합니다. 어쩌면 그들은이 방법을 재정 의하여 약간의 추가 기능을 추가하지만 Animal에서 구현 된 기본 동작을 활용합니다.metabolizeGlucose().

Plane관련이없는 Bird, Mosquito또는 Horse.

Flight이종 관련없는 클래스 등으로 구현 Bird하고 Plane.

AccountableAsset또한 이종 관련없는 클래스 등으로 구현 Plane하고 RaceHorse.

Horse 비행을 구현하지 않습니다.

보시다시피 클래스 (개요 또는 구체적) 는 계층 구조를 구축하는 데 도움이되므로 코드를 계층 의 상위 수준에서 하위 수준으로 상속 할 수 있습니다 . 이론적으로 계층 구조가 낮을수록 행동이 더 전문화되지만 이미 처리 된 많은 것들에 대해 걱정할 필요는 없습니다.

반면에 인터페이스 는 계층 구조를 만들지 않지만 계층 간 특정 동작을 균질화 하여 특정 컨텍스트의 계층 구조에서 추상화 할 수 있습니다.

예를 들어 프로그램 AccountableAssetsRaceHorses또는 에 관계없이 그룹의 값을 합산하도록 할 수 있습니다 Planes.


놀랄 만한. 인터페이스는 can do/can be treated as추상 클래스가 기초적인 역할을 하는 특정 기능 섹션을 제공합니다 !
Abhiroj Panwar 19

13

둘 사이의 차이점을 알고 있기 때문에 논리적으로 대답을 추론 할 수 있습니다.

인터페이스 는 공통 계약을 정의합니다. 모든 동물이 Eat (), Move (), Attack () 등과 같은 기능을 공유하는 IAnimal이라는 인터페이스와 같이, 모든 동물은 동일한 기능을 공유하지만 모두 또는 대부분은 달성 방법이 다릅니다 (구현) 그것.

추상 클래스 는 공통 구현 및 선택적으로 공통 계약을 정의합니다. 예를 들어 간단한 계산기는 모든 기본 논리 및 비트 연산자를 구현 한 다음 ScientificCalculator, GraphicalCalculator 등으로 확장되는 추상 클래스로 규정 될 수 있습니다.

공통 구현이있는 경우 반드시 기능을 확장 할 추상 클래스로 캡슐화하십시오. 나는 거의 PHP 경험이 없지만 비 상수 필드로 인터페이스를 만들 수 있다고 생각하지 않습니다. 필드가 인스턴스 클래스간에 공통 인 경우 getter 및 setter를 통해 필드에 대한 액세스를 정의하지 않는 한 Abstract 클래스를 사용해야합니다.

또한 Google에는 결과가 부족하지 않은 것 같습니다.


3

긴 이야기가 짧습니다. 추상 클래스는 상속 클래스 내에 어떤 메소드가 있어야하는지에 대한 템플릿을 제공한다는 점에서 인터페이스와 매우 유사하지만 큰 차이점이 있습니다.-인터페이스는 상속 클래스에 존재해야하는 메소드의 이름 / 유형 만 정의합니다. 클래스는 완전한 기본 메소드 코드를 가질 수 있으며 세부 사항 만 재정의해야 할 수도 있습니다. -인터페이스는 액세스 수정자를 가질 수 없습니다. -인터페이스는 필드를 가질 수 없습니다. -클래스는 클래스를 여러 번 상속 할 수 없지만 여러 인터페이스를 상속 할 수 있습니다. 또한 클래스는 계층 구조를 제공하므로 특정 클래스에서 파생 된 클래스 만 추상 클래스의 지침 (개체-> 특정 개체-> 매우 특정 개체)을 따라야합니다. 반면에 인터페이스는 어디에서나 누구나 상속 할 수 있습니다.

내 생각에 추상 클래스는 코드의 기본 구현을 즉시 제공 할 수 있다는 점에서 더 일반적이지만 특정 클래스를 표준화 해야하는 대규모 프로젝트에서는 인터페이스가 유용 할 수 있습니다.

희망은 도움이되지만이 온라인에는 많은 정보가 있습니다.


2
Classes cannot have multiple inheritance-Java 및 C #과 같은 언어에는 해당되며 C ++에는 해당되지 않습니다.
Robert Harvey

3

먼저 인터페이스와 추상 클래스를 모두 제공한다는 것을 이해해야합니다. 그 이유와 두 가지의 핵심 차이점은 다른 코드를 재사용하여 다른 문제를 해결할 수 있기 때문입니다.

인터페이스를 사용하면 다른 구현으로 클라이언트 코드를 재사용 할 수 있습니다. get_data ($ website) 클래스의 클라이언트는 $ title 또는 $ description 항목을 신경 쓰지 않습니다. 콘텐츠에 데이터를로드하도록 지시하고 싶습니다. 다른 유형의 컨텐츠가있는 경우 일부는 $ description이 필요하고 일부는 필요하지 않은 경우 하위 클래스의 서명 만 지정하는 ContentInterface 클래스를 제공 할 수 있습니다. 이제 클라이언트는 정확하게 작동하는 방식을 모른 채 다양한 컨텐츠를 가질 수 있습니다. 리스 코프 치환 원칙은 이 아이디어를 공부에 대한 읽기 좋은 일이다. 나는 또한 밥 아저씨가이 주제에 관해 쓴 글을 좋아 합니다. 인터페이스는 단위 테스트에 매우 중요하며, 인터페이스를 만드는 것은 배우는 좋은 습관입니다.

추상 클래스를 사용하면 공통 조상을 공유하는 일련의 클래스에서 공통 구현 세부 사항을 재사용 할 수 있습니다. 귀하의 질문에 추상적 클래스에서 구현을 상속받는 이유를 잘 다루는 것 같습니다. 기본 클래스의 내부에 의존하는 것은 여전히 ​​위험합니다. 캡슐화를 위반하고 기본 클래스의 특정 구현 세부 정보에 의존하는 자식을 만드는 것은 매우 쉽습니다. 템플릿 메소드 패턴은 캡슐화를 위반하지 않고 기본 클래스를 사용하는 방법에 대한 일반적이고 건강한 예제를 제공합니다.

제가 보여 드렸듯이 클래스 계층의 클라이언트를위한 인터페이스를 제공 할 것이므로 클라이언트 코드에 영향을주지 않고 구현을 안전하게 변경할 수 있습니다. 이를 통해 클라이언트는 인터페이스를 상속 하는 모의 객체 를 사용하여 단위 테스트를 작성할 수 있습니다. 또한 공통 논리를 재사용하거나 하위 클래스에 의미를 적용 할 수있는 추상 클래스도 제공합니다.


3

차이는 미묘하지만 분명합니다. 인터페이스는 다형성 동작에 관한 것입니다. 추상 클래스는 재사용 및 다형성 동작에 관한 것입니다.

재사용 및 다형성 동작에 중점을 두려면 추상 클래스를 선택하십시오. 예를 들어 직원마다 유형이 다르지만 모두 공통점이 있습니다. 공통점은베이스 추상 클래스로 표현 될 수 있으므로 따라서, 추상 클래스를 표현하기에 적합 Employee하고, 차이 등 파생 클래스에서 구현 될 수 Manager또는 Worker기타

다형성 동작에만 중점을 두려면 인터페이스를 선택하십시오. 인터페이스는 계약, 즉 특정 동작을 준수한다고 말하는 객체 또는 계층에 관한 것입니다. 예를 들어, 모든 직원은 프로비저닝을 떠나지 만 다른 유형의 직원은 다른 유형의 프로비저닝을가집니다. 따라서 직원마다 각각 다른 휴가 계산기가 필요합니다. 모든 유형의 직원 LeaveCalculatorCalculate()행동 방식이 다른 인터페이스를 다르게 구현할 수 있기 때문에 여기에서 인터페이스를 선택하는 것이 좋습니다 .


-3
  1. 주요 차이점은 Java 인터페이스의 메소드는 내재적으로 추상적이며 구현이 불가능하다는 것입니다. Java 추상 클래스에는 기본 동작을 구현하는 인스턴스 메소드가있을 수 있습니다.
  2. Java 인터페이스에서 선언 된 변수는 기본적으로 final입니다. 추상 클래스에는 비 최종 변수가 포함될 수 있습니다.
  3. Java 인터페이스의 멤버는 기본적으로 공용입니다. Java 추상 클래스는 개인, 보호 등의 일반적인 클래스 멤버를 가질 수 있습니다.
  4. Java 인터페이스는 키워드 "implements"를 사용하여 구현해야합니다. 키워드“extends”를 사용하여 Java 추상 클래스를 확장해야합니다.
  5. 인터페이스는 다른 Java 인터페이스를 확장 할 수 있으며 추상 클래스 만 다른 Java 클래스를 확장하고 여러 Java 인터페이스를 구현할 수 있습니다.
  6. Java 클래스는 여러 인터페이스를 구현할 수 있지만 하나의 추상 클래스 만 확장 할 수 있습니다.
  7. 인터페이스는 절대적으로 추상적이며 인스턴스화 할 수 없습니다. Java 추상 클래스도 인스턴스화 할 수 없지만 main ()이 있으면 호출 할 수 있습니다.
  8. 자바 추상 ​​클래스와 비교할 때 자바 인터페이스는 추가 간접 처리가 필요하므로 느립니다.
  9. Java의 인터페이스 및 추상 클래스는 인터페이스에서 추상이 아닌 메소드를 작성할 수 없으며 인터페이스의 모든 메소드는 기본적으로 추상이지만 추상 클래스에서 추상이 아닌 메소드를 작성할 수 있습니다.
  10. Java의 추상 클래스 대 인터페이스는 인터페이스가 유형 선언에 더 적합하고 추상 클래스는 코드 재사용 및 진화 관점에 더 적합하다는 것입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.