'C# 오버로딩'에 해당되는 글 2건

728x90

상속(Inheritance) : 부모 클래스에 정의된 데이터 및 메소드들을 파생클래스에서 이용할  수 있는 기능을  상속이라고 한다.

C#에서 파생클래스를 정의하기 위해서는 클래스명 뒤에 Colon (:)을 찍고 Base 클래스명을 써 주면 된다. 제약점은 C#에서는 파생클래스가 단 하나의 Base 클래스로부터 상속되어져야 한다는 것이다. 즉, 하나의 파생클래스는 2개 이상의 Base 클래스를 가질 수 없다.


오버로딩(Overloading)은 한 클래스 내에서 동일한 이름의 메서드를 추가 정의하는 것이다.

반면에 오버라이딩(Overriding)은 클래스간 상속 관계에서 메서드를 재 정의하는 기법이다.


두 클래스가 상속 관계에 있으면 부모 클래스의 public, protected 으로 선언된 메서드는 자식 클래스로 그대로 상속되어 자식클래스에서 사용이 가능하게 된다. 즉 이미 정의된 메서드를 재 사용하게 되는 것이다.

메서드를 오버라이딩 할 때 부모 클래스에서는 virtual 로, 자식 클래스에서는 override 키워드로 메서드를 정의해야 한다.


방법 1 : 부모 클래스에 virtual, 자식 클래스에 override 키워드를 사용하는 경우

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Override
{
    class BaseClass // 부모 클래스
    {
        public virtual void MethodA() // 부모클래스의 MethodA 메소드
        {
            Console.WriteLine("In the BaseClass ...");
            // 부모클래스로 객체를 생성하고 MethodA 메소드를 호출하면 이 문구가 출력
        }
    }
    class DerivedClass : BaseClass // DerivedClass (자식) 클래스는 BaseClass(부모클래스)를 상속받는다
    {
        public override void MethodA()
        {
            // 부모클래스와 동일 메소드(매개변수 똑같음)를 자식 클래스에서 생성하는것을 오버라이딩이라고 한다.
            Console.WriteLine("In DerivedClass ... Overriding !!!");
            // DerivedClass클래스로 객체를 생성하고 MethodA를 호출하면 이 문구가 출력된다
        }
        public void MethodA(int i) // 이경우는 메소드 이름은 같은데 매개변수가 다르다. int형 변수가 입력될 경우 이 메소드가 실행된다.
        {
            // Overloading : 메소드 이름은 동일하고 매개변수가 다른경우를 오버로딩이라고 한다.
            Console.WriteLine("In DerivedClass ... Overloading !!!");
            // Derivedclass클래스로 객체를 생성하고 MethodA메소드에 매개변수(int형)을 포함해 호출하면 이 문구가 출력된다.
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            BaseClass parent = new BaseClass(); // Baseclass(부모) 클래스로 새 객체를 생성한다.
            DerivedClass child = new DerivedClass(); // DerivedClass(자식) 클래스로 새 객체를 생성한다.
            parent.MethodA(); // 부모 객체에서 MethodA 메소드 호출 -> In the BaseClass ... 출력
            child.MethodA(); // 자식 객체에서 MethodA 메소드 호출 -> In DerivedClass ... Overriding !!! 출력
            child.MethodA(1); // 자식 객체에서 MethodA(1) 메소드 호출 -> In DerivedClass ... Overloading!!! 출력
        }
    }
}



방법 2 : 부모 클래스에 virtual 를 미정의 시, 자식 클래스에서 메소드 앞에 new를 붙이면 된다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Override
{
    class BaseClass // 부모 클래스
    {
        public void MethodA() // 부모클래스의 MethodA 메소드
        {
            Console.WriteLine("In the BaseClass ...");
            // 부모클래스로 객체를 생성하고 MethodA 메소드를 호출하면 이 문구가 출력
        }
    }
    class DerivedClass : BaseClass // DerivedClass (자식)클래스는 BaseClass(부모클래스)를 상속받는다
    {
        new public void MethodA()
        {
            // 부모클래스의 MethodA 와 이름이 똑같은데 new 를 붙이면 부모클래스의 메소드를 덮어씌운다.

            // new 를 통해 메서드를 재 정의하게 되면 부모 클래스의 원 메서드는 숨기게(가려지게) 된다.

            // 부모클래스와 동일 메소드(매개변수 똑같음)를 자식 클래스에서 생성하는것을 오버라이딩
            Console.WriteLine("In DerivedClass ... Overriding !!!");
            // DerivedClass클래스로 객체를 생성하고 MethodA를 호출하면 이 문구가 출력된다
        }
        public void MethodA(int i) // 이경우는 메소드 이름은 같은데 매개변수가 다르다. int형 변수가 입력될 경우 이 메소드가 실행된다.
        {
            // Overloading : 메소드 이름은 동일하고 매개변수가 다른경우를 오버로딩이라고 한다.
            Console.WriteLine("In DerivedClass ... Overloading !!!");
            // Derivedclass클래스로 객체를 생성하고 MethodA메소드에 매개변수(int형)을 포함해 호출하면 이 문구가 출력된다.
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            BaseClass parent = new BaseClass(); // Baseclass(부모) 클래스로 새 객체를 생성한다.
            DerivedClass child = new DerivedClass(); // DerivedClass(자식) 클래스로 새 객체를 생성한다.
            parent.MethodA(); // 부모 객체에서 MethodA 메소드 호출 -> In the BaseClass ... 출력
            child.MethodA(); // 자식 객체에서 MethodA 메소드 호출 -> In DerivedClass ... Overriding !!! 출력
            child.MethodA(1); // 자식 객체에서 MethodA(1) 메소드 호출 -> In DerivedClass ... Overloading!!! 출력
        }
    }
}
 


실행결과


자식 클래스의 메소드 앞에 new를 붙이지 않았을 경우


오류목록에 숨기려면 new 를 붙이라고 에러 메시지를 보여준다.


예제로 사용한 코드


Override.zip



참고하면 좋은 글

ㅇ 클래스의 상속 : https://blog.hexabrain.net/142


728x90

'C# > 문법 및 기능' 카테고리의 다른 글

C# 파일 입출력 개념 정리  (0) 2016.01.05
C# int.TryParse  (0) 2015.12.25
C# 메소드 오버로딩 개념잡기  (0) 2015.12.21
C# List 개념 이해 -1  (0) 2015.12.14
C# 배열 개념 이해 및 실전 응용  (0) 2015.12.13
블로그 이미지

Link2Me

,
728x90

C# 에서 함수(메소드)는 동일한 것을 여러개 만들 수가 있다는 걸 알게 되었다.

유투브 동영상 강좌를 보고, 구글링으로 얻은 지식 중에서 핵심내용만 적어두려고 한다.


오버로딩(OverLoading) : 한 클래스 내에서 동일한 이름의 메서드(함수)를 추가 정의



하나의 클래스에 같은 이름을 가진 메소드(함수)를 여러개 정의 할 수 있다.

메소드 이름은 동일하지만 시그너처의 갯수는 다르게 할 수 있다.

시그너처를 유일하게 하면 메서드의 이름은 얼마든지 같을 수 있다



public class MathClass
{
    public static int Max(int i, int j)
    {
        return i > j ? i : j;     //둘 중 큰수를 반환한다
    }
    public static int Max(int i, int j, int k)
    {
        return Max(Max(i, j), k); //Max(int, int) 를 호출한다
    }
    public static int Max(int i, int j, int k, int l)
    {
        return Max(Max(i, j, k), l); //Max(int, int, int) 를 호출한다
    }
    public static int Max(int[] arrays)
    {
        int maxValue = 0;
        foreach (int i in arrays)
        {
            maxValue = Max(maxValue, i); //Max(int,int) 를 호출한다
        }
        return maxValue;
    }
}




시그너처가 다르면 에러가 발생하지 않는다.


메소드 앞의 타입(string, int, double) 은 달라도 시그너처가 같으면 에러가 발생한다.




728x90

'C# > 문법 및 기능' 카테고리의 다른 글

C# int.TryParse  (0) 2015.12.25
C# 오버라이딩(Overriding) 개념 이해  (1) 2015.12.21
C# List 개념 이해 -1  (0) 2015.12.14
C# 배열 개념 이해 및 실전 응용  (0) 2015.12.13
C# Trackbar 기능 및 타이머 연결  (0) 2015.12.08
블로그 이미지

Link2Me

,