SSISO Community

갤러리정

추상클래스, sealed클래스 - CSharp

메소드 재정의
- 부모 클래스와 자식 클래스에 동일한 메소드가 존재할 경우 -> 컴파일러가 동일한 메소드가 중복되었다고 판단, 묵시적으로 부모 클래스의 메소드를 숨기고 자식 클래스의 메소드를 실행한다(주의 메시지만 출력....)
- 이와 같은 경우 재정의를 한다는 명시적으로 표기(부모 클래스 메소드 숨김) -> 가상 메소드 or New 제한자

 

가상 메소드(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()
        {         
        }
    }
}


872 view

4.0 stars