본문 바로가기
개발 공식/C#

C# 언어 상속 오버라이딩 방법

by JinCoding 2023. 3. 18.
반응형

 

안녕하세요! 이번 포스팅에서는 C# 언어의 상속에 대해 알아보도록 하겠습니다.

상속은 객체 지향 프로그래밍에서 가장 중요한 개념 중 하나로, 코드의 재사용성과 유지보수성을 높여주는 역할을 합니다.

상속은 기존 클래스를 확장하여 새로운 클래스를 만드는 개념입니다.

기존 클래스는 부모 클래스, 확장하여 만든 새로운 클래스는 자식 클래스라고 부릅니다.

자식 클래스는 부모 클래스에서 정의된 필드, 메서드 등을 그대로 사용할 수 있으며, 자식 클래스에서 새로운 필드나 메서드를 추가할 수도 있습니다.

이번 포스팅에서는 상속의 개념과 상속을 활용한 예제를 통해 상속을 이해해보도록 하겠습니다.


상속의 개념

상속은 코드의 재사용성과 유지보수성을 높여주는 가장 대표적인 개념 중 하나입니다.

상속을 사용하면, 이미 정의된 클래스를 확장하여 새로운 클래스를 만들 수 있습니다.

이 때, 새로운 클래스는 부모 클래스의 모든 필드, 메서드를 그대로 상속받아 사용할 수 있습니다.

상속을 사용할 때, 부모 클래스의 필드와 메서드를 사용하면서 새로운 필드나 메서드를 추가할 수 있습니다.

이렇게 부모 클래스에서 상속받은 기능을 활용하여 새로운 기능을 추가함으로써 코드의 재사용성과 유지보수성을 높일 수 있습니다.

상속

다음은 상속을 사용하여 새로운 클래스를 만드는 예제입니다.

using System;

// 부모 클래스 정의
public class Calculator
{
    public int Add(int num1, int num2)
    {
        return num1 + num2;
    }
    
    public int Subtract(int num1, int num2)
    {
        return num1 - num2;
    }
}

// 자식 클래스 정의
public class AdvancedCalculator : Calculator
{
    public int Multiply(int num1, int num2)
    {
        return num1 * num2;
    }
    
    public int Divide(int num1, int num2)
    {
        return num1 / num2;
    }
}

// 메인 함수
public class Program
{
    public static void Main()
    {
        // Calculator 클래스 이용
        Calculator calc1 = new Calculator();
        int result1 = calc1.Add(3, 4);
        Console.WriteLine("3 + 4 = {0}", result1);
        
        // AdvancedCalculator 클래스 이용
        AdvancedCalculator calc2 = new AdvancedCalculator();
        int result2 = calc2.Add(3, 4);
        Console.WriteLine("3 + 4 = {0}", result2);
        
        int result3 = calc2.Multiply(3, 4);
        Console.WriteLine("3 * 4 = {0}", result3);
    }
}

 

위 예제에서 Calculator 클래스는 더하기와 빼기를 수행하는 메서드를 정의하고, AdvancedCalculator 클래스는 Calculator 클래스를 상속하여 곱하기와 나누기를 수행하는 메서드를 추가로 정의합니다.

Program 클래스에서는 Calculator 클래스의 객체와 AdvancedCalculator 클래스의 객체를 생성하고, 각 객체를 이용하여 더하기, 곱하기 등의 연산을 수행합니다.

위 예제를 실행하면 다음과 같은 결과가 출력됩니다.

3 + 4 = 7
3 + 4 = 7
3 * 4 = 12

 

이처럼 AdvancedCalculator 클래스는 Calculator 클래스를 상속받아 더하기와 빼기 메서드를 그대로 사용할 수 있으며, 추가로 곱하기와 나누기 메서드를 정의하여 사용할 수 있습니다.

이렇게 상속을 이용하면 코드의 재사용성을 높이고, 코드의 중복을 방지할 수 있습니다.

 

오버라이딩

자식 클래스에서 부모 클래스의 메서드를 재정의하여 사용하는 것을 오버라이딩(overriding)이라고 합니다.

이때, 자식 클래스에서 오버라이딩할 메서드의 시그니처(signature)가 부모 클래스의 메서드와 일치해야 합니다.

시그니처란 메서드의 이름, 매개변수의 개수와 타입, 반환값의 타입 등을 말합니다.

예를 들어, 다음과 같이 Calculator 클래스에 Add 메서드를 다시 정의하는 AdvancedCalculator 클래스를 만들어보겠습니다.

public class Calculator
{
    public int Add(int num1, int num2)
    {
        return num1 + num2;
    }
}

public class AdvancedCalculator : Calculator
{
    public new int Add(int num1, int num2)
    {
        return num1 + num2 + 100;
    }
}

 

AdvancedCalculator 클래스에서 Add 메서드를 다시 정의할 때, new 키워드를 사용하여 부모 클래스의 Add 메서드를 가리키는 것을 방지할 수 있습니다.

따라서, 위 예제에서 AdvancedCalculator 클래스의 Add 메서드는 부모 클래스의 Add 메서드와 시그니처가 다르므로 오버라이딩이 아닙니다.

반면, 부모 클래스의 메서드와 시그니처가 일치하면 자식 클래스에서 오버라이딩할 수 있습니다.

예를 들어, 다음과 같이 Calculator 클래스의 Add 메서드를 오버라이딩하는 AdvancedCalculator 클래스를 만들어보겠습니다.

public class Calculator
{
    public virtual int Add(int num1, int num2)
    {
        return num1 + num2;
    }
}

public class AdvancedCalculator : Calculator
{
    public override int Add(int num1, int num2)
    {
        return num1 + num2 + 100;
    }
}

 

Calculator 클래스에서 Add 메서드를 가상(virtual) 메서드로 정의하고, AdvancedCalculator 클래스에서 Add 메서드를 재정의(override)합니다.

이때, override 키워드를 사용하여 부모 클래스의 Add 메서드를 오버라이딩하는 것을 명시합니다.

이제 다음과 같이 Program 클래스에서 Calculator 클래스의 객체와 AdvancedCalculator 클래스의 객체를 생성하고, 각 객체를 이용하여 Add 메서드를 호출해보겠습니다.

public class Program
{
    public static void Main()
    {
        Calculator calc1 = new Calculator();
        Console.WriteLine(calc1.Add(3, 4));    // 3 + 4 = 7

        AdvancedCalculator calc2 = new AdvancedCalculator();
        Console.WriteLine(calc2.Add(3, 4));    // 3 + 4 + 100 = 107
    }
}

 

위 예제에서 calc1.Add(3, 4)의 결과는 7이고 calc2.Add(3, 4)의 결과는 107이 됩니다.

이제 Calculator 클래스를 확장한 ScientificCalculator 클래스를 만들어 보겠습니다.

ScientificCalculator 클래스는 Calculator 클래스를 상속하며, 새로운 기능인 제곱을 구하는 메서드를 추가할 것입니다.

public class ScientificCalculator : Calculator
{
    public int Square(int x)
    {
        return x * x;
    }
}

 

위 코드에서 ScientificCalculator는 Calculator 클래스를 상속합니다.

Square 메서드는 정수를 인자로 받아 해당 정수의 제곱을 반환합니다.

ScientificCalculator 클래스에서 새롭게 추가한 Square 메서드를 호출해 보겠습니다.

int result3 = calc3.Square(5);
Console.WriteLine(result3); // 25

 

위 코드에서 Square 메서드를 호출하여 5의 제곱인 25를 구하고, 결과를 출력합니다.

이처럼 C#의 상속 기능을 활용하면 이미 만들어진 클래스를 확장하거나 새로운 클래스를 만들 때 코드의 재사용성을 높일 수 있습니다.

반응형

댓글