본문 바로가기

C#

Virtual, Abstract, Interface

728x90

Virtual(가상)

  • abstract와는 다르게 본문을 정의할 수 있다. (비워 놓아도 됨)
  • 파생 클래스에서 재정의 할 수 있다.
  • 자식 클래스에서는 new 또는 override 키워드 사용이 가능하다.
    • override는 재정의 또는 확장의 의미
    • new는 기본 클래스를 숨긴다는 의미
  • base. 키워드를 통해 부모 클래스의 함수 호출이 가능하다.
  • private, static 등 접근 한정자는 사용할 수 없다.
public class Parent
{
    public virtual void func1() { }
}

public class Child : Parent
{
    public override void func1()
    {
        base.func1();
        Console.WriteLine("재정의");
    }
}

 

Abstract(추상)

  • 메서드에 사용하려면 해당 클래스도 abstract로 선언되어야 한다.
  • 해당 키워드로 선언된 메서드는 본문을 정의할 수 없다.
  • 자식 클래스는 바드시 부모의 abstract 메서드를 재정의 해야 한다.
  • private 키워드를 사용할 수 없다.
  • 새로운 객체 생성이 안 된다. ex) Exam exam = new Exam(); -> x
abstract class Parent
{
    public abstract void func1();
    public abstract void func2();
}

class Child : Parent
{
    public override void func1()
    {
        throw new NotImplementedException();
    }

    public override void func2()
    {
        throw new NotImplementedException();
    }
}

 

Interface

  • 인터페이스는 객체를 생성할 수 없다.
  • 멤버 변수를 포함할 수 없다.
  • 접근 제한자는 public 만을 지원한다.
  • 인터페이스의 메서드를 자식 클래스에서 구현할 경우 반드시 public을 사용해야 한다.
  • 다중 상속이 가능하다. (클래스는 다중 상속이 불가능)
  • 인터페이스의 모든 메서드를 자식 클래스에서 재정의 해야 한다.
interface Inter1
{
    void inter1();
}

interface Inter2
{
    void inter2();
}

interface Inter3
{
    void inter3();
}

public class Child : Inter1, Inter2, Inter3
{
    public void inter1()
    {
        throw new NotImplementedException();
    }

    public void inter2()
    {
        throw new NotImplementedException();
    }

    public void inter3()
    {
        throw new NotImplementedException();
    }
}

 

[출처]

https://junco.tistory.com/133

728x90