abstract
키워드를 사용하면 상속 받는 클래스에서 공톡적으로 구현해야 하는 클래스나 멤버를 만들 수 있다.
자식 클래스에 공통적인 정의를 제공하는 것이다.
클래스 정의 앞에 abstract
키워드를 선언하면 클래스를 추상 클래스로 선언할 수 있다.
public abstract class [클래스 이름]
{
// 클래스 맴버
}
추상 클래스는 객체화(인스턴스화) 할 수 없다.
추상클래스의 목적은 여러 파생 클래스에서 공유할 수 있는 기본 클래스의 공통적인 정의를 제공하는 것이다.
추상 클래스에서는 추상 메서드도 정의할 수 있다.
추상 메서드는 추상 클래스와 마찬가지로 abstrat
키워드를 사용하여 상속받은 클래스에서 함수를 재정의하는 것이다.
public abstract class [클래스 이름]
{
public abstract void [함수 이름](int i);
}
추상 메서드에는 구현 부분이 없으므로 상속받은 클래스에서 구현 부분을 반드시 재정의해야 한다.
override
키워드를 이용하여 재정의한다.
public override void [상속받은 함수 이름] { ... 내용 구현이 필요 };
추상클래스Monster와 추상 메서드 Shout()를 사용
// Creature.cs
// 추상클래스 Monster
public abstract class Monster
{
// 추상 매서드 Shout() 파생 클래스에서 반드시 구현해야 한다.
public abstract void Shout();
}
// Monster를 상속받는 Orc
class Orc : Monster
{
// 재정의된 Shout()
public override void Shout()
{
Console.WriteLine("끄아악!");
}
}
// Monster를 상속받는 Skeleton
class Skeleton : Monster
{
// 재정의된 Shout()
public override void Shout()
{
Console.WriteLine("으어억!");
}
}
결과
orc1
과skeleton1
은 새로 재정의된Shout()
를 실행하여 다른 값을 출력했다.
만약 추상 메서드를 재정의 하지 않으면 어떻게 될까?
아래와 같은 애러가 발생한다.
정리
1.
Monster
라는 클래스를 상속받는 클래스들은 각각 공통된 멤버인Shout()
를 갖게 되고 각자에 맞게 재정의 해 줄 수 있게 된다.2. 추상 메서드를 구현하지 않을 경우 컴파일 에러가 난다.
클래스와 비슷하게 매서드, 속성, 이벤트 등을 갖지만, 이를 직접 구현하지 않고 단지 정의만을 갖는다.
추상 메서드를 가진 추상 클래스와 개념이 비슷하다.
접근 제한자를 사용하지 않고 interface
키워드를 사용하여 정의한다.
// IFlyable를 가지고 있다면 Fly()를 가지고 있어야한다, 기능은 각자 정의
interface IFlyable
{
void Fly();
}
인터페이스의 이름을 정할때 I를 붙여 표시한다고 한다.
다수의 인터페이스를 가질 수 있다.
추상 클래스는 클래스이기 때문에 다중으로 상속이 불가능하지만, 인터페이스의 경우 하나의 클래스가 여러 인터페이스를 가질 수 있고, 가지고 있는 인터페이스의 모든 멤버에 대한 구현이 필요하다.
// base인 Orc클래스와 두 개의 인터페이스를 가진다.
class FlyableOrc : Orc, IFlyable, IAttackable
{
// 추상 클래스 Orc가 가진 추상 매서드
public override void Shout()
{
Console.WriteLine("끄으억");
}
// IFlyable에 정의된 메서드
public void Fly()
{
}
// IAttackable에 정의된 메서드
public void Attack()
{
}
}
인터페이스는 접근 제한자를 사용하지 않는다.
인터페이스는 접근 제한자를 지정해줄 수 없고, 인터페이스의 멤버의 경우 public으로 접근 권한기 기본으로 지정된다.
// 추상클래스 Monster
public abstract class Monster
{
// 추상 매서드 Shout() 파생 클래스에서 반드시 구현해야 한다.
public abstract void Shout();
}
// Monster를 상속받는 Orc
class Orc : Monster
{
// 재정의된 Shout()
public override void Shout()
{
Console.WriteLine("끄아악!");
}
}
// Monster를 상속받는 Skeleton
class Skeleton : Monster
{
// 재정의된 Shout()
public override void Shout()
{
Console.WriteLine("으어억!");
}
}
// 인터페이스 IFlyable, IAttackable
interface IFlyable
{
void Fly();
}
interface IAttackable
{
void Attack();
}
// 여러 인터페이스를 가진 FlyableOrc
class FlyableOrc : Orc, IFlyable, IAttackable
{
public override void Shout()
{
Console.WriteLine("끄으억");
}
public void Fly()
{
}
public void Attack()
{
}
}
인터페이스를 구현하지 않는 경우
아래와 같은 컴파일 에러가 난다.
정리
1. 하나의 클래스는 여러 인터페이스를 가질 수 있다.
2. 인터페이스를 가지고 있을 경우 인터페이스에 정의된 모든 멤버를 구현해야 한다.
인프런 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문 강의를 듣고 공식 문서를 참고하여 정리한 글 입니다.
개인 공부를 정리한 글이기 때문에 틀린 부분이 있을 수 있습니다.