[C#기초] 6. 상속
INDEX
상속
상속
- 대상 : 클래스
- 목적 : 클래스의 재사용 -> 코드량 줄이기
- 상속 클래스의 역할
- 부모 클래스 : 상속을 하는 클래스
- 자식 클래스 : 상속을 받는 클래스
class A { … } class B : A { … }
상속 관계에서의 생성자, 소멸자 호출
-
생성자 호출
상위 -> 하위
-
소멸자 호출
하위 -> 상위
base
역할
상위 클래스의 생성자 또는 멤버 변수 및 메서드 호출
활용
멤버 이름의 중복
하위에서 상위 설정 등 (생성자 위주)
base사용 예시
예시1
public class Person { protected string ssn = "444-55-6666"; protected string name = "John L. Malgraine"; public virtual void GetInfo() { Console.WriteLine("Name: {0}", name); Console.WriteLine("SSN: {0}", ssn); } } class Employee : Person { public string id = "ABC567EFG"; public override void GetInfo() { // Calling the base class GetInfo method: base.GetInfo(); Console.WriteLine("Employee ID: {0}", id); } } class TestClass { static void Main() { Employee E = new Employee(); E.GetInfo(); } } /* Output Name: John L. Malgraine SSN: 444-55-6666 Employee ID: ABC567EFG */
예시2
public class BaseClass { int num; public BaseClass() { Console.WriteLine("in BaseClass()"); } public BaseClass(int i) { num = i; Console.WriteLine("in BaseClass(int i)"); } public int GetNum() { return num; } } public class DerivedClass : BaseClass { // This constructor will call BaseClass.BaseClass() public DerivedClass() : base() { } // This constructor will call BaseClass.BaseClass(int i) public DerivedClass(int i) : base(i) { } static void Main() { DerivedClass md = new DerivedClass(); DerivedClass md1 = new DerivedClass(1); } } /* Output: in BaseClass() in BaseClass(int i) */
sealed
상속 불가에 대한 명시
- 클래스, 멤버변수, 메서드
override
override
- 상위 클래스에서는
virtual
명시 - 하위 클래스에서는
override
명시
overload
- 하나의 메서드명에 다양한 매개변수 적용
추상클래스
추상클래스
- 구현하려는 메서드의 형태만 존재하는 클래스
- 추상 클래스는 구현 형태만 제공, 실제 구현은 하위에서 구현
추상클래스의 제한사항
- 추상 클래스는 상속으로만 사용
new
를 통해 생성할 수 없다abstract
가 있는 상위 메서드만 하위에서 모두 구현
형식
abstact class A { public abstract void Print(); … } class B:A { public override void Print() { 구현… } }
다형성
다형성
- 일반적인 형태 : 상위에서 하위 호출
- type2 : type1 + cast형을 이용한 하위 참조 호출 가능
다형성 예제 코드
class A { public virtual void Print() { Console.WriteLine("A print"); } } class B : A { public override void Print() { Console.WriteLine("B print"); } } class Program { static void Main(string[] args) { A Test1 = new B(); Test1.Print(); // cast형을 이용한 참조 B Test2 = new B(); A Test3 = (A)Test2; Test3.Print(); } }
결과