본문 바로가기
C#

[C#] Abstract(추상) vs Virtual(가상) vs Interface(인터페이스) 차이

by ifhead 2022. 8. 30.
반응형

Virtual

  • virtual은 재정의(override)가 선택사항이다.
  • virtual 키워드가 포함된 클래스는 인스턴스화가 가능하다.
  • 상속할 때 어떻게 할 것인지의 문제와 결부되어 있으므로 상속을 염두에 둔 클래스에 적용한다.
  • 일반 메소드는 new를 통해 재정의할 수 있지만 부모 클래스를 기반으로 자식을 인스턴스화하면 부모 메소드가 나온다.
  • 일반 메소드와 달리 override를 통해 재정의하면 부모 클래스를 기반으로 자식을 인스턴스화하더라도 제대로 자식 메소드가 나온다.

 

버추얼 메소드와 일반 메소드의 상속 차이

// Online C# Editor for free
// Write, Edit and Run your C# code using C# Online Compiler

using System;

public class HelloWorld
{
    class A {
        public A(){}
        
        public void NormalMethod(){
            Console.WriteLine (" 부모의 보통 메소드");
        }
        
        public virtual void VirtualMethod(){
            Console.WriteLine (" 부모의 버추얼 메소드");
        }
    }
    
    class B : A {
        public B(){}
        
        new public void NormalMethod(){
            Console.WriteLine (" 자식의 재정의한 보통 메소드");
        }
        
        public override void VirtualMethod(){
            Console.WriteLine (" 자식의 오버라이드한 버추얼 메소드");
        }
    }
    
    
    public static void Main(string[] args)
    {
        Console.WriteLine("B b");
        B bb = new B();
        bb.NormalMethod();
        bb.VirtualMethod();
        
        // ---------------
        
        Console.WriteLine("A a");
        A a = new A();
        a.NormalMethod();
        a.VirtualMethod();
        
        // ---------------
        
        Console.WriteLine("A <- b");
        A abb = bb;
        abb.NormalMethod();
        abb.VirtualMethod();
        
        // ---------------
        
        Console.WriteLine("A b");
        A ab = new B();
        ab.NormalMethod();
        ab.VirtualMethod();
        
        // 에러 : An explicit conversion exists (are you missing a cast?)
        // B ba = new A();
        // ba.NormalMethod();
        // ba.VirtualMethod();
    }
}

 

결과 화면

 

Abstract

  • abstract는 자식 클래스에서 반드시 재정의해야 한다.
  • 필드 혹은 메소드에 abstract를 사용하려면 클래스도 abstract여야 한다.
  • abstract 클래스라고 해서 구성요소까지 모두 abstract여야만 하는 것은 아니다.
  • abstract 클래스는 인스턴스화할 수 없다.

 

interface

  • abstract와 달리 interface는 다중 상속이 가능하다.
  • abstract가 아닌 필드는 정의할 수 없다.
  • 정의만 있고 구현 내용이 없다.
  • 접근 제한자를 사용할 수 없으며 모든 필드는 public이 적용된다.
  • interface는 상속의 개념이 아니라 기능을 탑재하는 개념이다. Has-A not Is-A.

 

 

반응형

댓글