멤버 숨기기
상속을 받으면 자식은 부모의 모든 멤버를 물려받게 된다(선택적으로 받을 수 없음). 하지만 물려받은 멤버를 새로 정의하여 원하는 기능을 부여할 수 있다. 부모의 메서드를 자식이 다시 정의하면 부모의 메서드는 숨겨지게 되는데 이때 메서드에 new 지정자를 붙인다. 부모의 메서드를 자식이 다시 정의해도 가려지기만 할 뿐 여전히 상속은 되어서 숨겨진 부모의 멤버를 참조할 때는 base 키워드를 사용하면 된다.
class Base
{
public int a;
}
class Derived : Base
{
public new double a;
}
internal class Program
{
private static void Main(string[] args)
{
Base B = new Base();
Derived D = new Derived();
B.a = 1234;
D.a = 5.678;
Console.WriteLine(B.a);
Console.WriteLine(D.a);
}
}
Derived 클래스는 Base가 선언한 정수형의 a 필드를 상속받고 같은 이름으로 실수형의 a필드를 또 선언한다. 우연히 겹친것이 아닌 의도된 것임을 new 지정자로 밝힌다. 이렇게 되면 상속받은 a는 새로 선언한 실수 a에 의해 가려진다. 자식 클래스에서 숨겨진 정수를 읽으려면 base.a 구문을 사용한다.
메서드 재정의
부모의 함수가 자식의 동작과 맞지 않을 때 자식은 함수를 재정의(Override) 한다. 메서드 뿐만 아니라 프로퍼티, 인덱스같은 함수형 멤버는 모두 재정의 할 수 있다. 이 때 부모와 자식 클래스는 다음 지정자로 재정의 한다는 것을 표시한다.
- virtual: 부모의 메서드 앞에 붙이며 재정의 할 수 있다는 뜻.
- override: 자식의 메서드 앞에 붙이며 부모와 다르게 구현한다는 뜻. 재정의하는 함수는 부모의 함수와 이름과 시그니처도 일치해야 한다.
부모가 virtual로 허락한 함수만 자식이 override로 재정의 할 수 있다. 자식은 부모의 메서드를 재정의할 수 있으며 이 경우 가상 메서드는 호출 객체의 실제 타입에 따라 선택된다. 이 정의에 의해 똑같은 호출문이라도 변수가 실행중에 가리키는 타입에 따라 실제 동작이 달라지는데 이것이 바로 '다형성'이다.
상속 관점 class 종류
- 구현클래스: 모든 클래스 구현 -> 객체 생성 가능
- 추상클래스: 메서드 이름만 구현 -> 객체 생성 불가능
- 인터페이스: 메서드의 목록만 가지는 타입 -> 객체 생성 불가능
// abstract 클래스는 상속을 전제로 한다.
// abstract 메서드는 자동으로 virtual의 특징을 갖게 된다.
// abastract의 자식 클래스는 virtual 테이블을 생성하게 된다.
abstract class Animal
{
public abstract void Sound();
}
class Dog : Animal
{
public override void Sound()
{
Console.WriteLine("멍멍");
}
}
class Cow : Animal
{
public override void Sound()
{
Console.WriteLine("음메");
}
}
class Cat : Animal
{
public override void Sound()
{
Console.WriteLine("야옹");
}
}
internal class Program
{
private static void Main(string[] args)
{
Animal A;
A = new Dog(); A.Sound();
A = new Cow(); A.Sound();
A = new Cat(); A.Sound();
}
}
위 예제에서 Animal 클래스는 추상클래스이다. 본체가 없어 구체적인 동작을 정의하지 않으며 호출할 수도 없다. 필요가 없어 보이지만 자식을 위해 시그니처만 정의해 놓을 때 사용한다. 자식이 재정의해야 호출할 수 있으며 virtual을 붙이지 않아도 항상 가상이다. 추상 클래스는 인스턴스를 생성할 수 없으며 abstract 지정자를 붙인다. 참고로 추상 메서드가 하나라도 선언되어 있는 클래스도 추상이어야 한다.
Reference
SoEn:소프트웨어 공학 연구소
soen.kr
https://learn.microsoft.com/ko-kr/dotnet/csharp/
C# 문서 - 시작, 자습서, 참조.
프로그래밍 C# 알아보기 - 초보 개발자, C#을 처음 사용하는 개발자, 숙련된 C# / .NET 개발자용
learn.microsoft.com
'개발 > C#' 카테고리의 다른 글
[C#] 자습서 10장 - 델리게이트 (0) | 2023.02.02 |
---|---|
[C#] 자습서 9장 - 인터페이스 (0) | 2023.01.27 |
[C#] 자습서 7장 - 상속(1) (0) | 2023.01.13 |
[C#] 자습서 6장 - 함수 (0) | 2023.01.11 |
[C#] 자습서 5장 - 클래스 (0) | 2023.01.10 |