Articles

초보자를위한 Oop 개념:상속은 무엇입니까?

상속은 객체 지향 프로그래밍(oop)언어의 핵심 개념 중 하나입니다. 속성 및 메서드 집합을 공유하는 클래스의 계층 구조에 대해 다른 클래스에서 클래스를 파생시킬 수있는 메커니즘입니다.

사용할 수 있습니다 그것은 선언하는 다른 종류의 예외를 추가,사용자 정의 논리를 기존 프레임워크,고도 지도 귀하의 도메인 모델입니다.,

상속 계층 선언

Java 에서 각 클래스는 다른 하나의 클래스에서만 파생 될 수 있습니다. 이 클래스를 수퍼 클래스 또는 부모 클래스라고합니다. 파생 클래스를 하위 클래스 또는 하위 클래스라고합니다.

확장 키워드를 사용하여 하위 클래스가 확장하는 클래스를 식별합니다. 수퍼 클래스를 선언하지 않으면 클래스가 암시 적으로 클래스 객체를 확장합니다. 객체는 모든 상속 계층의 루트이며 다른 클래스를 확장하지 않는 Java 의 유일한 클래스입니다.

다음 다이어그램과 코드 조각은 간단한 상속 계층 구조의 예를 보여줍니다.,

클래스 BasicCoffeeMachine 은 수퍼 클래스를 선언하지 않으며 클래스 객체를 암시 적으로 확장합니다. Github 에서 CoffeeMachine 예제 프로젝트를 복제 할 수 있습니다.

클래스 PremiumCoffeeMachine 은 BasicCoffeeMachine 클래스의 하위 클래스입니다.

상속 및 액세스 수정 자

액세스 수정자는 속성 또는 메서드에 액세스 할 수있는 클래스를 정의합니다. 캡슐화에 대한 이전 게시물 중 하나에서 정보 숨기기 메커니즘을 구현하는 데 사용할 수있는 방법을 보여주었습니다. 그러나 그것은 당신이 다른 수식어에 대해 잘 알고 있어야하는 유일한 경우는 아닙니다., 또한 상속 계층 구조 내에서 액세스할 수 있는 엔터티 및 특성에 영향을 줍니다.

여기에 빠른 개의 다른 수정:

  • 개인 속성이나 방법에만 액세스할 수 있습니다 내일 수 있습니다.
  • 속성과 방법이 없이는 수정 액세스에 액세스할 수 있는 동일한 클래스에서,그리고 다른 모든 클래스 이내에는 동일한 패키지입니다.
  • 보호한 특성 또는 방법에 액세스할 수 있습에서 같은 클래스에 의해,모든 클래스 이내에는 동일한 패키지를 모두에 의해 서브 클래스.,
  • 공용 속성 및 메서드는 모든 클래스에서 액세스 할 수 있습니다.

에서 볼 수 있는 목록은,하위 클래스에 액세스할 수 있습는 모든 보호 및 공용 특성 및 방법의 수퍼 클래스. 는 경우에는 라이브 수퍼 클래스에 속하는 동일한 패키지,클래스에 액세스할 수 있습은 모든 패키지-개인 특성 및 방법의 수퍼 클래스.

PremiumCoffeeMachine 클래스의 생성자에서 두 번 수행합니다.

먼저 수퍼 클래스의 생성자를 호출하기 위해 수퍼 키워드를 사용합니다. 생성자는 공개이며 하위 클래스가 액세스 할 수 있습니다., 수퍼 키워드는 수퍼 클래스를 참조합니다. 이를 사용하여 특성에 액세스하거나 현재 하위 클래스에서 재정의되는 수퍼 클래스의 메소드를 호출 할 수 있습니다. 그러나 다음 섹션에서 그것에 대해 더 자세히 설명합니다.

보호 된 속성 configMap 은 BasicCoffeeMachine 클래스에 의해 정의됩니다. 해당 클래스를 확장하면 속성도 PremiumCoffeeMachine 클래스의 일부가되며 에스프레소를 양조하는 데 필요한 구성을 맵에 추가 할 수 있습니다.,

방법 overriding

상속를 추가 뿐만 아니라 모든 공공 및 보호 방법의 수퍼 클래스의 서브 클래스이지만,그것은 또한 교체 할 수 있습니다. 그런 다음 하위 클래스의 메서드는 수퍼 클래스 중 하나를 재정의합니다. 그 메커니즘을 다형성이라고합니다.

저는 PremiumCoffeeMachine 클래스에서 커피 머신의 커피 양조 기능을 확장하기 위해 사용합니다. BasicCoffeeMachine 방법의 brewCoffee 방법은 필터 커피 만 양조 할 수 있습니다.

Coffeeselection 에 대한 지원을 추가하기 위해 PremiumCoffeeMachine 클래스에서 해당 메서드를 재정의합니다.,에스프레소. 코드 스 니펫에서 볼 수 있듯이 수퍼 키워드는 메서드를 재정의하는 경우 매우 유용합니다. BasicCoffeeMachine 의 brewCoffee 방법은 이미 CoffeeSelection 을 처리합니다.FILTER_COFFEE 및 지원되지 않는 CoffeeSelections 에 대한 CoffeeException 을 던졌습니다.

나는 나의 새로운 brewCoffee 방법에서 그것을 재사용 할 수있다. 동일한 논리를 다시 구현하는 대신 커피 선택이 에스프레소인지 확인합니다. 그런 경우가 아니라면 수퍼 키워드를 사용하여 수퍼 클래스의 브루 코피 메소드를 호출합니다.,

을 방지하는 방법을 재정의되

경우에 당신을 원하지 않았는지 확인하십시오 클래스의 구현을 변경할 방법을 선언할 수 있습니다 그것이 최종적이다. 이 게시물의 예제에서는 BasicCoffeeMachine 클래스의 addBeans 메소드에 대해 그렇게했습니다.

생성자에 의해 호출되는 모든 메소드를 최종적으로 만드는 것이 종종 좋은 생각입니다. 모든 하위 클래스가 종종 의도하지 않게 생성자의 동작을 변경하는 것을 방지합니다.,

서브 클래스입니다 또한 유형의 수퍼 클래스

서브 클래스 하지만 상속 특성 및 방법의 수퍼 클래스,그러나 그것은 또한 상속하는 형태의 수퍼 클래스. 이 예에서 BasicCoffeeMachine 은 basiccoffeemachine 및 Object 유형입니다. 그리고 PremiumCoffeeMachine 객체는 PremiumCoffeeMachine,BasicCoffeeMachine 및 Object 유형입니다.

이로 인해 PremiumCoffeeMachine 객체를 캐스팅하여 basiccoffeemachine 을 입력 할 수 있습니다.

BasicCoffeeMachinee coffeeMachine = (BasicCoffeeMachine) PremiumCoffeeMachine(beans);

를 작성할 수 있는 코드를 사용하는 수퍼 클래스고 그것을 실행하는 모든 서브 클래스.,

이 예에서는 createCoffeeMachine 메소드의 코드가 반환되고 makeCoffee 메소드는 BasicCoffeeMachine 클래스를 사용합니다. 그러나 createCoffeeMachine 메서드는 새로운 PremiumCoffeeMachine 개체를 인스턴스화합니다. 면 반환 방법에 의해 개체가 자동으로 캐스팅 BasicCoffeeMachine 고 코드를 호출할 수 있는 모든 공중 통 BasicCoffeeMachine 클래스입니다.

coffeeMachine 객체는 BasicCoffeeMachine 에 캐스팅되지만 여전히 PremiumCoffeeMachine 입니다., 따라서 makeCoffee 메서드가 brewCoffee 메서드를 호출하면 PremiumCoffeeMachine 클래스에서 재정의 된 메서드를 호출합니다.

추상 클래스 정의

추상 클래스는 우리가 이야기 한 다른 클래스와 다릅니다. 그것들은 확장 될 수 있지만 인스턴스화 될 수는 없습니다. 그렇기 때문에 특정 도메인에 존재하지 않는 개념적 일반화를 나타내는 것이 이상적이지만 코드의 일부를 재사용 할 수 있습니다.

추상 키워드를 사용하여 클래스 또는 메소드를 추상으로 선언합니다. 추상 클래스는 추상 메소드를 포함 할 필요가 없습니다., 그러나 추상 메소드는 추상 클래스에 의해 선언 될 필요가 있습니다.

커피 머신 예제를 리팩토링하고 AbstractCoffeeMachine 클래스를 BasicCoffeeMachine 클래스의 수퍼 클래스로 소개하겠습니다. 나는 그 클래스를 추상으로 선언하고 추상 brewCoffee 메소드를 정의한다.

public abstract class AbstractCoffeeMachine { protected Map<CoffeeSelection, Configuration> configMap; public AbstractCoffeeMachine() { this.configMap = new HashMap<CoffeeSelection, Configuration>(); } public abstract Coffee brewCoffee(CoffeeSelection selection) throws CoffeeException; }

보시다시피 추상 brewCoffee 메서드의 본문을 제공하지 않습니다. 나는 단지 인터페이스에서 할 것처럼 선언한다., AbstractCoffeeMachine 클래스를 확장하면 하위 클래스를 abstract 로 정의하거나 brewcoffee 메서드를 재정의하여 메서드 본문을 구현해야합니다.

BasicCoffeeMachine 클래스에 약간의 변경을 수행합니다. 이제 AbstractCoffeeMachine 클래스를 확장하고 이미 존재하는 brewCoffee 메서드는 수퍼 클래스의 추상 메서드를 재정의합니다.

내가 변경 한 또 다른 것은 BasicCoffeeMachine 클래스의 생성자입니다. 이제 수퍼 클래스의 생성자를 호출하고 맵을 인스턴스화하지 않고 configMap 속성에 키-값 쌍을 추가합니다., 추상 수퍼 클래스에 의해 정의되고 인스턴스화되며 모든 하위 클래스에서 사용할 수 있습니다.이것은 추상 수퍼 클래스와 인터페이스의 주요 차이점 중 하나입니다. 추상 클래스를 사용하면 메서드를 선언 할 수있을뿐만 아니라 정적이고 최종적이지 않은 속성을 정의 할 수도 있습니다.

요약

지금까지 상속되는 강력한 개념을 구현할 수 있습 서브 클래스를 확장하는 수퍼 클래스. 그렇게함으로써 서브 클래스는 모든 보호 및 공개 속성 및 메소드와 수퍼 클래스의 유형을 상속받습니다., 할 수 있습니다 다음 사용하고 상속된 특성의 수퍼 클래스,이용,또는 재정의 상속 방법,그리고 캐스팅 서브 클래스를 모든 유형의 수퍼 클래스.추상 클래스를 사용하여 인스턴스화 할 수없는 일반적인 추상화를 정의 할 수 있습니다. 해당 클래스 내에서 추상적이지 않은 하위 클래스로 재정의해야하는 추상 메소드를 선언 할 수 있습니다. 자주 사용되는 경우 구현하는 방법은 특정한 각 서브 클래스,하지만 당신이 원한을 정의하는 일반적인 API 의 모든 클래스 계층 구조입니다.