CodeGym /Java Blog /무작위의 /Java의 상속
John Squirrels
레벨 41
San Francisco

Java의 상속

무작위의 그룹에 게시되었습니다
자바는 객체지향 언어이다. 이는 Java의 모든 것이 클래스와 해당 객체로 구성되고 OOP(객체 지향 프로그래밍)의 패러다임을 따른다는 것을 의미합니다. 그러한 패러다임 중 하나는 한 클래스가 다른 클래스의 기능(필드 및 메소드)을 상속하도록 허용하는 Java의 메커니즘인 상속입니다. 간단히 말해서, Java에서 상속이란 기존 클래스를 기반으로 새 클래스를 만드는 것을 의미합니다. Java의 상속 - 1

Java 상속의 주요 행위자

  • 상속은 클래스가 부모(상속하는 클래스)의 속성과 메서드를 부분적으로 또는 완전히 반복할 수 있다는 개념입니다.
  • 자식 클래스, 하위 클래스, 확장 클래스, 파생 클래스는 다른 클래스에서 상속되는 클래스입니다.
  • 상위 클래스, 슈퍼클래스 또는 기본 클래스는 여러 함수를 갖는 클래스이며 이러한 함수는 다른 클래스(자식 클래스)에 전달(상속)될 수 있습니다.
  • 메서드 재정의는 파생 클래스 메서드의 동작을 변경하는 것입니다. 이는 일반적으로 보다 구체적이고 세련된 동작입니다. 이미 상위 클래스에 있는 상속인의 메서드를 재정의하면 이는 일종의 상위 메서드를 대체합니다.
  • 클래스에는 하나의 상위 클래스만 있을 수 있지만 각 클래스에는 여러 개의 "자식"이 있을 수 있습니다.

작동 원리

상속 체인은 가장 추상적인 클래스에서 보다 구체적인 클래스로 연결됩니다. 즉, 슈퍼클래스는 클래스 체인에서 가장 추상적인 클래스입니다. 종종 이는 추상(구현이 필요하지 않은 기본 클래스)으로 표시됩니다. 모든 추가 클래스는 더 구체적입니다. 예를 들어, "Gadget"이라는 클래스가 있습니다. 필드(또는 상태) "무게" 필드 배터리 용량, 필드 충전 수준 및 방법(또는 동작) "작업" 및 충전을 가질 수 있습니다. 이 경우 메서드는 추상적일 수 있습니다. 즉, 특정 구현이 없습니다. 어떤 종류의 장치인지는 말할 수 없지만 절대적으로 충전식 장치입니다. Gadget 클래스의 Phone 하위 클래스를 만들어 보겠습니다. 더 이상 무게와 배터리를 다시 정의할 필요가 없으며 단순히 추상적인 장치에서 상속받습니다. 그러나 작업의 동작을 명확히 해야 합니다. "화면 대각선", 커넥터 등 다른 필드를 추가할 수도 있습니다. 새로운 방법인 "운영 체제 업데이트"를 추가할 수 있습니다. 다음으로 두 개의 클래스를 더 만들 수 있으며 둘 다 Phone, Android 및 iPhone에서 상속됩니다. 두 클래스 모두 가젯과 스마트폰의 모든 필드와 메서드를 상속하며 메서드를 재정의할 수 있습니다. 첫 번째 클래스에는 "브랜드 이름" 필드가 필요하지만 iPhone에는 이러한 스마트폰을 생산하는 회사가 하나뿐이므로 이 필드가 필요하지 않습니다.
class Gadget {}
}
//subclass of Gadget class
class Phone extends Gadget {}
//subclass of Phone class
class IPhone extends Phone {}
//subclass of Phone class
class AndroidPhone extends Phone {}
하위 클래스는 상위 클래스의 모든 공개 및 보호 멤버를 상속합니다. 하위 클래스가 어떤 패키지에 있는지는 중요하지 않습니다. 하위 클래스가 상위 클래스와 동일한 패키지에 있으면 상위 클래스의 package-private 멤버도 상속합니다. 상속된 멤버를 그대로 사용하거나, 바꾸거나, 숨기거나, 새 멤버를 추가할 수 있습니다.
  • 다른 필드와 같이 상속된 필드를 직접 사용할 수 있습니다.
  • 상위 클래스와 동일한 이름을 가진 필드를 하위 클래스에서 선언할 수 있습니다. 숨기고 있는 것입니다(그러므로 하지 않는 것이 좋습니다).
  • 하위 클래스(상위 클래스에 없는 필드)에서 새 필드를 선언할 수 있습니다.
  • 상속된 메서드는 파생 클래스에서 재정의하지 않고 직접 사용할 수 있습니다.
  • 또한 상위 클래스의 메서드와 동일한 시그니처를 가진 하위 클래스에 새 인스턴스 메서드를 작성할 수도 있습니다. 이 절차가 이를 재정의합니다.
  • Parent 클래스에서 선언되지 않은 새 메서드를 자식 클래스에서 선언할 수 있습니다.
  • 암시적으로 또는 super 키워드를 사용하여 슈퍼클래스 생성자를 호출하는 하위 클래스 생성자를 작성할 수 있습니다.

가중치 및 상표 필드와 work() 메서드가 포함된 기본 MusicalInstrument 클래스를 만들어 보겠습니다. 또한 생성자를 정의합니다.
public class MusicalInstrument {
   int weight;
   String tradeMark;

   public MusicalInstrument(int weight, String tradeMark) {
       this.weight = weight;
       this.tradeMark = tradeMark;
   }

   public void work() {
       System.out.println("the instrument is playing...");
   }
}
어떤 악기인지, 어떻게 연주하는지 전혀 불분명합니다. 좀 더 구체적인 악기인 바이올린을 만들어 보겠습니다. 이는 악기와 동일한 필드를 갖습니다(super 키워드를 사용하여 생성자에서 호출됩니다. 작업 방법을 재정의하고 문자열별로 바이올린 현을 설정하는 방법을 만들 수도 있습니다.
public class Violin extends MusicalInstrument {
   String master;
   String owner;
   int age;
   boolean isTuned;

   public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
       super(weight, tradeMark);
       this.master = master;
       this.owner = owner;
       this.age = age;
       this.isTuned = isTuned;
   }

   @Override
   public void work() {
       System.out.println("THe violin's playing");

   }

   public void violinTuning () {
     System.out.println("I'm tuning 1st string...");
     System.out.println("I'm tuning 2nd string...");
     System.out.println("I'm tuning 3rd string...");
     System.out.println("I'm tuning 4th string...");
}


}
Violin 클래스를 테스트하고 상속이 어떻게 작동하는지 정확하게 알아보기 위해 Demo 클래스를 만들어 보겠습니다 .
public class InheritDemo {

   public static void main(String[] args) {

       Violin violin = new Violin(1, null, "Amati", "Kremer", 285, false);
       violin.violinTuning();
       violin.work();
   }
}
이 경우 프로그램의 출력은 다음과 같습니다.
나는 1번 현을 조율하고 있다... 나는 2번 현을 조율하고 있다... 나는 3번 현을 조율하고 있다... 나는 4번 현을 조율하고 있다... 바이올린이 연주되고 있다
즉, 하위 클래스에 재정의된 메서드가 있으면 상위 메서드는 더 이상 호출되지 않습니다. 거기에 없으면 어떻게 되나요? 즉, Violin 클래스는 다음과 같습니다.
public class Violin extends MusicalInstrument {
   String master;
   String owner;
   int age;
   boolean isTuned;

   public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
       super(weight, tradeMark);
       this.master = master;
       this.owner = owner;
       this.age = age;
       this.isTuned = isTuned;
   }

  // @Override


 //  }

   public void violinTuning () {
       System.out.println("I'm tuning 1st string...");
       System.out.println("I'm tuning 2nd string...");
       System.out.println("I'm tuning 3rd string...");
       System.out.println("I'm tuning 4th string...");
   }

}
출력은 다음과 같습니다
1번현 조율 중... 2번 현 조율 중... 3번 현 조율 중... 4번 현 조율 중... 악기가 연주 중입니다...
즉, 조상 메서드가 자동으로 호출됩니다. 그런데 상위 클래스를 통해 하위 클래스를 정의할 수 있습니다. 즉, 업캐스팅을 수행할 수 있습니다.
Parent parent = new Child()
이 초기화는 상위 클래스에 있는 멤버와 재정의된 메서드에만 액세스하는 데 사용됩니다. 우리의 예에서는 다음과 같습니다:
public class InheritDemo {

   public static void main(String[] args) {

       MusicalInstrument violin = new Violin(1, null, "Amati", "Kremer", 285, false);
       //violin.violinTuning();
       violin.work();
   }
}
이런 경우에는 바이올린 방식을 구성할 수 없습니다. 그러나 동시에 하위 클래스의 work() 메서드가 있으면 호출됩니다.

Java 플랫폼 클래스 계층 구조

Java에서는 모든 것이 클래스로 구성되며 계층 구조에 종속됩니다. 질문이 생깁니다: 다른 모든 클래스가 상속되는 클래스가 있습니까? 대답은 '예'입니다. 실제로 그러한 클래스가 존재합니다. 그리고 간단히 Object 라고 부릅니다 . java.lang 패키지의 Object 클래스는 사용자가 생성한 클래스 포함하여 모든 클래스에 공통적인 동작을 정의하고 구현합니다. Java 플랫폼에서는 많은 클래스가 Object 에서 직접 파생되고 , 다른 클래스는 이러한 클래스 중 일부에서 파생되는 식으로 클래스 계층 구조를 형성합니다.

Java의 상속 유형

Java의 몇 가지 상속 유형을 강조해 보겠습니다. 1. 단일 상속 이 유형은 위의 예와 마찬가지로 하위 클래스가 하나의 슈퍼 클래스의 기능을 상속합니다. 아래 이미지에서 클래스 A는 파생 클래스 B의 기본 클래스 역할을 합니다. 2. 다단계 상속 이것은 단지 상속 체인입니다. 즉, 기본 클래스 A가 있고, 클래스 B가 이 클래스에서 상속되고, 클래스 C가 있습니다. 클래스 B에서 상속됩니다. Java에서 클래스는 조부모의 멤버에 직접 액세스할 수 없습니다. 3. 계층적 상속 계층적 상속에서는 하나의 클래스가 둘 이상의 하위 클래스에 대한 슈퍼 클래스(기본 클래스) 역할을 합니다. 위에서 우리는 AndroidPhone과 IPhone이라는 두 개의 "자식"을 가질 수 있는 Phone 클래스의 예를 제시했습니다.
class A {
    public void printA() {
System.out.println("A");
 }
}

class B extends A {
    public void printB() {
 System.out.println(" B"); }
}

class C extends A {
    public void printC() {
System.out.println("C");
}
}

class D extends A {
    public void printD() {
System.out.println("D");
 }
}

public class Demo {
    public static void main(String[] args)
    {
        B objB = new B();
        objB.printA();
        objB.printB();

        C objC = new C();
        objC.printA();
        objC.printC();

        D objD = new D();
        objD.printA();
        objD.printD();
    }
}
출력은 다음과 같습니다
A B A C A D
4. 다중 상속, 즉 여러 조상의 존재... 하지만 잠깐, 전통적인 다중 상속은 Java에서 지원되지 않습니다. 어느 정도는 클래스가 아닌 인터페이스를 사용하여 구현할 수 있습니다.
interface A {
   public void printA();
}

interface B {
   public void printB();
}

interface C extends A, B {
   public void print();
}
class InheritDemo implements C {
   @Override
   public void print()
   {
       System.out.println("Print something");
   }

   @Override
   public void printA() {
   }

   @Override
   public void printB() {
   }
}
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION