상속
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
공통된 부분을 한 클래스에 두고, 차이나는 부분만 따로 정의 하는 문법입니다.
공통을 담는 쪽을 기반 클래스, 물려받아 차이를 더하는 쪽은 파생 클래스 라고 합니다.
public class <파생 클래스 이름> : <기반 클래스 이름> { // 차이나는 부분만 }
public class Item
{
// 접근제한자 protected : 이 클래스를 상속받은 클래스에서 사용 가능.
public string Name { get; protected set; }
public string Description { get; private set; }
public Item(string name, string description)
{
Name = name;
Description = description;
}
public void Use()
{
Console.WriteLine($"{Name} 아이템을 사용했다.");
}
public void Drop()
{
Console.WriteLine($"{Name} 아이템을 버렸다.");
}
}
public class Sword : Item
{
public Sword(string name, string description) : base(name, description)
{
}
- 자식 클래스에서 부모클래스로의 형변환
자식클래스에서는 부모클래스가 무엇을 가지고 있는지 알지만
부모클래스에서는 자식클래스가 무엇을 가지고 있는지 확인이 불가능하다.
따라서, 자식클래스의 인스턴스를 가지고 있더라도 자료형이
상위 클래스라면, 상위 클래스의 기능만 사용가능하다.
public class Program
{
public static void Main(string[] args)
{
Item potion = new Potion();
int Num = potion.num; //
string Name = potion.name; // name을 읽어올 수 없다. 오류
}
}
public class Item
{
public int num;
}
public class Potion : Item
{
public string name;
}
부모클래스에서 자식클래스로 형변환 한 것이다.
업캐스팅은 암시적형변환이 가능하지만, 다운캐스팅은 명시해줘야한다.
// 1번째 방법
if (sword is Sword) // 변환이 가능하다면 진행
{
s = (Sword)sword;
s.Upgrade(); // Upgrade 실행 완료.
}
// 2번째 방법
// (sword as Sword)가 가능한 상태라면 변환해주고,
// 불가능 하다면 쓰레기값 (null)을 넣는다.
(sword as Sword).Upgrade();
public class Item
{
}
public class Sword : Item
{
public void Upgrade()
{
Console.WriteLine("업그레이드");
}
}
: base (...) -> 파생 생성자에서 기반 생성자를 지정할 때
base.멤버 -> 파생 클래스 안에서 기반 클래스의 멤버를 가리킬 때
기반 생성자 > 파생 생성자 순으로 호출된다.
public class Program
{
public static void Main(string[] args)
{
Item sword = new Sword("이름");
}
}
public class Item
{
protected string Name;
public Item(string name)
{
Console.WriteLine("부모생성자 호출");
Name = name;
}
}
public class Sword : Item
{
public Sword(string name) : base(name)
{
Console.WriteLine("자식생성자 호출");
Name = name;
}
}
출력 :
부모생성자 호출
자식생성자 호출
기반 클래스가 열어놓은 메서드를 파생 클래스에서 자기 방식대로 다시 정의하는 것입니다.
기반 클래스의 메서드에 virtual ,
파생 클래스의 메서드에는 override 를 붙입니다.
public class Monster
{
protected string name;
public virtual void Attack()
{
Console.WriteLine("공격!");
}
}
public class Slime : Monster
{
public override void Attack()
{
Console.WriteLine(name + "이(가) 몸을 부딪칩니다.");
}
}
public class Dragon : Monster
{
public override void Attack()
{
Console.WriteLine(name + "이(가) 불을 뿜습니다.");
}
}
기반클래스의 동작을 유지하면서 추가로 더하고 싶다면 base.메서드( )를 부르면 된다.
public class Slime : Monster
{
public override void Attack()
{
base.Attack();
Console.WriteLine(name + "이(가) 몸을 부딪칩니다.");
}
}
출력 :
공격!
슬라임이(가) 몸을 부딪칩니다.
※ 주의) 오버로딩과 오버라이딩 혼동 위험
| 항목 | 오버로딩 (overloading) | 오버라이딩 (overriding) |
|---|---|---|
| 무엇 | 같은 이름의 메서드를 여러 개 정의 | 물려받은 메서드를 다시 정의 |
| 어디 | 같은 클래스 안 | 기반 클래스와 파생 클래스 사이 |
| 매개변수 | 달라야 함 | 같아야 함 |
| 키워드 | 없음 | virtual·override |
| 언제 정해지는가 | 컴파일 때 | 실행 때 |
