Programing/C#
C# 프로그래밍의 기초: 추상 클래스와 인터페이스
유니얼
2024. 8. 24. 14:58
728x90
C# 프로그래밍에서 추상 클래스와 인터페이스는 객체 지향 프로그래밍의 다형성과 코드 재사용을 구현하는 핵심 구조입니다. 이 두 구조는 서로 다른 방식으로 클래스 간의 계약을 정의하고, 구현을 강제하여 설계의 일관성을 유지하도록 돕습니다. 이 블로그 포스트에서는 추상 클래스와 인터페이스의 개념을 설명하고, C#에서 이를 어떻게 활용할 수 있는지를 탐구합니다.
추상 클래스(Abstract Class)
추상 클래스는 인스턴스화할 수 없는 클래스입니다. 이는 하나 이상의 추상 메서드를 포함하거나, 구현된 메서드를 가질 수 있으며, 다른 클래스가 상속받아 사용하도록 설계되었습니다.
주요 특징:
- 기본 구현 제공: 추상 클래스는 일부 메서드나 속성에 대한 기본 구현을 제공할 수 있습니다.
- 강제 구현: 하나 이상의 추상 메서드를 포함할 수 있으며, 이러한 메서드는 상속받는 서브 클래스에서 반드시 구현해야 합니다.
- 상속 제한: 하나의 추상 클래스만 상속받을 수 있습니다.
예제코드:
public abstract class Animal
{
public abstract void MakeSound();
public void Sleep()
{
Console.WriteLine("The animal is sleeping.");
}
}
인터페이스(Interface)
인터페이스는 메서드, 속성, 이벤트의 시그니처만을 정의하는 계약입니다. 인터페이스 자체는 어떠한 구현도 포함하지 않으며, 이를 구현하는 클래스는 인터페이스의 모든 메서드를 구현해야 합니다.
주요 특징:
- 구현 강제: 인터페이스에 선언된 모든 메서드는 구현 클래스에서 반드시 구현해야 합니다.
- 다중 구현: 클래스는 여러 인터페이스를 동시에 구현할 수 있습니다, 이는 C#에서 다중 상속을 허용하지 않는 한계를 극복합니다.
- 타입 유연성: 인터페이스는 다양한 클래스가 동일한 인터페이스를 구현함으로써 일관된 방식으로 처리될 수 있도록 합니다.
예제코드:
public interface IAnimalActions
{
void Eat();
void Move();
}
추상 클래스와 인터페이스의 차이점
- 구현 유무: 추상 클래스는 기본 구현을 포함할 수 있지만, 인터페이스는 시그니처만을 정의하고 구현을 포함할 수 없습니다.
- 상속 방식: 클래스는 하나의 추상 클래스만 상속받을 수 있으나, 여러 인터페이스를 구현할 수 있습니다.
- 용도: 추상 클래스는 관련된 클래스 간의 공통 기능을 정의하는 데 사용되며, 인터페이스는 서로 관련 없는 클래스에 특정 기능을 추가하는 데 사용됩니다.
전체예제 코드
using System;
namespace CSharp_ProgramingStudy.Chapter5_OOP
{
public abstract class Animal
{
public abstract void MakeSound();
public void Sleep()
{
Console.WriteLine("The animal is sleeping.");
}
}
public interface IAnimalActions
{
void Eat();
void Move();
}
public class Dog : Animal, IAnimalActions
{
public override void MakeSound()
{
Console.WriteLine("The dog barks: Woof woof!");
}
public void Eat()
{
Console.WriteLine("The dog is eating.");
}
public void Move()
{
Console.WriteLine("The dog is running.");
}
}
public class Class11
{
public void Run()
{
Dog myDog = new Dog();
myDog.MakeSound();
myDog.Sleep();
myDog.Eat();
myDog.Move();
}
}
}
결론
추상 클래스와 인터페이스는 C# 프로그래밍에서 객체 지향 설계의 기본을 이루며, 다형성을 활용하는 강력한 수단입니다. 올바르게 사용될 때, 이들은 코드의 유지보수성, 확장성 및 재사용성을 크게 향상시킬 수 있습니다. 각 프로젝트의 요구사항에 맞춰 적절한 구조를 선택하는 것이 중요합니다.
반응형