다음을 통해 공유


X++ 상속

비고

커뮤니티 관심 그룹은 이제 Yammer에서 Microsoft Viva Engage로 이동했습니다. Viva Engage 커뮤니티에 가입하고 최신 토론에 참여하려면 Finance and Operations Viva Engage Community 양식에 대한 요청 액세스 권한을 작성하고 참여하려는 커뮤니티를 선택합니다.

이 문서에서는 서브클래스를 만들고 메서드를 재정의하는 방법을 포함하여 X++의 상속에 대해 설명합니다.

하위 클래스 만들기

하위 클래스 는 다른 클래스에서 확장하거나 상속하는 클래스입니다. 클래스는 하나의 다른 클래스만 확장할 수 있습니다. 여러 상속은 지원되지 않습니다. 클래스를 확장하는 경우 하위 클래스는 부모 클래스( superclass)의 모든 메서드와 변수를 상속합니다. 서브클래스를 사용하면 기존 코드를 보다 구체적인 용도로 다시 사용할 수 있습니다. 따라서 디자인, 개발 및 테스트 중에 시간을 절약할 수 있습니다. 슈퍼 클래스의 동작을 사용자 지정하려면 서브클래스의 메서드를 재정의합니다. 슈퍼 클래스는 종종 기본 클래스라고 하며 하위 클래스를 파생 클래스라고도 합니다.

하위 클래스 예제

다음 예제에서는 먼저 Point라는 클래스를 만듭니다. 그런 다음 Point 클래스를 확장하여 ThreePoint라는 새 클래스를 만듭니다.

class Point
{
    // Instance fields.
    real x; 
    real y; 

    // Constructor to initialize fields x and y.
    void new(real _x, real _y)
    { 
        x = _x;
        y = _y;
    }
}

class ThreePoint extends Point
{
    // Additional instance fields z. Fields x and y are inherited.
    real z; 

    // Constructor is overridden to initialize z.
    void new(real _x, real _y, real _z)
    {
        // Initialize the fields.
        super(_x, _y); 
        z = _z;
    }
}

클래스 상속 방지

최종 한정자를 사용하여 클래스가 상속되지 않도록 할 수 있습니다.

public final class Attribute
{
    int objectField;
}

메서드 재정의

클래스의 메서드는 클래스를 확장하는 모든 클래스에 의해 상속됩니다. 상속된 메서드의 기능을 변경하려면 서브클래스에 메서드를 만든 다음 해당 메서드에 슈퍼클래스의 메서드와 동일한 이름과 매개 변수를 지정합니다. 이 프로세스를 메서드 를 재정의하는 것으로 알려져 있습니다.

서브클래스를 인스턴스화할 때 슈퍼클래스 형식 또는 하위 클래스 형식의 변수에 참조를 할당할 수 있습니다. 변수의 형식에 관계없이 재정의된 메서드가 호출됩니다.

다음 코드 예제에서 하위 클래스는 쓰기 메서드를 재정의합니다. Point 형식의 두 변수가 모두 만들어집니다. 하나는 Point 개체가 할당되고, 다른 하나는 ThreePoint 개체가 할당됩니다. ThreePoint 개체에서 쓰기 메서드가 호출되면 메서드의 ThreePoint 버전이 호출됩니다.

class Point
{
    // Instance fields.
    real x;
    real y;

    // Constructor to initialize fields x and y.
    void new(real _x, real _y)
    {
        x = _x;
        y = _y;
    }

    void write()
    {
        info("(" + any2Str(x) + ", " + any2Str(y) + ")");
    }
}

class ThreePoint extends Point
{
    // Additional instance fields z. Fields x and y are inherited.
    real z;

    // Constructor is overridden to initialize z.
    void new(real _x, real _y, real _z)
    {
        // Initialize the fields.
        super(_x, _y);
        z = _z;
    }

    void write()
    {
        info("(" + any2Str(x) + ", " + any2Str(y) + ", " + any2Str(z) + ")");
    }

}

// Code that creates Point objects and calls the write method.
Point point2 = new Point(1.0, 2.0);
Point point3 = new ThreePoint(3.0, 4.0, 5.0);

point2.write();
// Output is "(1.0, 2.0)".

point3.write();
// Output is "(3.0, 4.0, 5.0)".

메서드 재정의 방지

정적 메서드는 클래스별로 존재하기 때문에 재정의할 수 없습니다. 다른 중요한 메서드 또는 핵심 메서드가 재정의되지 않도록 보호하려면 최종 한정자를 사용합니다. 다음 예제에서는 methodAtt최종으로 선언되므로 특성을 확장하는 클래스에서 재정의할 수 없습니다. 메서드를 지정하거나 종료 메서드를최종 메서드로 지정해서는 안 됩니다.

다음 예제에서는 최종 키워드를 사용하는 방법을 보여줍니다.

public class Attribute
{
    int objectVariable;

    final void methodAtt()
    {
        //Some statements
    }
}

재정의 및 오버로드

재정의는 해당 메서드의 하위 클래스 구현에 의해 슈퍼 클래스의 메서드 구현이 변경될 때 발생하지만 두 메서드의 서명은 동일합니다.

반면, 두 개 이상의 메서드 이름이 같지만 메서드에 서로 다른 서명(반환 형식, 매개 변수 목록 또는 둘 다)이 있는 경우 오버로드 가 발생합니다. X++는 재정의를 지원하지만 오버로드를 지원하지 않습니다.