떼닝로그

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

개발로그/기타 이론 정리

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

떼닝 2024. 10. 8. 17:30

 

예전에는 이런 거 알아봐야 정말 필요가 있을까? 생각도 했지만

그것은 내가 지금껏 얼레벌레 개발을 해왔기 때문에 중요성을 못 느꼈다는 것을 최근에 깨달았다

실제 운용 중인 서비스(내가 하고 있는 걸 서비스라고 할 수 있을까 싶긴 하지만ㅋ)는 정말 방대하고

그를 위해 OOP나 여러 구조들이 유기적으로 들어가 있다.

 

이번에 개발을 진행하면서 아 내가 이런 점이 부족했구나 싶어 virtual, abstract, interface의 특징들을 구분해보고자 한다.

개발 천재...는 아니고 아무튼 개발왕이 되는 그날까지...!!

 

Virtual (가상) 키워드

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/virtual

- virtual 키워드는 메소드, 속성, 인덱서 또는 이벤트 선언을 수정할 때 사용한다.

- 파생 클래스에서 재정의(override)할 수는 있으나, 필수 사항은 아니다.

public class Vehicle
{
    public virtual void Ride()
    {
        Console.WriteLine("앞으로 달린다=3=3");
    }
}

public class Motorbike : Vehicle
{
    public override void Ride()
    {
        Console.WriteLine("앞바퀴를 들고 달린다=3=3");
    }
}

public class Car : Vehicle
{
    public override void Ride()
    {
        Console.WriteLine("앞으로 부와앙 달린다=3=3");
    }
}

Motorbike mb = new Moborbike();
Car lambo = new Car();
mb.Ride();	// 앞바퀴를 들고 달린다=3=3
lambo.Ride();	// 앞으로 부와앙 달린다=3=3

 

Abstract (추상) 키워드

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/abstract

- abstract를 사용함으로써 클래스가 자체에서 인스턴스화 되지 않고, 기본 클래스의 공통적인 정의로만 사용됨을 나타낸다.

- 추상으로 표시된 멤버는 파생 클래스의 멤버에 의해 필수적으로 구현되어야 한다.

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

public class Vehicle
{
    public abstract void Ride();
}

public class Motorbike : Vehicle
{
    public override void Ride()
    {
        Console.WriteLine("앞바퀴를 들고 달린다=3=3");
    }
}

public class Car : Vehicle
{
    public override void Ride()
    {
        Console.WriteLine("앞으로 부와앙 달린다=3=3");
    }
}

Motorbike mb = new Moborbike();
Car lambo = new Car();
mb.Ride();	// 앞바퀴를 들고 달린다=3=3
lambo.Ride();	// 앞으로 부와앙 달린다=3=3

 

Interface (인터페이스) 키워드

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/interface

https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/types/interfaces

- class 또는 struct의 멤버에 대한 기본 구현을 정의하며, 여러 소스의 동작을 클래스에 포함 가능

- abstract와 비슷하지만, 변수를 사용할 수 없음. property는 사용 가능

- 규칙에 따라 인터페이스 이름은 대문자 I로 시작한다

public interface IVehicle
{
    void Ride();
    
    string Name
    {
        get;
        set;
    }
}

class Car : IVehicle
{
    private string name;
    
    public override void Ride()
    {
        Console.WriteLine(name + "이(가) 앞으로 부와앙 달린다=3=3");
    }
    
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
}

Car lambo = new Car();
lambo.Name = "람보르기니";
lambo.Ride();	// 람보르기니이(가) 앞으로 부와앙 달린다=3=3

 

 

Virtual(가상) vs Abstract(추상) vs Interface(인터페이스)

- virtual은 하나의 기능을 하는 완전한 메소드이며, 파생 클래스에서 재정의함으로써 기능을 추가하여 사용 가능하다.

- abstract는 여러 파생 클래스의 공통적인 정의를 위해 사용하며, 모든 파생 클래스에서 abstract 메소드에 대한 신규 정의가 필수적이다.

- interface는 abstract와 달리 멤버 변수를 사용할 수 없다. class 또는 struct의 멤버에 대한 기본 구현을 정의하며, 서로 다른 계층이나 타입이라도 같은 기능을 추가하고 싶을 때 사용한다.

 

Comments