클래스의 상속 (Class inheritance)
- 자식 클래스에 부모 클래스를 상속
- 부모클래스를 상속받은 자식 클래스는 부모 클래스의 모든 멤버를 물려받게 된다.
(다만, 생성자는 상속이 되지 않으며 객체 생성 시 부모 클래스의 생성자가 자동으로 호출) - 부모클래스의 생성자가 먼저 호출되고 자식 클래스의 생성자가 호출 , 소멸시는 반대
using System;
namespace CSharps
{
class Parent
{
public int num;
public Parent() //부모 클래스의 생성자
{
Console.WriteLine("부모 클래스의 생성자가 호출되었습니다.");
}
}
class Child : Parent // 상속 :
{
public Child(int num)
{
base.num = num; // this는 자신을 가리키는 것이다. 부모에 접근은 가능. 그러나 base를 이용하여 부모 멤버 변수 접근 가능
Console.WriteLine("자식 클래스의 생성자가 호출되었습니다.");
}
public void DisplayValue()
{
Console.WriteLine("num의 값은 {0} 입니다.", num); //부모 클래스의 멤버변수 사용
}
}
class Program
{
static void Main(string[] args)
{
Child cd = new Child(20);
cd.DisplayValue();
}
}
}
Sealed
- sealed 된 클래스는 다른 클래스의 부모가 될 수 없다.
- 의도하지 않은 상속을 불가능하게 한다.
using System;
namespace CSharps
{
sealed class Parent sealed된 클래스
{
public int num;
public Parent() //부모 클래스의 생성자
{
Console.WriteLine("부모 클래스의 생성자가 호출되었습니다.");
}
}
class Child : Parent //상속불가
{
public Child(int num)
{
base.num = num;
Console.WriteLine("자식 클래스의 생성자가 호출되었습니다.");
}
}
set과 get
- set : 속성을 읽어온다
- get : 값을 새롭게 셋팅할 때 사용
- 접근제한자를 통해 접근 제한된 클래스 내부에 있는 변수를 수정해야할 경우 사용
using System;
namespace CSharps
{
public class Myclass
{
private string name = "Mai"; //private로 보호되고 있음
public string Name
{
get{ //이름을 읽어옴
return name;
}
set{ // 이름을 초기화시킴(세로운 값 셋팅)
name = value;
}
}
}
class Program
{
static void Main(string[] args)
{
Myclass mc = new Myclass();
Console.WriteLine("mc.Name : {0}", mc.Name);
mc.Name = "mizuno"; //새로운 값 정의
Console.WriteLine("mc.Name : {0}", mc.Name);
}
}
}
메소드 재정의 (Virtual, override)
- 부모 클래스의 메소드를 자식 클래스에서 다시 정의하고 싶을 때 사용
- Virtual : 자식 클래스에서 메소드를 재정의시 부모 클래스의 메소드에 사용
- override : 부모 클래스내에서 virtual로 선언된 메소드를 자식클래스에서 재정의
using System;
namespace CSharps
{
class Parent
{
public virtual void method() //자식 클래스에서 재정의를 위한 virtual
{
Console.WriteLine("부모 클래의 메서드 호출!");
}
}
class Child : Parent
{
public override void method() //virual 선언된 부모클래스의 메소드를 재정의
{
Console.WriteLine("자식 클래스(Child)의 메서드 호출!");
}
}
class Son : Parent{
public override void method() //virual 선언된 부모클래스의 메소드를 재정의
{
Console.WriteLine("자식 클래스(Son)의 메서드 호출!");
}
}
class Program
{
static void Main(string[] args)
{
Parent parent = new Parent();
parent.method();
Child child = new Child();
child.method();
Son son = new Son();
son.method();
}
}
}
업캐스팅과 다운캐스팅 (Upcasting and Downcasting)
- 업캐스킹 : 자식 클래스의 객체가 부모 클래스의 형태로 변환
- 다움캐스팅 : 부모 클래스의 객체가 지식 클래스의 형태로 변환
class Country {
}
class Korea : Country{
}
class Program
{
static void Main(string[] args)
{
Korea korea = new Korea();
Country country = korea; // 업캐스팅
Korea RPKorea = (Korea)country; //다운캐스팅
}
}