minlog

오버라이딩

2023.11.08·조회수:
0
thumbnail
 

오버라이딩

상속 받은 것을 그대로 안 쓰고 고쳐서 쓴다 (재정의) 즉, 아빠가 입던 옷을 물려받은 뒤, 그걸 수선집에서 고쳐서 입는 셈

using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class 아버지
{
    public void 아빠옷()
    {
        // 300개의 함수들
        Console.WriteLine("아빠가 입다 버린 구닥다리 옷");
    }
}

class 아들 : 아버지 // 아버지로부터 상속을 받음
{
    // 아들이 물려받은 뒤 고쳐 쓴 함수들
    new public void 아빠옷() // 오버라이딩 (구별하기 위해 new 키워드를 쓰자)
    {
        Console.WriteLine("자식이 아빠 옷을 수선했다");
    }

    // 아들 함수들
    public void 내옷()
    {
        Console.WriteLine("자식 전용 옷");
    }
}

class 메인
{
    public static void Main(string[] args)
    {
        아들 son = new 아들();
        son.아빠옷();
        son.내옷();
    }
}

base

자식 클래스에서 부모 클래스를 가리키는 키워드

앞에서 오버라이딩이란 개념을 살펴봤었다. 오버라이딩이란, 자식이 부모로부터 아빠옷을 상속받은 뒤 그것을 자신의 몸에 맞게 수선하는 것이다. 그런데 수선하기 이전의 오리지날 아빠옷을 다시 입어야 하는 경우라면 어떻게 해야 할까?

[base 사용 예시]

base를 사용해서 다시 구닥다리 아빠옷을 입는 아들

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class 아버지
{
    public void 아빠옷()
    {
        Console.WriteLine("아빠의 냄새나는 옛날 옷");
    }
}

class 아들 : 아버지
{
    new public void 아빠옷()
    {
        Console.WriteLine("아들이 고쳐 씀");
    }

    public void 돈없는_아들()
    {
        base.아빠옷(); // 아빠 클래스에 있는 함수가 호출 됨
        아빠옷(); // 아들 클레스에 있는 오버라이딩 된 함수가 호출 됨
    }
}

class 메인
{
    public static void Main(string[] args)
    {
        아들 son = new 아들();
        son.돈없는_아들();
    }
}

또한 부모클래스의 생성자 함수가 매개변수를 받아야 하는 상황일 경우

상속받는 자식클래스는 반드시 부모클래스매개변수에 값을 전달해줘야 한다.

자식 클래스가 호출되면 부모 클래스도 덩달아 같이 호출이 되는데 부모 클래스의 생성자의 매개변수에 값을 전달하지 않는다면 에러가 발생한다. 이때 base를 통해 부모 클래스의 생성자에 값을 전달할 수 있다.

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class 아버지
{
    //생성자 함수 (아빠라는 형태의 객체가 메모리에 할당되면 가장 먼저 호출되는 함수)
    public 아버지(String father)
    {
        Console.WriteLine("1. 아빠 생성자 생성 : {0}", father);
    }
}

class 아들 : 아버지
{
    public 아들(String son) : base(son)
    {
        Console.WriteLine("2. 아들 생성자 생성: {0}", son);
    }
}

class 메인
{
    public static void Main(string[] args)
    {
        아들 son = new 아들("아들에게 준 값");
    }
}