Program Tip

구현 vs 확장 : 언제 사용합니까?

programtip 2020. 9. 30. 11:19
반응형

구현 vs 확장 : 언제 사용합니까? 차이점이 뭐야?


이해하기 쉬운 언어 또는 일부 기사 링크로 설명하십시오.


extends위한 연장 클래스.

implements위한 구현 인터페이스를

인터페이스와 일반 클래스의 차이점은 인터페이스에서 선언 된 메서드를 구현할 수 없다는 것입니다. 인터페이스를 "구현"하는 클래스 만이 메소드를 구현할 수 있습니다. 인터페이스에 해당하는 C ++는 추상 클래스입니다 (정확히 동일하지는 않지만 거의).

또한 Java는 클래스에 대한 다중 상속지원하지 않습니다 . 이것은 여러 인터페이스를 사용하여 해결됩니다.

 public interface ExampleInterface {
    public void doAction();
    public String doThis(int number);
 }

 public class sub implements ExampleInterface {
     public void doAction() {
       //specify what must happen
     }

     public String doThis(int number) {
       //specfiy what must happen
     }
 }

이제 클래스 확장

 public class SuperClass {
    public int getNb() {
         //specify what must happen
        return 1;
     }

     public int getNb2() {
         //specify what must happen
        return 2;
     }
 }

 public class SubClass extends SuperClass {
      //you can override the implementation
      @Override
      public int getNb2() {
        return 3;
     }
 }

이 경우

  Subclass s = new SubClass();
  s.getNb(); //returns 1
  s.getNb2(); //returns 3

  SuperClass sup = new SuperClass();
  sup.getNb(); //returns 1
  sup.getNb2(); //returns 2

객체 지향 프로그래밍 에서 동적 바인딩, 다형성 및 일반적인 상속에 대해 더 많은 연구를 수행하는 것이 좋습니다.


프로필에 몇 가지 C ++ 질문이 있습니다. C ++에서 다중 상속 의 개념을 이해하면 (하나 이상의 다른 클래스에서 특성을 상속하는 클래스를 나타냄) Java는이를 허용하지 않지만 interfaceC ++의 순수 가상 클래스와 같은 일종의 keyword가 있습니다 . 많은 사람들이 언급했듯이, 당신 extend은 클래스 (그리고 당신은 하나에서만 확장 할 수 있습니다), 당신 implement은 인터페이스입니다.하지만 당신의 클래스는 당신이 원하는만큼 많은 인터페이스를 구현할 수 있습니다.

즉, 이러한 키워드와 사용을 제어하는 ​​규칙은 Java에서 다중 상속 가능성을 설명합니다 (수퍼 클래스는 하나만 가질 수 있지만 여러 인터페이스를 구현할 수 있음).


extends기본 클래스 에서 상속하는 경우 (즉, 기능 확장)를위한 것입니다.

implements인터페이스를 구현할 때 입니다.

시작하기 좋은 곳은 다음과 같습니다. 인터페이스 및 상속 .


일반적으로 인터페이스 구현에 사용되는 구현 기본 클래스 동작 또는 추상 클래스 확장에 사용되는 확장 입니다 .

extends : 파생 클래스는 기본 클래스를 확장 할 수 있습니다. 확립 된 관계의 행동을 재정의 할 수 있습니다. 파생 클래스 " "기본 클래스 유형입니다.

구현 : 계약을 구현하고 있습니다. "인터페이스를 구현하는 클래스 에는 "기능이 있습니다.

Java 8 릴리스에서 인터페이스는 인터페이스 자체에서 구현을 제공하는 인터페이스의 기본 메소드를 가질 수 있습니다 .

각각의 사용시기는이 질문을 참조하십시오.

인터페이스 대 추상 클래스 (일반 OO)

사물을 이해하는 예.

public class ExtendsAndImplementsDemo{
    public static void main(String args[]){

        Dog dog = new Dog("Tiger",16);
        Cat cat = new Cat("July",20);

        System.out.println("Dog:"+dog);
        System.out.println("Cat:"+cat);

        dog.remember();
        dog.protectOwner();
        Learn dl = dog;
        dl.learn();

        cat.remember();
        cat.protectOwner();

        Climb c = cat;
        c.climb();

        Man man = new Man("Ravindra",40);
        System.out.println(man);

        Climb cm = man;
        cm.climb();
        Think t = man;
        t.think();
        Learn l = man;
        l.learn();
        Apply a = man;
        a.apply();

    }
}

abstract class Animal{
    String name;
    int lifeExpentency;
    public Animal(String name,int lifeExpentency ){
        this.name = name;
        this.lifeExpentency=lifeExpentency;
    }
    public void remember(){
        System.out.println("Define your own remember");
    }
    public void protectOwner(){
        System.out.println("Define your own protectOwner");
    }

    public String toString(){
        return this.getClass().getSimpleName()+":"+name+":"+lifeExpentency;
    }
}
class Dog extends Animal implements Learn{

    public Dog(String name,int age){
        super(name,age);
    }
    public void remember(){
        System.out.println(this.getClass().getSimpleName()+" can remember for 5 minutes");
    }
    public void protectOwner(){
        System.out.println(this.getClass().getSimpleName()+ " will protect owner");
    }
    public void learn(){
        System.out.println(this.getClass().getSimpleName()+ " can learn:");
    }
}
class Cat extends Animal implements Climb {
    public Cat(String name,int age){
        super(name,age);
    }
    public void remember(){
        System.out.println(this.getClass().getSimpleName() + " can remember for 16 hours");
    }
    public void protectOwner(){
        System.out.println(this.getClass().getSimpleName()+ " won't protect owner");
    }
    public void climb(){
        System.out.println(this.getClass().getSimpleName()+ " can climb");
    }
}
interface Climb{
    public void climb();
}
interface Think {
    public void think();
}

interface Learn {
    public void learn();
}
interface Apply{
    public void apply();
}

class Man implements Think,Learn,Apply,Climb{
    String name;
    int age;

    public Man(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void think(){
        System.out.println("I can think:"+this.getClass().getSimpleName());
    }
    public void learn(){
        System.out.println("I can learn:"+this.getClass().getSimpleName());
    }
    public void apply(){
        System.out.println("I can apply:"+this.getClass().getSimpleName());
    }
    public void climb(){
        System.out.println("I can climb:"+this.getClass().getSimpleName());
    }
    public String toString(){
        return "Man :"+name+":Age:"+age;
    }
}

산출:

Dog:Dog:Tiger:16
Cat:Cat:July:20
Dog can remember for 5 minutes
Dog will protect owner
Dog can learn:
Cat can remember for 16 hours
Cat won't protect owner
Cat can climb
Man :Ravindra:Age:40
I can climb:Man
I can think:Man
I can learn:Man
I can apply:Man

이해해야 할 중요한 사항 :

  1. 강아지고양이는 동물 그리고 그들은 확장 remember()와 protectOwner공유 () name,lifeExpentency에서Animal
  2. 고양이는 올라갈 수 있지만 개는 올라갈 수 없습니다. Dog는 think () 할 수 있지만 Cat은 그렇지 않습니다 . 이러한 특정 기능에 추가 Cat하고 Dog그 기능을 구현하여.
  3. 사람은 동물이 아니지만 Think,Learn,Apply,Climb

이 예제를 통해 다음을 이해할 수 있습니다.

관련없는 클래스는 인터페이스를 통해 기능을 가질 수 있지만 관련 클래스는 기본 클래스의 확장을 통해 동작을 재정의합니다.


A classinterface. 클래스는 class. 마찬가지로 an interface은 다른 interface.

A class는 다른 하나만 확장 할 수 있습니다 class. A class는 여러를 구현할 수 있습니다 interface.

대신 abstract classes 및 interfaces를 언제 사용할지 더 알고 싶다면 다음 스레드를 참조하십시오. Interface vs Abstract Class (일반 OO)


인터페이스는 개체가 수행 할 수있는 작업에 대한 설명입니다. 예를 들어 조명 스위치를 켜면 조명이 켜지고 어떻게되는지 신경 쓰지 않습니다. 객체 지향 프로그래밍에서 인터페이스는 "X"가되기 위해 객체가 가져야하는 모든 기능에 대한 설명입니다. 다시 말하지만, 예를 들어 "ACTS LIKE"라이트는 turn_on () 메서드와 turn_off () 메서드를 가져야합니다. 인터페이스의 목적은 컴퓨터가 이러한 속성을 적용하고 TYPE T (인터페이스가 무엇이든)의 개체에 X, Y, Z 등의 함수가 있어야 함을 알 수 있도록하는 것입니다.

인터페이스는 컴퓨터가 개체 (클래스)에 특정 속성을 적용 할 수 있도록하는 프로그래밍 구조 / 구문입니다. 예를 들어, 자동차 등급과 스쿠터 등급, 트럭 등급이 있다고 가정 해 보겠습니다. 이 세 클래스 각각에는 start_engine () 액션이 있어야합니다. 각 차량에 대한 "엔진 시작"방법은 각 특정 클래스에 맡겨져 있지만 start_engine 작업이 있어야한다는 사실은 인터페이스 의 도메인입니다 .


아래 그림과 같이 클래스는 다른 클래스를 확장하고 인터페이스는 다른 인터페이스를 확장하지만 클래스는 인터페이스를 구현합니다. 여기에 이미지 설명 입력

자세한 내용


  • A가 B를 확장합니다.

    A와 B는 모두 클래스 또는 두 인터페이스입니다.

  • A는 B를 구현합니다.

    A는 클래스이고 B는 인터페이스입니다.

  • A가 인터페이스이고 B가 클래스 인 나머지 경우는 Java에서 합법적이지 않습니다.


Extends : 부모 클래스의 속성을 기본 클래스로 가져 오는 데 사용되며 자식 클래스에서 재정의 할 수있는 이미 정의 된 메서드를 포함 할 수 있습니다.

Implements : 하위 클래스에서 정의하여 인터페이스 (함수 시그니처 만있는 상위 클래스)를 구현하는 데 사용됩니다.

특별한 조건이 하나 있습니다. "새 인터페이스가 기존 인터페이스의 자식이되도록하려면 어떻게해야합니까?". 위의 조건에서 자식 인터페이스 는 부모 인터페이스를 확장 합니다.


구현은 인터페이스에 사용되며 확장은 클래스를 확장하는 데 사용됩니다.

더 쉬운 용어로 더 명확하게하기 위해, 인터페이스는 당신의 아이디어와 함께 적용하고 따라야하는 모델 인 사운드와 같습니다.

Extend는 클래스에 사용됩니다. 여기서는 더 많은 기능을 추가하여 이미 존재하는 것을 확장합니다.

몇 가지 추가 참고 :

인터페이스는 다른 인터페이스를 확장 할 수 있습니다.

인터페이스 구현 또는 특정 시나리오의 클래스 확장 중에서 선택해야하는 경우 인터페이스 구현으로 이동하십시오. 클래스는 여러 인터페이스를 구현할 수 있지만 하나의 클래스 만 확장 할 수 있기 때문입니다.


하위 클래스가 클래스를 확장하면 하위 클래스가 상위 유형에 정의 된 코드를 상속 (재사용)하고 재정의 할 수 있습니다. 클래스가 인터페이스를 구현할 때 클래스에서 생성 된 객체를 인터페이스의 값을 예상하는 모든 컨텍스트에서 사용할 수 있습니다.

여기서 진짜 문제는 우리가 무엇이든 구현하는 동안 단순히 우리가 그 방법을 그대로 사용하고 있다는 것을 의미합니다. 값과 반환 유형에 대한 변경 범위는 없습니다.

그러나 우리가 무엇이든 확장하면 그것은 당신의 클래스의 확장이됩니다. 변경하고, 사용하고, 재사용 할 수 있으며, 반드시 수퍼 클래스에서와 동일한 값을 반환 할 필요는 없습니다.


우리는 사용하는 서브 클래스가 확장 슈퍼 클래스를 서브 클래스가 이미 선언되어 일부 기능 (메소드 나 인스턴스 변수)를 사용하고자하는 경우에만 슈퍼 클래스를 , 아니면 약간의 기능을 수정하려면 슈퍼 클래스 (메소드 오버 라이딩을). 그러나 예를 들어 Animal 클래스 ( SuperClass )와 Dog 클래스 ( SubClass )가 있고 Animal 클래스에 정의한 메서드가 거의 없습니다. doEat (); , doSleep (); ... 그리고 더 많은.

이제 내 Dog 클래스는 Animal 클래스를 확장 할 수 있습니다. 만약 내 강아지가 Animal 클래스에 선언 된 메서드를 사용하도록하려면 Dog 객체를 생성하여 이러한 메서드를 호출 할 수 있습니다. 이렇게하면 먹고 자고 내가 원하는 모든 일을 할 수있는 개가 있다는 것을 보장 할 수 있습니다.

이제 어느 날 고양이 애호가가 작업 공간에 들어 와서 Animal 클래스를 확장하려고합니다 (고양이도 먹고 자고 있습니다). 그녀는 Cat 객체를 만들고 메서드 호출을 시작합니다.

그러나 누군가 Animal 클래스의 객체를 만들려고합니다. 고양이가자는 방법, 개가 먹는 방법, 코끼리가 마시는 방법을 말할 수 있습니다. 그러나 Animal 클래스의 객체를 만드는 것은 의미가 없습니다. 템플릿이기 때문에 일반적인 식사 방법을 원하지 않습니다.

대신에 아무도 인스턴스화 할 수 없지만 다른 클래스의 템플릿으로 사용할 수있는 추상 클래스를 만드는 것을 선호합니다.

결론적으로 인터페이스는 메소드 구현이없고 정의 (템플릿) 만 포함하는 추상 클래스 (순수 추상 클래스) 일뿐입니다. 따라서 인터페이스를 구현하는 사람은 누구나 doEat () 템플릿이 있다는 것을 알고 있습니다 . doSleep (); 그러나 그들은 자신의 doEat (); doSleep (); 그들의 필요에 따라 방법.

SuperClass의 일부를 재사용하고 싶을 때만 확장하고 (하지만 필요에 따라 언제든지 SuperClass의 메서드를 재정의 할 수 있음) 템플릿을 원할 때 구현하고 직접 정의하려는 경우에만 확장합니다. (당신의 필요에 따라).

저는 여러분과 코드를 공유 할 것입니다. 여러분은 다른 입력 세트로 시도하고 결과를 봅니다.

class AnimalClass {

public void doEat() {

    System.out.println("Animal Eating...");
}

public void sleep() {

    System.out.println("Animal Sleeping...");
}

}

public class Dog extends AnimalClass implements AnimalInterface, Herbi{

public static void main(String[] args) {

    AnimalInterface a = new Dog();
    Dog obj = new Dog();
    obj.doEat();
    a.eating();

    obj.eating();
    obj.herbiEating();
}

public void doEat() {
    System.out.println("Dog eating...");
}

@Override
public void eating() {

    System.out.println("Eating through an interface...");
    // TODO Auto-generated method stub

}

@Override
public void herbiEating() {

    System.out.println("Herbi eating through an interface...");
    // TODO Auto-generated method stub

}


}

정의 된 인터페이스 :

public interface AnimalInterface {

public void eating();

}


interface Herbi {

public void herbiEating();

}

가장 간단한 용어로 extends클래스 에서 상속하는 데 사용 되며 구현클래스에서 인터페이스 를 적용하는 데 사용됩니다.

확장 :

public class Bicycle {
    //properties and methods
}
public class MountainBike extends Bicycle {
    //new properties and methods
}

구현 :

public interface Relatable {
    //stuff you want to put
}
public class RectanglePlus implements Relatable {
    //your class code
}

여전히 혼란 스러우면 https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html을 읽으십시오.


Java 언어로 고유 한 새 클래스를 만들 때 두 키워드가 모두 사용됩니다.

Difference: implements means you are using the elements of a Java Interface in your class. extends means that you are creating a subclass of the base class you are extending. You can only extend one class in your child class, but you can implement as many interfaces as you would like.

Refer to oracle documentation page on interface for more details.

This can help to clarify what an interface is, and the conventions around using them.


Extends is used when you want attributes of parent class/interface in your child class/interface and implements is used when you want attributes of an interface in your class.

Example:

  1. Extends using class

    class Parent{

    }

    class Child extends Parent{

    }

  2. Extends using interface

    interface Parent{

    }

    interface Child extends Parent{

    }

  3. Implements

interface A{

}

class B implements A{

}

Combination of extends and implements

interface A{

}

class B

{

}

class C implements A,extends B{

}

extends

  • class extends only one class
  • interface extends one or more interfaces

implements

  • class implements one or more interfaces
  • interfaces 'can not' implements anything

abstract classes also act like class, with extends and implements


Those two keywords are directly attached with Inheritance it is a core concept of OOP. When we inherit some class to another class we can use extends but when we are going to inherit some interfaces to our class we can't use extends we should use implements and we can use extends keyword to inherit interface from another interface.

참고URL : https://stackoverflow.com/questions/10839131/implements-vs-extends-when-to-use-whats-the-difference

반응형