가상 메소드(Virtual Method)
- 메소드 다형성 지원
- virtual, override 키워드
- override와 virtual의 한쌍으로 사용
-> 가상메소드에 virtual를 적지 않아도 가상메소드가 상속만 되면 오버라이드 할수 있다. 하지만 경고발생
- 가상 메소드의 재정의는 필수가 아니다. -> 가상메소드는 파생클래스에서 반드시 오버라이드 하지 않아도 된다.
- static, private 키워드는 사용하지 않음.
-> static메소드는 클래스 메소드이고 다형성은 클래스가 아닌 객체레벨에서 접근하기 때문에 가상메소드 적용할수 없다.
-> private 메소드는객체내부에서만 사용, 파생클래스에 접근이 불가하기 때문에 오버라이드가 불가능함.
-> override와 static, private도 함께 사용 불가
- override된 메소드를 다시 oeverride가능(override는 virtual기능 포함)
-> public virtual override void Test() // 에러발생
- 오버라이드 메소드는 가상메소드와 동일한 문법(액세스 한정자, 리턴값, 메소드명, 인자리스트)을 가져야한다.
new 키워드
- 상속관계에서 부모클래스의 멤버를 숨긴다.
- 가상 메소드나 일반 메소드에 상관없이 new키워드 사용가능
- override와 new를 동시에 사용X
추상클래스 (Abstract Class)
- 미완성 클래스, 완전한 클래스가 아니기 때문에 객체(인스턴스)를 생성불가
- 클래스명 앞에 반드시 abstract 키워드를 명시
- 상속받은 객체들을 표준화
- 클래스 상속관계에서 가장 상위에 위치 -> 일반클래스나 추상클래스로 상속가능하나 권장하지 않음.
- 부분적인 구현은 가능.
- 추상 클래스에는 추상 멤버가 포함될 수 있지만, 필수 요건은 아님.
- 추상 클래스는 봉인될 수 없다.(sealed 사용할 수 없음)
추상클래스가 되는 경우
- 블록({})없는 메서드를 하나라도 포함하고 있는 클래스
- 블록({})없는 메서드를 포함하고 있지 않더라도 클래스 선언할 때 abstract 키워드를 포함하고 있을 경우
추상메소드(Abstract Method)
- 파생 클래스에서 반드시 구현해야 하는 메소드
- 메소드명 앞에 abstract 키워드 사용
- 메소드 본문(블록({}))을 가져서는 안된다.
- virtual과 동시에 사용할수 없다.(묵시적으로 가상메서드(Virtual Method)가 된다.)
- 추상클래스 안에서만 추상메소드 정의 가능
using System;
namespace AbstractClass
{
abstract class Printer
{
public abstract void Printing();
}
abstract class HPPrinter : Printer
{
public abstract void SelfTest();
//추상메소드는 본문이 있으면 안된다.
//반드시 파생클래스에서 구현되어야 한다.
}
class HP640: HPPrinter
{
public override void Printing()
{
Console.WriteLine("문서를 출력합니다");
}
public override void SelfTest()
{
Console.WriteLine("자가진단을 합니다");
}
}
class MainClass
{
[STAThread]
static void Main(string[] args)
{
HP640 hp = new HP640();
hp.Printing();
hp.SelfTest();
}
}
}
최종클래스(sealed Class)
- 더이상 상속하지 않는 클래스(파생불가)
- 프로그래밍 오류방지
- 성능상 이익
- 클래스명 앞에 sealed 키워드
using System;
namespace AbstractClass
{
sealed class Printer
{
public void Print(){}
}
class HP640: Printer //컴파일에러
{
}
class MainClass
{
public static void Main()
{
}
}
}