반응형
상속 관련 키워드
- 일반 클래스 (class)
- 추상 클래스 (abstract class)
- 인터페이스 (interface)
일반 클래스의 경우
class Animal
{
public void Speak()
{
Console.WriteLine("I`m Animal.");
}
}
class Dog : Animal
{
public void Speak() // CS0108
{
Console.WriteLine("I`m Dog.");
}
}
class Program
{
static void Main(string[] args)
{
var dog = new Dog();
dog.Speak(); // I`m Dog.
((Animal)dog).Speak(); // I`m Animal.
}
}
Speak() 함수를 virtual로 선언한 이후에 override한 경우 출력값이 변경되었습니다.
class Animal
{
public virtual void Speak()
{
Console.WriteLine("I`m Animal.");
}
}
class Dog : Animal
{
public override void Speak() // CS0108
{
Console.WriteLine("I`m Dog.");
}
}
class Program
{
static void Main(string[] args)
{
var dog = new Dog();
dog.Speak(); // I`m Dog.
((Animal)dog).Speak(); // I`m Dog.
}
}
class에 abstract 키워드를 추가하였다. 이를 추상 클래스라고 부른다.
abstract class Animal // abstract 키워드 추가
{
public abstract void Walk(); // 선언만 가능
public virtual void Speak()
{
Console.WriteLine("I`m Animal.");
}
}
class Dog : Animal
{
public override void Walk() // 무조건 구현되어야함
{
Console.WriteLine("Walk.");
}
public override void Speak()
{
Console.WriteLine("I`m Dog.");
}
}
class Program
{
static void Main(string[] args)
{
//var animal = new Animal(); // Error 추상 형식은 인스턴스화 할 수 없다.
var dog = new Dog();
dog.Speak(); // I`m Dog.
((Animal)dog).Speak(); // I`m Dog.
}
}
Interface를 통해서 구현한 경우
interface IAnimal
{
// 접근 지정자 public으로 고정
void Eat()
{
Console.WriteLine("Eat something.");
}
void Bark(); // abstract 키워드가 없어도 하위 클래스에서 구현해야한다.
abstract void Walk();
abstract void Run();
//virtual void Fly(); virtual 키워드 입력 불가
virtual void Speak()
{
Console.WriteLine("I`m Animal.");
}
}
class Dog : IAnimal
{
public void Bark()
{
Console.WriteLine("Bark.");
}
public void Walk()
{
Console.WriteLine("Walk.");
}
public void Run() // override 키워드 입력 불가
{
Console.WriteLine("Run.");
}
/*
public override void Run() // override 키워드 입력 불가
{
Console.WriteLine("Run.");
}
*/
public void Speak()
{
Console.WriteLine("I`m Dog.");
}
}
class Program
{
static void Main(string[] args)
{
var dog = new Dog();
dog.Speak(); // I`m Dog.
((IAnimal)dog).Speak(); // I`m Dog.
}
}
인터페이스를 사용하는 이유
- 다중 상속이 가능하다.
- 클래스 간에 느슨한 결합이 가능하다.
'프로그래밍 > C#' 카테고리의 다른 글
C# Ceiling(), Floor(), Round(), Truncate() 올림 내림 반올림 버림 (4) | 2023.03.14 |
---|---|
C# 대리자(Delegate)에 대해서 (0) | 2023.03.13 |
C# 숫자 서식 지정자(Number Format Specifier) (0) | 2023.02.21 |
C# 커맨드 라인(CommandLine) 파싱 라이브러리 소개 (0) | 2023.02.17 |
C# 이스케이프 시퀀스(Escape sequence) (0) | 2023.02.14 |
댓글