반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발꿈나무

[C# 교과서] 23. C# 활용(17) - 메서드 오버라이드 본문

C# 기초

[C# 교과서] 23. C# 활용(17) - 메서드 오버라이드

HYOKYE0NG 2022. 1. 20. 15:51
반응형
메서드 오버라이드

 

부모 클래스에 만든 메서드를 자식 클래스에서 다시 새롭게 만들어 사용하는 것을 메서드 오버라이드라고 한다.

 

메서드 오버라이드: 재정의

클래스 관계를 따지는 상속(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>

 

반응형
Comments