C#

[C#] this()/base()/상속/오버라이딩

ryureeru 2023. 12. 20. 11:43

 

this() ?

this는 자신을 지칭할 때 사용하는 키워드입니다. => 즉 나를 가르킴!!!

 

 

 

다음은 3개의 생성자를 오버로딩하는 클래스의 코드입니다.

using System;

namespace ThisConstructor
{

    class MyClass
    {
        int a, b, c;

        public MyClass() {
            this.a = 1;
            Console.WriteLine("MyClass()");
        }

        public MyClass(int b) : this()
        {
            this.b = b;
            Console.WriteLine($"MyClass({b})");
        }

        public MyClass(int b, int c) : this(b)
        {
            this.c = c;
            Console.WriteLine($"MyClass({b}, {c})");
        }

        public void PrintFields()
        { 
            Console.WriteLine($"a: {a}, b: {b}, c: {c}");
        }
    }


    class MainApp
    {
        static void Main(string[] args)
        {
            MyClass a = new MyClass();
            a.PrintFields();
            Console.WriteLine();

            MyClass b = new MyClass(2);
            b.PrintFields();
            Console.WriteLine();

            MyClass c = new MyClass(20, 30);
            c.PrintFields();
            Console.WriteLine();
        }
    }
}

 

 

 

실행 결과:

MyClass()
a: 1, b: 0, c: 0)

MyClass()
MyClass(2)
a: 1, b: 2, c: 0)

MyClass()
MyClass(20)
MyClass(20, 30)
a: 1, b: 20, c: 30

 

 

 

 

 

 

 

상속 ?

클래스는 다른 클래스로부터 필드나 메소드, 프로퍼티 같은 멤버들을 물려 받을 수 있습니다.

물려받는 클래스(파생 클래스: Derived Class), 물려줄 클래스(기반 클래스: Base Class or 부모 클래스)

 

 

간단한 예제 코드입니다.

    class Base
    {
        public Base() // 생성자
        {
            WriteLine("Base()");
        }
        
        public void BaseMethod()
        { /* ... */ }

    }

    class Derived : Base // Base 상속
    {
        public Derived()
        {
            WriteLine("Derived()");
        }
        
        public void DerviedMethod()
        {
        	base.BaseMethod(); // base 키워드를 통해 기반 클래스에 접근 가능
        }
    }

 

 

이때 base는 this가 자기 지칭의 키워드인 것처럼, 기반 클래스의 키워드입니다.

 

따라서, 기반 클래스의 생성자 또한 base()로 사용하면 됩니다.

class Base
{
    protected string Name;

    public Base(string  Name)
    {
        this.Name = Name;
    }

}

class Derived : Base
{
    public Derived(string Name) : base(Name)
    {
        /* ... */
    }
}

 

 

 

 

 

 

그렇다면 오버라이딩은 어떻게 하는 것일지 코드를 통해 알아봅시다.

class ArmorSuite
{
    public virtual void Initialize() // virtual 선언 but private일 경우 오버라이딩 불가
    {
        Console.WriteLine("ArmorSuite");
    }
}

class IronMan : ArmorSuite
{

    public override void Initialize() // override 선언
    {
        base.Initialize();
        Console.WriteLine("Repulsor Rays Armed");
    }

}

 

 

 

이외에도 메소드를 숨기기 위해 new, 봉인하기 위해 sealed를 사용할 수 있답니다~!

 

 

 

'C#' 카테고리의 다른 글

[C#] Nullable/널 조건부 연산자/널 병합 연산자  (1) 2023.12.20