types inheritance java single vs multiple inheritance
간단한 예제를 통해 Java의 다양한 상속 유형에 대해 알아보십시오. Java가 다중 상속을 지원하는지 확인하십시오.
지난 튜토리얼에서 독자에게 상속과 관련된 다양한 기본 개념과 함께 Java의 상속을 소개했습니다.
이 자습서에서는 상속 항목을 자세히 살펴보고 상속 유형에 대해 자세히 알아 봅니다.
학습 내용 :
네트워크 보안 키는 무엇입니까
Java의 상속 유형
클래스가 상속되는 방식과 상속되는 클래스 수에 따라 아래 그림과 같은 상속 유형이 있습니다.
위의 그림에서 볼 수 있듯이 객체 지향 프로그래밍에는 다음과 같이 5 가지 유형의 상속이 있습니다.
# 1) 단일 상속 : 파생 클래스 또는 하위 클래스가 하나의 기본 또는 수퍼 클래스에서만 상속하면 단일 상속입니다.
# 2) 다단계 상속 : Multilevel Inheritance에는 클래스가 기본 클래스에서 상속되고 파생 된 클래스가 다른 클래스에서 차례로 상속되는 수준이 두 개 이상 있습니다.
# 3) 계층 적 상속 : 상속 계층 구조는 수퍼 클래스가 둘 이상의 클래스에 의해 상속 될 때 이러한 유형의 상속에서 형성됩니다.
# 4) 다중 상속 : 다중 상속은 클래스가 둘 이상의 부모로부터 속성과 동작을 상속 할 수있는 것입니다.
# 5) 하이브리드 상속 : 하나 이상의 상속 유형이 결합되면 하이브리드 상속이됩니다.
Java는 클래스를 사용하는 단일, 다중 레벨 및 계층 적 상속 유형 만 지원합니다. Java는 클래스와 함께 다중 및 하이브리드 상속을 지원하지 않습니다.
이제 프로그래밍 예제를 통해 각 상속 유형에 대해 자세히 설명합니다.
Java의 단일 상속
단일 상속은 다음과 같이 표시됩니다.
여기서 하위 클래스는 단일 수퍼 클래스에서 상속됩니다. 이것은 단일 상속입니다. 개와 같은 동물은 동물 종에서 물려받습니다. 이것은 가장 단순한 형태의 상속입니다.
다음은 단일 상속을 설명하는 Java 프로그램입니다.
//base class:Animal class Animal { void Action_eat() { System.out.print('eating...'); } } //derived class:Dog class Dog extends Animal { void Action_bark() { System.out.print('barking...'); } } class Main{ public static void main(String args()){ Dog d=new Dog(); //create an object of derived class System.out.print('The dog is '); d.Action_bark(); //call derived class method System.out.print('
The dog is '); d.Action_eat(); //call base class method } }
산출:
여기에는 Animal 종에 공통적 인 기본 클래스 Animal에 eat (Action_eat) 메서드가 하나 있습니다. Animal 클래스에서 파생 된 파생 클래스 Dog가 있습니다. Dog 클래스에는 Dog 종, bark (Action_bark)에 특정한 메서드가 있습니다.
그런 다음 main 메서드에 Dog 개체를 만들고 Dog 클래스가 Animal 클래스를 상속 했으므로이 개체는 eat 및 bark 메서드를 호출 할 수 있습니다.
자바의 다단계 상속
다단계 상속에는 상속 체인이 있습니다. 이것은 파생 클래스에 의해 상속되는 부모 클래스가 있음을 의미합니다. 파생 된 클래스는 차례로 다른 클래스의 부모 역할을합니다.
다단계 상속은 다음과 같이 나타낼 수 있습니다.
위의 그림에서 볼 수 있듯이 부모 클래스 A가 있습니다. 클래스 B는 클래스 A에서 상속합니다. 그런 다음 클래스 B에서 상속되는 또 다른 클래스 C가 있습니다. 따라서 상속 체인을 형성하는 것을 볼 수 있습니다. 여기서 클래스 B는 클래스 A와 C를 연결하는 중간 클래스가됩니다.
아래의 Animal 클래스 예제를 계속 진행하면 Animal 클래스에서 파생 된 Dog 클래스를 가질 수 있습니다. 그런 다음 Dog 클래스에서 파생 된 아기 강아지 인 Puppy 클래스를 추가 할 수 있습니다. 이런 식으로 우리는 다단계 상속을 가질 수 있습니다.
다단계 상속에 대한 예제 프로그램은 다음과 같습니다.
import java.util.*; import java.lang.*; import java.io.*; //parent class A class A { public void print_A() { System.out.print('SoftwareTestingHelp '); } } //Derived class B - intermediary class B extends A { public void print_B() { System.out.print('Java Series '); } } //Derived Class C class C extends B { public void print_C() { System.out.print('Tutorials'); } } public class Main { public static void main(String() args) { C c_obj = new C(); //create Class C obj c_obj.print_A(); //call grandparent class method c_obj.print_B(); //call parent class method c_obj.print_C(); //call member method } }
산출:
위에 표시된 정확한 체인을 프로그래밍했습니다. 그런 다음 주 메서드에서 클래스 C의 개체를 만듭니다. 그런 다음 클래스 C 개체는 부모 B와 조부모 A의 메서드에 액세스 할 수 있습니다.
Java의 계층 적 상속
클래스는 그로부터 파생 된 둘 이상의 클래스를 가질 수 있습니다. 그래서 우리는 하나의 기본 또는 수퍼 클래스와 하나 이상의 서브 클래스를 가지고 있습니다. 이러한 유형의 상속을 '계층 적 상속'이라고합니다.
계층 적 상속은 아래에 다이어그램으로 표시됩니다.
계층 적 상속의 예로 Animal 클래스를 수퍼 클래스로 표현한 다음 Cat, Dog, Cow 등과 같은 둘 이상의 동물을 파생시킬 수 있습니다.
아래의 Java 프로그램은 Java의 계층 적 상속을 보여줍니다.
//class Parent class Parent { public void print_parent() { System.out.println('In ::Parent class'); } } //child1 class class Child1 extends Parent { public void print_child1() { System.out.println('In ::Child1 class'); } } //child2 class class Child2 extends Parent { public void print_child2() { System.out.println('In ::Child2 class'); } } //child3 class class Child3 extends Parent { public void print_child3() { System.out.println('In ::Child3 class'); } } public class Main { public static void main(String() args) { Child1 ch1 = new Child1(); //create a Child1 class object ch1.print_child1(); //call its member method Child2 ch2 = new Child2(); //create a Child2 class object ch2.print_child2(); //call its member method Child3 ch3 = new Child3(); //create a Child3 class object ch3.print_child3(); //call its member method ch3.print_parent(); //call parent class method with any object } }
산출:
소프트웨어 테스트에서 qa 대 qc
프로그램에서 볼 수 있듯이 부모 클래스와이 부모에서 파생 된 세 개의 자식 클래스가 있습니다. 메인 메서드에서 우리는 각 자식 클래스의 객체를 만들고 각각의 멤버 메서드를 호출합니다.
부모 클래스의 메서드를 호출하려면 모든 자식 클래스 개체가 부모 클래스에 액세스 할 수 있으므로 모든 자식 클래스 개체를 사용할 수 있습니다.
Java의 다중 상속
다중 상속은 한 클래스가 둘 이상의 클래스에서 상속 할 수있는 상황입니다. 즉, 한 클래스가 둘 이상의 부모를 가질 수 있습니다. 이렇게하면 클래스가 하나 이상의 수퍼 클래스를 가질 수 있으므로 모든 수퍼 클래스의 속성과 동작을 얻을 수 있습니다.
다중 상속의 다이어그램 표현은 다음과 같습니다.
위와 같이 둘 이상의 클래스에서 동시에 클래스를 파생시킬 수 있습니다. 이렇게하면 파생 클래스가 모든 부모 클래스의 기능을 얻습니다. 이로 인해 특히 상속 된 기능이 동일한 경우 심각한 모호성이 발생할 수 있습니다.
노트 :Java는 클래스를 사용한 다중 상속을 지원하지 않습니다. 그러나 상속에 대한 다음 자습서에서 논의 할 인터페이스를 사용하여 다중 상속을 지원합니다.
Java는 클래스에 대한 다중 상속을 지원하지 않으므로 자세한 내용은 다루지 않습니다. 그러나 자습서의 뒷부분에서 Java가 다중 상속을 지원하지 않는 이유를 이해하려고 노력할 것입니다.
자바의 하이브리드 상속
하이브리드 상속은 위에서 논의한 하나 이상의 상속 유형의 조합입니다. 그러나 모든 조합은 Java에서 지원하지 않는 다중 상속 유형이됩니다.
하이브리드 상속은 다음과 같이 다이어그램으로 나타낼 수 있습니다.
따라서 Java는 클래스와 함께 하이브리드 상속도 지원하지 않습니다. 그러나 다중 상속과 마찬가지로 인터페이스를 사용하여 Java에서 하이브리드 상속을 구현할 수 있습니다. 다음 자습서에서 이에 대해 자세히 설명합니다.
Java가 다중 상속을 지원하지 않는 이유는 무엇입니까?
Java는 프로그램의 단순성을 목표로합니다. 이것은 OOP 기능에도 적용됩니다. 따라서 다중 상속과 관련하여 둘 이상의 클래스에서 클래스를 파생 할 때 일부 모호한 상황이 발생할 수 있습니다.
이제 프로그램에 다중 상속이있을 때 발생할 수있는 문제를 이해하겠습니다.
다음 다중 상속 시스템을 고려하십시오.
위의 시스템을 보면 자명합니다. 여기에서 클래스 A와 클래스 B는 클래스 C에 상속 된 두 부모 클래스입니다. 이제 클래스 A와 B 모두 동일한 이름, 즉 print ()를 가진 메서드가 있음을 보여주었습니다. 따라서 클래스 C가 A와 B를 상속하면 print () 메서드의 두 버전을 모두 얻습니다.
이 경우 클래스 C는 상속해야하는 메서드를 알지 못합니다. 이것은 다중 상속의 경우 발생하는 위에서 언급 한 모호한 상황입니다.
따라서 Java는 클래스가 둘 이상의 클래스에서 상속 될 때 컴파일러 오류를 발행합니다.
다음 Java 프로그램이이를 보여줍니다.
class A{ void print(){ System.out.println('Class A :: print()'); } } class B{ void print(){ System.out.println('Class B :: print()'); } } class C extends A , B{ //let C inherit from A and B } public class Main { public static void main(String() args) { C cObj = new C(); c.print(); } }
산출:
출력에서 볼 수 있듯이 Java 컴파일러는 클래스가 두 클래스를 확장하는 것을 발견하면 오류를 발행합니다.
Java는 두 클래스가 동시에 상속되는 것을 허용하지 않지만 이러한 제한을 해결할 수있는 방법을 제공합니다. 클래스 대신 인터페이스를 사용하여 다중 상속을 시뮬레이션 할 수 있습니다. 이후 튜토리얼에서 이에 대해 논의 할 것입니다.
다이아몬드 문제
다중 상속으로 인해 '다이아몬드 문제'라는 상황이 발생합니다.
다음과 같은 상속 시스템이 있다고 생각하십시오.
class Super{ void show(){} } class Sub1 extends super{ void show1(){} } class Sub2 extends super{ void show2(){} } class sample extends Sub1,Sub2{ //Sample class code here }
이 시스템을 아래와 같이 다이어그램으로 나타낼 수 있습니다.
위의 다이어그램에서 볼 수 있듯이 전체 상속 시스템은 다이아몬드 모양으로 나타납니다. 이 다이아몬드 구조 때문에 모호함을 '다이아몬드 문제'라고합니다.
다중 상속에 대해 앞서 설명한 것처럼 여기서 모호한 점은 Sample 클래스가 상속의 결과로 얻는 show () 메서드의 여러 복사본입니다. 여러 경로가 있기 때문에 show () 메서드를 달성하고 상속 할 복사본에 대한 모호성이 있습니다.
다중 상속과 마찬가지로 다이아몬드 문제는 인터페이스를 사용하여 해결할 수도 있습니다.
Java의 상속 규칙
지금까지 Java의 상속 유형뿐만 아니라 상속의 기본 사항을 살펴 보았습니다. 상속을 사용하여 응용 프로그램을 개발할 때 따라야 할 몇 가지 규칙을 나열 해 보겠습니다.
규칙 # 1 : Java는 다중 상속을 지원하지 않습니다.
이미 살펴본 바와 같이 Java는 어떤 형태로든 다중 상속을 지원하지 않습니다. 프로그램에서 다중 상속을 시도하면 Java 컴파일러가 컴파일러 오류를 발행합니다.
규칙 # 2 : Java는 순환 상속을 허용하지 않습니다.
순환을 형성하기 위해 자신을 상속하는 클래스를 순환 상속이라고합니다.
다음 클래스, class1 및 class2를 고려하십시오.
클래스 class1은 클래스 2를 확장합니다 {}
class class2는 class 1 {}을 확장합니다.
위의 상황은 루프를 형성합니다. Java에서는 허용되지 않습니다.
규칙 # 3 : 개인 데이터 멤버를 상속 할 수 없습니다.
'액세스 수정 자'항목에서 이미 개인 액세스 권한이있는 구성원은 상속 될 수 없음을 배웠습니다.
규칙 # 4 : 생성자는 상속되지 않습니다
생성자는 클래스 개체를 만드는 데 사용되므로 한 클래스에서 다른 클래스로 상속되지 않습니다.
규칙 # 5 : 부모 참조를 사용하여 자식 개체에 액세스 할 수 있습니다.
우리는 이미 다양한 상속 사례를 보았습니다. 부모 클래스 형식의 참조를 만든 다음 new 키워드를 사용하여 만든 파생 클래스 개체에 할당 할 수 있습니다.
super가 수퍼 클래스이고 sub가 아래와 같이 super에서 파생 된 클래스 인 경우.
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
규칙 # 6 : 파생 생성자의 super () 때문에 부모 생성자가 실행됩니다.
규칙 중 하나는 생성자를 상속 할 수 없다고 명시합니다. 그러나 수퍼 클래스의 생성자는 super () 호출을 사용하여 파생 클래스의 생성자 내에서 실행할 수 있습니다.
통합 테스트에서 테스트 된 두 가지 주요 항목은 인터페이스와 예상 결과입니다.
자주 묻는 질문
Q # 1) Java에서 지원하지 않는 상속 유형은 무엇입니까?
대답: Java는 다이아몬드 문제와 같은 응용 프로그램에서 문제를 일으킬 수 있으므로 다중 상속을 지원하지 않습니다. Java는 또한 하나 이상의 상속 유형의 조합이고 궁극적으로 다중 상속으로 전환 될 수 있으므로 하이브리드 상속을 지원하지 않습니다.
Q # 2) 어떤 클래스의 멤버가 상속 될 수 있습니까?
대답: 클래스는 기본 클래스의 공용 및 보호 된 멤버를 상속 할 수 있지만 기본 클래스의 전용 멤버에는 액세스 할 수 없습니다.
Q # 3) 다중 상속이 허용되지 않는 이유는 무엇입니까?
대답: 다중 상속은 두 부모 클래스에 동일한 프로토 타입을 가진 메서드가있는 경우 모호함을 초래합니다. 이 경우 파생 클래스는 메서드를 상속해야하는 기본 클래스가 모호합니다.
다중 상속으로 인해 Java에서 다이아몬드 문제가 발생할 수도 있습니다. 따라서 Java는 다중 상속을 지원하지 않습니다.
Q # 4) 다중 상속이 필요한 이유는 무엇입니까?
대답: Java 및 C #과 같은 언어는 다중 인터페이스를 사용하여 다중 상속을 적용합니다. 따라서 둘 이상의 인터페이스에서 기능을 상속해야하는 경우 다중 상속이 필요합니다.
Q # 5) 다단계 상속의 주요 용도는 무엇입니까?
대답: 세 번째 클래스에서 파생 된 다른 클래스에서 파생 된 클래스는 다중 수준 상속을 나타낸다고합니다. 이 상속 유형의 수준은 명확성과 단순성을 유지하는 한 원하는 수로 확장 할 수 있습니다.
다단계 상속을 사용하여 다양한 수준의 종을 묘사 할 수 있습니다. 프로그래밍 관점에서 다양한 수준의 애플리케이션 클래스를 나타내려면 다중 수준 상속을 사용합니다.
결론
이 튜토리얼에서는 Java의 상속 유형에 대해 설명했습니다. Java는 단일, 다중 레벨 및 계층 적 상속 유형 만 지원합니다. Java는 다중 및 하이브리드 상속을 지원하지 않습니다. Java의 다중 상속 모호성 및 다이아몬드 문제에 대해 논의했습니다.
그런 다음 Java에서 상속을 구현하는 동안 따라야 할 다양한 규칙에 대해 논의했습니다. 이것으로 Java의 IS-A 관계에 대한 논의를 마쳤습니다.