C# 상속
부모 클래스와 파생(자식) 클래스
C#에서 상속이란 부모의 기능과 속성을 특정 클래스가 물려받게 하는 것.
상속받은 파생 클래스는 부모 클래스 데이터 및 메서드들에 접근할 수 있다.
(만약 접근 지정자가 public 또는 protected 라면)
사용 예시
몬스터라는 클래스를 상속받아 다양한 타입의 몬스터 (고블린, 슬라임, 골렘 등등)을 만드려는 상황이라고 가정해보겠다.
먼저 기본이 되는 BaseMonster 클래스를 만들고 이곳에 필요한 다양한 전역변수들을 생성한다.
BaseMonster를 상속받을 Goblin, Slime 클래스를 만들고 BaseMonster를 상속받는다.
BaseMonster의 변수와 메서드에 접근할 수 있게 된다.
public class BaseMonster : MonoBehaviour
{
private float _speed = 5;
public float Speed => _speed;
private float _atkPower = 10;
public float AtkPower => _atkPower;
}
public class Goblin : BaseMonster // 콜론을 찍고 콜론 뒤에 부모 클래스 이름을 작성
{
public void DebugSpeed()
{
Debug.Log(Speed); //부모의 전역변수에 접근 가능
}
}
public class Slime : BaseMonster
{
public void DebugAtk()
{
Debug.Log(AtkPower);
}
}
추상 abstract와 가상 virtual
위의 예시에서 조금 더 생각해보면, Goblin과 Slime은 둘 다 몬스터고 움직이는 것과 기본공격하는 것은 똑같다.
이런 요소들은 부모에서 virtual 키워드를 사용하여 부모에서 함수를 구현하면 된다.
이런 기본 요소들을 제외하면, Goblin은 깨물기 스킬, Slime은 점프 공격 스킬 처럼 각자 고유한 스킬이 있을 것이다.
이런 요소들은 부모에서 abstract 키워드를 사용하여 자식은 상속만 받고 자식에서 함수를 구현하면 된다.
사용 예시들은 아래서 자세히 알아보겠다.
virtual
위의 예시 그대로 설명
사용 예시 / 사용 방법
(부모)
public abstract class BaseMonster : MonoBehaviour
{
public virtual void Move() //접근 지정자 뒤에 virtual 쓰기
{
//움직이는 동작 구현
}
public virtual void Attack() //접근 지정자 뒤에 virtual 쓰기
{
//기본공격하는 동작 구현
}
}
부모에서 메서드를 구현할 때 접근 지정자 뒤에 virtual 키워드를 붙인다.
(자식)
public class Goblin : BaseMonster
{
public override void Move() //override 키워드를 이용해 부모의 메서드를 상속받을 수 있다.
{
//여기에 추가적인 Move관련 행동들을 만들 수도 있다. 만약 만들지 않으면 부모의 메서드만 그대로 따른다.
base.Move(); //부모의 Move메서드를 그대로 실행한다는 것
}
public override void Attack()
{
base.Attack();
}
}
자식에서 부모의 virtual 메서드를 상속받으려면 override 키워드를 사용한다.
이렇게만 보면 굳이 virtual로 구현하지 않고 일반 함수로 구현해도 되지만,
상속받을 때 부모의 기본 동작 외에 다른 동작 기능을 추가할 수도 있으므로 virtual을 사용해주는 것이 좋다.
만약 부모의 기본 동작을 사용하지 않고, 다른 동작 기능을 추가할 것이라면, base.메소드() 이 부분은 삭제해도 된다.
abstract
사용 예시 / 사용 방법
(부모)
public abstract class BaseMonster : MonoBehaviour
{
public abstract void Skill(); //접근 지정자 뒤에 abstract 붙이기
}
부모에서 메서드를 구현할 때 접근 지정자 뒤에 abstract 키워드를 붙인다.
abstract 메서드의 내부는 구현하면 안된다.
(클래스에도 abstract 키워드를 붙여야 한다.)
(자식)
public class Goblin : BaseMonster
{
public override void Skill()
{
//고블린 고유의 스킬 구현
}
}
public class Slime : BaseMonster
{
public override void Skill()
{
//슬라임 고유의 스킬 구현
}
}
자식에서 부모의 abstract 메서드를 상속받으려면 override 키워드를 사용한다.
부모의 abstract 함수를 override한 함수에 특별한 스킬 기능들을 넣어주면 하나의 몬스터가 완성된다.
사용 가능 범위
예시를 추상화 메서드, 가상화 메서드로만 들었는데, 메서드 말고ㄷ 다양한 곳에 쓰일 수 있다.
사용 가능한 범위는 아래와 같다.
abstract - 함수, 속성, 인덱서, 이벤트, 클래스
virtual - 함수, 속성, 인덱서, 이벤트
'C# 기초' 카테고리의 다른 글
[C#] sealed class (상속 금지)와 partial class (0) | 2023.10.25 |
---|---|
[C#] 상속 - 인터페이스(interface) (0) | 2023.10.25 |
[C#] Static 정적 키워드와 확장 메서드 (1) | 2023.10.25 |
[C#] Collections (0) | 2023.10.24 |
[C#] ref, in, out 참조에 의한 호출 (0) | 2023.10.23 |