상속(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