본문 바로가기

TIL

[ 24.04.23 ] 내일배움캠프 7일차 TIL - 오버라이딩

[ ps ]

 

 

[ 백준 / C++ ] 1915 : 가장 큰 정사각형

[ 문제 ] 1915번: 가장 큰 정사각형 첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다. www.acmicpc.net [ 접근방법 ] 현재 위치를 7시 방향 꼭짓점으로 하여

snowdolf99.tistory.com

 

[ 내일배움캠프 / Unity ]

 

어제는 오버로딩에 대해 적었는데 오늘은 오버라이딩에 대해 적으면 좋을 것 같다.

 

오버라이딩은 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의 하는 것을 말한다.

오버로딩과는 다르게 매개변수가 다르면 안되며 메서드 이름 및 반환타입이 같은 것은 동일하다.

 

구현할 때 특이한 점은 부모 클래스에는 virtual 이라는 키워드를 사용함으로써 가상 메서드로 만들어주고

(abstract 라는 키워드를 사용하면 추상 메서드가 만들어지고, 자식 클래스에서 무조건 재정의 해야함),

자식 클래스에는 override 라는 키워드를 사용함으로써 재정의한 메서드임을 명시해줘야 한다.

 

이를 활용하면 참조형태와 실형태가 다를 때 재정의한 메서드를 사용하게 할 수 있다.

 

아래 예시를 보면 참조형태가 Unit 이고 실형태가 Zergling 인 상황에서 Move 메서드를 호출하고 있다.

Unit 클래스의 Move 메서드는 virtual 키워드를 통해 메서드 재정의 가능성을 알려주고 있고,

실제로 Zergling 클래스에서는 override 키워드를 통해 재정의한 메서드임을 명시하고 있다.

 

결론적으로 "네발로 걷기" 가 출력된다.

 

namespace ConsoleApp1
{
    internal class Program
    {
        public class Unit
        {
            public virtual void Move()  // 자식이 재정의를 했을 수 있다
            {
                Console.WriteLine("두발로 걷기");
            }
            // virtual = 실형태가 다를 수 있으니 실형태에 재정의가 되어있는지 확인해봐라

            public void Attack()
            {
                Console.WriteLine("Unit 공격");
            }
        }

        public class Zergling : Unit
        {
            public override void Move()
            {
                Console.WriteLine("네발로 걷기");
            }
            // override = 나 실형태인데 재정의했다
        }

        static void Main(string[] args)
        {
            // Unit 참조형태, Zergling 실형태
            // 참조형태와 실형태가 다른 경우
            List<Unit> list = new List<Unit>();
            list.Add(new Zergling());

            foreach (Unit unit in list)
            {
                unit.Move();
            }
        }
    }
}