개발꿈나무
[C# 교과서] 23. C# 활용(17) - 메서드 오버라이드 본문
반응형
메서드 오버라이드
부모 클래스에 만든 메서드를 자식 클래스에서 다시 새롭게 만들어 사용하는 것을 메서드 오버라이드라고 한다.
메서드 오버라이드: 재정의
클래스 관계를 따지는 상속(inheritance) 개념에서 부모 클래스에 이미 만든 메서드를 동일한 이름으로 자식 클래스에서 다시 정의(재정의)해서 사용한다는 개념이 메서드 오버라이드이다.
- 메서드 오버라이드는 메서드를 새롭게 정의하는 것이다.
- 오버라이드(override), 오버라이딩(overriding)이라는 표현은 동일하다.
- 부모 클래스에 virtual 키워드로 선언해 놓은 메서드는 자식 클래스에서 override 키워드로 재정의해서 사용 가능하다.
상속 관계에서 메서드 오버라이드
using System;
namespace InheritanceMethodOverride
{
public class Parent
{
public void Say() => Console.WriteLine("부모_안녕하세요.");
public void Run() => Console.WriteLine("부모_달리다.");
public virtual void Walk() => Console.WriteLine("부모_걷다.");
}
public class Child : Parent
{
//public void Say() => Console.WriteLine("자식_안녕하세요.");
public new void Say() => Console.WriteLine("자식_안녕하세요.");
public new void Run() => Console.WriteLine("자식_달리다.");
public override void Walk() => Console.WriteLine("자식_걷다.");
}
class InheritanceMethodOverride
{
static void Main()
{
// 메서드 오버라이드(override): 함수 재정의
Child c = new Child();
c.Say(); //[1] 재사용
c.Run(); //[2] x -> new
c.Walk(); //[3] virtual -> override
}
}
}
[1] 부모 클래스의 Say() 메서드를 어떤 표시도 하지 않고 재정의한다. 실행헤는 문제가 없지만 IDE의 코드 편집기에는 new 키워드를 붙여 사용하라는 경고 메시지가 표시된다.
[2] new 키워드로 명확하게 자식 클래스에서 부모 클래스를 재정의하겠다고 표시한다.
[3] virtual 키워드는 부모 클래스에서 재정의 해도 된다는 의미이고, override는 자식 클래스가 부모 클래스의 메서드를 재정의하겠다는 의미이다. 이것이 override 하는 가장 좋은 형태의 코드이다.
메서드 오버로드와 오버라이드
처음 프로그래밍할 때 쉽게 혼동되는 단어가 바로 오버로드(overload)와 오버라이드(override)이다.
- 오버로드(overload): 이름은 동일하지만 매개변수가 다른 함수를 여러 번 정의
- 오버라이드(override): 부모 클래스의 멤버를 재정의
메서드 오버라이드 봉인
메서드에도 sealed 키워드를 붙어 더 이상 오버라이드하지 못하도록 설정할 수 있다.
using System;
namespace VirtualOverrideBase
{
class Parent
{
public virtual void Work() => Console.WriteLine("프로그래머");
}
class Child : Parent
{
// sealed 키워드를 사용하여 멤버를 봉인(재정의 금지) 및 base 키워드로 부모 멤버 접근
public override sealed void Work() => base.Work();
}
class GrandChild : Child
{
// public override void Work() => Console.WriteLine("프로게이머");
public void Play() => Console.WriteLine("프로게이머");
}
class VirtualOverrideBase
{
static void Main()
{
(new Parent()).Work(); // 프로그래머
(new Child()).Work(); // 프로그래머
(new GrandChild()).Work(); // 프로그래머
(new GrandChild()).Play(); // 프로게이머
}
}
}
ToString() 메서드 오버라이드
ToString() 메서드의 특징
- Object 클래스에 정의된 ToString() 메서드는 기본적으로 클래스의 이름 값을 반환한다.
- 정수형처럼 대표되는 값이 들어 있을 때는 그 값을 문자열로 변환해서 출력한다.
- 자신이 만든 클래스의 대표되는 속성 또는 값을 외부에 인스턴스 이름으로 출력할 때는 ToString() 메서드를 재정의해서 사용해야 한다.
using System;
namespace ClassToString
{
class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
// ToString() 메서드 오버라이드(재정의)
public override string ToString() => $"[Person 클래스: {this.name}]";
}
class ClassToString
{
static void Main()
{
Person person = new Person("박용준");
Console.WriteLine(person); // 개체를 문자열로 출력하면 ToString() 호출됨
}
}
}
//[Person 클래스 : 박용준]
클래스의 인스턴스를 문자열로 요청하면 ToString() 메서드가 실행된다.
<Reference>
반응형
'C# 기초' 카테고리의 다른 글
[C# 교과서] 25. C# 활용(19) - 특성과 리플렉션 (0) | 2022.01.25 |
---|---|
[C# 교과서] 24. C# 활용(18) - 인터페이스 (0) | 2022.01.21 |
[C# 교과서] 22. C# 활용(16) - 상속으로 클래스 확장하기 (0) | 2022.01.20 |
[C# 교과서] 21. C# 활용(15) - 대리자(delegate), 이벤트(Event) (0) | 2022.01.20 |
[C# 교과서] 20. C# 활용(14) - 인덱서와 반복기 (0) | 2022.01.20 |
Comments