재밌고 어려운 IT를 이해해보자~!
클래스의 상속 본문
class 부모 클래스
{
// ...
}
class 자식 클래스 : 부모 클래스
{
// 부모 클래스의 모든 상태와 행동이 전달 됨.
}
은 private로 선언된 멤버는 상속할 수 없다.
using System;
namespace ConsoleApplication8
{
class Parent
{
public int num;
public Parent()
{
Console.WriteLine("부모 클래스의 생성자가 호출되었습니다.");
}
}
class Child : Parent
{
public Child(int num)
{
this.num = num;
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 키워드를 사용하게 되면, 이 클래스를 상속시키는 건 더이상 할 수 없다.
sealed class Parent
{
public int num;
public Parent()
{
Console.WriteLine("부모 클래스의 생성자가 호출되었습니다");
}
}
class Child : Parent
{
public int num;
public Child(int num)
{
this.num = num;
Console.WriteLine("자식 클래스의 생성자가 호출되었습니다.");
}
public void DisplayValue()
{
Console.WriteLine("num의 값은 {0} 입니다.", num);
}
}
set, get
set, get 접근자는 각각 속성을 읽거나, 새 값을 할당할 때 사용된다.
멤버변수 접근시 사용
using System;
namespace ConsoleApplication14
{
public class MyClass
{
private string name = "John";
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 = "Bree";
Console.WriteLine("mc.Name : {0}", mc.Name);
}
}
}
메소드 재정의(virtual, override)
부모 클래스의 메소드를 자식 클래스에서 다시 정의하고 싶을때 virtual, override 키워드가 사용딘다.
virtual 키워드는 자식 클래스에서 메소드를 재정의 하고 싶을때 재정의 될 부모 클래스의 메소드에 사용되며, override 키워드는 부모 클래스 내에서 virtual로 선언된 메소드를 재정의 하겠다는 표시를 하는 것과 같다.
using System;
namespace ConsoleApplication21
{
class Parent
{
public virtual void A()
{
Console.WriteLine("부모 클래스의 A() 메서드 호출!");
}
}
class Child : Parent
{
public override void A()
{
Console.WriteLine("자식 클래스(Child)의 A() 메서드 호출!");
}
}
class Daughter : Parent
{
public override void A()
{
Console.WriteLine("자식 클래스(Daughter)의 A() 메서드 호출!");
}
}
class Program
{
static void Main(string[] args)
{
Parent parent = new Parent();
parent.A();
Child child = new Child();
child.A();
Daughter daughter = new Daughter();
daughter.A();
}
}
}
멤버 숨기기(new)
new 지정자를 사용하면 부모 클래스의 멤버를 숨길 수 있게된다.
부모 클래스에서 정의된 메소드, 멤버 변수의 이름이 자식 클래스에도 같은 이름으로 존재한다면 부모 클래스의 멤버는 new 지정자를 사용하지 않아도 숨길 수 있으나, 부모 클래스의 멤버가 숨겨진다는 경고가 발생합니다. 이 경고는 new 지정자를 사용하면 사라진다.
using System;
namespace ConsoleApplication21
{
class Parent
{
public int x = 100;
public void A()
{
Console.WriteLine("부모 클래스의 A() 메서드 호출!");
}
}
class Child : Parent
{
public new int x = 200;
public new void A()
{
Console.WriteLine("자식 클래스(Child)의 A() 메서드 호출!");
}
}
class Program
{
static void Main(string[] args)
{
Parent parent = new Parent();
parent.A();
Console.WriteLine("x : {0}", parent.x);
Child child = new Child();
child.A();
Console.WriteLine("x : {0}", child.x);
}
}
}
업캐스팅과 다운캐스팅(Upcasting and Downcasting)
class Animal { }
class Dog : Animal { }
Dog dog = new Dog();
Animal animal = dog; // 업캐스팅
Dog sameDog = (Dog)animal; // 다운캐스팅
Comments