virtual

가상 메서드를 정의할 때 사용되는데 이 키워드를 통해서 메서드를 재정의할 수 있도록 허용한다.

class Base
{
	public virtual void Print()
    {
    	Console.WriteLine("Base class");
    }
}

 

override

상속 관계에서 부모 클래스에 정의된 메서드를 자식 클래스에서 다시 정의할 때 사용된다.

class Derived
{
	public override void Print()
    {
    	Console.WriteLine("Derived class");
    }
}

 

override 키워드를 사용하여 부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의하면 자식 클래스의 인스턴스에서 호출할 때 부모 클래스와 자식 클래스의 구현 차이를 쉽게 반영할 수 있다.

 

Base base = new Base();
base.Print();
// "Base class"

Derived derived = new Derived();
derived.Print();
// "Derived class"

Base base2 = new Derived();
base2.Print();
// "Derived class"
728x90
반응형

'Program Language > C#' 카테고리의 다른 글

C# 읽기 전용 키워드 : readonly  (0) 2023.03.30
C# 코드 분할 키워드 : partial  (0) 2023.03.30
C# 인스턴스 생성 키워드 : new  (0) 2023.03.30
Interoperability  (0) 2023.02.02
Managed, Unmanaged, Native Code  (0) 2023.02.02

abstract

추상적인

구현이 완전하지 않은 상태임을 타나내는 키워드이다.

클래스, 메서드, 프로퍼티, 인덱서, 이벤트와 함게 사용될 수 있다. 

일반적으로 추상 클래스를 구현하는데 사용되며 자체적으로는 인스턴스화 되지 않고 파생된 비추상 클래스에 의해 구현되어 사용된다. 

 

    abstract class Person
    {
        public abstract int GetInfo();
    }

    class Joon : Person
    {
        private int m_age;
        public Joon(int age) => m_age = age;
        public override int GetInfo() => m_age;
    }

    public class Program
    {
        static void Main(string[] args)
        {
            // Error, cannot create an instance of the abstract type.
            Person person = new Person(); 

            Joon joon = new Joon(30);
            Console.WriteLine(joon.GetInfo());
        }
    }

Feature

- 추상 클래스는 인스턴스화할수없다.

- 추상 클래스는 추상 메서드와 접근자를 포함할 수 있다.

- abstract 제한자는 sealed 제한자와 반대의미이므로 같이 사용할 수 없다.

  (abstract : 상속을 필요로하는 제한자, sealed : 상속을 방지하기위한 제한자)

- 추상 클래스로부터 파생된 클래스는 반드시 추상 메서드와 접근자의 구현이 필요하다.

 

메서드와 프로퍼티의 선언에서 abstract 제한자의 사용은 구현을 포함하지 않는것을 나타낸다.

- 추상 메서드는 암묵적으로 가상 메서드이다.

- 추상 메서드는 오직 추상 클래스 내에서만 선언이 허용된다.

- 추상 메서드는 구현이 없어야하므로 선언시 중괄호가 필요하지 않다.

 

Derived abstract class

추상 클래스를 파생 클래스로 만들어 특정 가상 메서드의 상속하여 추상 메서드로 가상 메서드를 재정의할 수 있다.

    public class BaseClass
    {
        public virtual void VirtualMethod(int i) { }
    }

    public abstract class AbstractClass : BaseClass
    {
        public abstract override void VirtualMethod(int i);
    }

	//DerivedClass.ViertualMethod는 BaseClass.VirtualMethod에 접근할 수 없다.
    public class DerivedClass : AbstractClass
    {
        public override void VirtualMethod(int i)
        {
            throw new NotImplementedException();
        }
    }

추상 클래스로부터 파생된 클래스는 메서드의 원래 구현에 접근할 수 없다. 

이러한 방식으로 추상 클래스는 파생 클래스로부터 가상 메서드의 구현을 강제할 수 있다.

728x90
반응형

'Program Language > C#' 카테고리의 다른 글

C# 상수 키워드 : const  (0) 2023.01.31
C# 비동기화 키워드 : async, await  (0) 2023.01.31
Main method  (0) 2023.01.19
테스트 환경  (0) 2023.01.17
.Net Framework  (0) 2023.01.17

+ Recent posts