출처: FreeCodeCamp Java는 오늘날 사용되는 가장 인기 있는 객체 지향 프로그래밍 언어 중 하나입니다. 플랫폼 독립적이므로 모든 유형의 장치와 모든 운영 체제에서 Java 애플리케이션을 찾을 수 있습니다. 그리고 자바는 상대적으로 배우기 쉽기 때문에 많은 프로그래머들이 마스터하는 언어 중 하나입니다. 여러분이 숙지해야 할 Java의 중요한 기능은 클래스 상속입니다. 상속을 사용하면 코드를 최적화하여 클래스를 더 쉽게 재사용할 수 있습니다. 이미 테스트 및 디버깅된 코드를 재사용할 수 있으면 소프트웨어 개발 수명 주기가 더 짧아지고 비용도 저렴해집니다. 이론적으로는 단순한 개념이지만 상속 관계를 코딩하려면 세부 사항에 주의가 필요합니다. 특히 다중 상속과 관련하여 하나의 하위 클래스가 여러 상위 클래스의 속성을 상속합니다. Java는 다중 상속 관계가 모호함을 야기하기 때문에 거부하지만, 무엇을 해야 할지 안다면 동일한 효과를 얻을 수 있는 여러 가지 방법이 있습니다. 이 기사에서는 다중 상속 문제를 살펴보고 Java의 대체 코딩 옵션에 대해 논의합니다.
상속 용어
때로는 성공적인 프로그래머가 되기 위해 일반적인 오류나 문제에 대한 해결 방법을 찾는 문제 해결사가 되어야 합니다. 이는 안전하고 스마트한 코딩의 필수적인 부분입니다. 그러한 문제 중 하나는 Java의 다중 상속(또는 상속의 부족)과 관련이 있습니다. Java의 상속을 완전히 이해하려면 객체 지향 프로그래밍(OOP)의 기본 상속 용어를 잘 알고 있어야 합니다.- 클래스는 객체 지향 프로그래밍 언어의 기본 패턴 구조입니다. 클래스는 객체 그룹의 공통 속성을 정의합니다.
- 상위 클래스 : 기본 클래스 또는 슈퍼 클래스라고도 합니다. 상위 클래스는 하위 클래스에 기능을 제공하는 확장 가능한 클래스입니다. 재사용이 가능해졌습니다. 상위 클래스의 정의와 함수는 하위 클래스를 생성할 때 재사용됩니다.
- 하위 클래스 : 보다 일반적으로 하위 클래스라고 불리는 하위 클래스는 다른 클래스의 기능을 상속합니다. 하위 클래스는 확장 또는 파생 클래스입니다.
- 상속 : 부모 클래스와 자식 클래스 간의 관계입니다.
OOP 상속 유형
Java, C++, JavaScript, Python, PHP, Ruby 및 Perl을 포함하여 오늘날 널리 사용되는 객체지향 프로그래밍 언어가 많이 있습니다. 상속은 이러한 OOP 언어에서 일반적인 개념이지만 각 언어에 모든 유형의 상속이 존재하는 것은 아닙니다. 일반적인 상속 유형과 사용 중인 특정 언어의 상속 제한 사항을 아는 것이 매우 중요합니다. 상속에 대해 더 많이 알수록 더 효과적인 개발자가 될 수 있습니다. Java가 지원하는 상속 유형은 다음과 같습니다.- 단일 수준 상속 : 하위 클래스가 단일 상위 클래스의 기능을 상속하는 경우입니다.
- 다중 수준 상속 : 단일 수준 상속의 다중 수준 형태입니다. 다중 수준 상속에서는 하위 클래스가 다른 하위 클래스의 상위 클래스 역할을 할 수도 있습니다. 각 수준 간의 관계는 선형입니다. 다중 상속보다 더 높은 분기는 없습니다. 이 경우 마지막 하위 클래스에는 위의 모든 수준의 기능이 있습니다.
- 계층적 상속 : 다중 상속의 반대입니다. 계층적 상속에서는 단일 상위 클래스에 둘 이상의 하위 클래스가 있습니다. 따라서 위에 가지가 있는 대신 아래에 가지가 있습니다.
- 하이브리드 상속 : 이름에서 알 수 있듯이 하이브리드 상속은 다른 유형의 상속을 조합한 것입니다.
- 다중 상속 : 다중 상속에서는 자식 클래스에 부모 클래스가 두 개 이상 있습니다. Java와 JavaScript는 다중 상속을 지원하지 않지만 C++와 같은 OOP 언어는 지원합니다.
- 다중 경로 상속 : 다중, 다중 레벨 및 계층적 상속의 하이브리드인 다중 경로 상속에서 하위 클래스는 상위 클래스와 상위 클래스의 여러 하위 클래스로부터 특성과 기능을 상속받습니다. 다중 경로 상속은 다중 상속을 기반으로 하기 때문에 Java에서는 해당 사용을 지원하지 않습니다.
Java가 다중 상속을 지원하지 않는 이유
다중 상속의 주요 문제점은 하위 클래스에 모호성을 만들 수 있다는 것입니다. 1995년 백서에서 수석 Java 디자이너인 James Gosling은 다중 상속 문제가 Java가 탄생한 이유 중 하나라고 밝혔습니다. 다중 상속에 내재된 복잡성은 다이아몬드 문제에서 가장 분명하게 드러납니다. 다이아몬드 문제에서 부모 클래스 A에는 두 개의 서로 다른 자식 클래스 B와 C가 있습니다. 즉, 자식 클래스 B와 C는 클래스 A를 확장합니다. 이제 클래스 B와 클래스 C를 모두 확장하는 새로운 자식 클래스 D를 만듭니다. 다중 상속(D는 B와 C를 확장), 계층적 상속(B와 C는 확장) A) 및 다중 수준 상속(D는 A, B 및 C를 확장함). 다이아몬드 문제에서 하위 클래스 B와 C는 상위 클래스 A의 메서드를 상속합니다. B와 C는 모두 상속된 메서드를 재정의합니다. 그러나 B와 C의 새로운 방법은 서로 모순됩니다. 마지막 자식 클래스 D는 여러 부모 B와 C로부터 두 개의 독립적이고 충돌하는 메서드를 상속받습니다. 클래스 D의 어떤 메서드를 사용해야 하는지 명확하지 않으므로 모호성이 발생합니다. 다른 OOP 프로그래밍 언어는 다중 상속의 모호함을 해결하기 위해 다양한 방법을 구현합니다.Java의 다중 상속 문제를 해결하는 방법
다중 상속이 문제가 있다고 해서 그것이 쓸모없다는 의미는 아닙니다. 하나의 클래스가 여러 다른 클래스의 함수를 갖기를 원하는 상황이 많이 있습니다. 당신이 매우 성공적인 소프트웨어 개발자가 되었을 때 구입하게 될 Tesla Roadster에 대해 생각해 보십시오. 기술적 특성은 스포츠카 클래스와 전기차 클래스를 모두 기반으로 합니다. 또 다른 예: 이 기사를 읽고 있는 브라우저입니다. 인터넷 개인정보 보호 솔루션 클래스와 일반 인터넷 브라우저 클래스의 기능을 갖추고 있습니다. 그러나 Java에서는 여러 클래스를 확장할 수 없습니다. 그렇다면 이 언어는 다중 상속 문제를 어떻게 처리할까요? Java는 인터페이스라는 구조를 사용합니다. 인터페이스는 클래스에 의해 구현될 동작을 정의하는 추상 유형입니다. 인터페이스는 추상적이기 때문에 해당 동작에 대한 자세한 지침이 포함되어 있지 않습니다. 대신 클래스는 인터페이스 동작의 구체적인 구현을 제공합니다. 인터페이스에는 다음과 같은 몇 가지 정의적인 특성이 있습니다.- 클래스와 달리 인터페이스를 인스턴스화하지 않습니다. 대신 클래스는 인터페이스를 구현합니다.
- 인터페이스에는 공개 상수 정의와 메서드 헤더만 포함됩니다.
- 인터페이스는 클래스가 아닌 다른 인터페이스만 확장할 수 있습니다.
- 인터페이스는 여러 인터페이스를 확장할 수 있고, 클래스는 여러 인터페이스를 구현할 수 있습니다.
GO TO FULL VERSION