abstract 키워드를 사용하면, 불완전하여 파생 클래스에서 구현해야 하는 클래스 및 클래스 멤버를 만들 수 있습니다.

sealed 키워드를 사용하면, 이전에 virtual로 표시되었던 클래스나 특정 클래스 멤버의 상속을 방지할 수 있습니다.


추상 클래스 및 클래스 멤버

클래스 정의 앞에 abstract 키워드를 배치하여 클래스를 추상으로 선언할 수 있습니다. 예:


public abstract class A { // Class members here. }


추상 클래스는 인스턴스화할 수 없습니다. 

추상 클래스의 목적은 여러 파생 클래스에서 공유할 수 있는 기본 클래스의 공통적인 정의를 제공하는 것입니다. 

예를 들어 클래스 라이브러리에서 여러 자체 함수에 매개 변수로 사용되는 추상 클래스를 정의한 다음 해당 라이브러리를 사용하는 프로그래머가 파생 클래스를 만들어 클래스의 고유 구현을 제공하도록 할 수 있습니다.

추상 클래스에서는 추상 메서드도 정의할 수 있습니다. 

메서드의 반환 형식 앞에 abstract 키워드를 추가하면 추상 메서드가 정의됩니다. 예:

public abstract class A { public abstract void DoWork(int i); }

추상 메서드에는 구현이 없으므로 메서드 정의 다음에는 일반적인 메서드 블록 대신 세미콜론이 옵니다. 

추상 클래스의 파생 클래스에서는 모든 추상 메서드를 구현해야 합니다. 

추상 클래스에서 기본 클래스의 가상 메서드를 상속하는 경우 추상 클래스에서는 추상 메서드를 사용하여 가상 메서드를 재정의할 수 있습니다. 예:

// compile with: -target:library public class D { public virtual void DoWork(int i) { // Original implementation. } } public abstract class E : D { public abstract override void DoWork(int i); } public class F : E { public override void DoWork(int i) { // New implementation. } }

virtual 메서드는 abstract로 선언되어도 추상 클래스에서 상속된 모든 클래스에 대해 여전히 가상입니다. 

추상 메서드를 상속하는 클래스에서는 메서드의 원본 구현에 액세스할 수 없습니다. 

앞의 예제에서 F 클래스의 DoWork에서는 D 클래스의 DoWork를 호출할 수 없습니다. 

따라서 추상 클래스는 파생 클래스에서 가상 메서드에 대한 새 메서드 구현을 반드시 제공하도록 제한할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
        base.DoWork(i); //error
    }
 
}
 

cs

이렇게 호출 할 경우 "base.DoWork(i); 상태 오류 CS0205 추상 기본 멤버를 호출할 수 없습니다."

 


다른 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
 //interface 는 구현이나 멤버변수를 넣지 못한다
//interface 에 함수를 추가할 수 있는데 정의와 접근제어자는 빠진 상태로 들어갈 수 있고
//정의는 상속 받는 클래스에서 재정의해야한다
public interface ISO
{
    void show();
    int ret(char s);
 
}
 
public abstract class A : ISO
{
     public A()
    {
 
    }
    public A(int a)
    {
    }
 
    public abstract void left();
    public abstract int ret(char s);
    public abstract void show();
 
    public void right()
    {
 
    }
 
    
}
public class B : A
{
    public B() : this(3)
    {
 
    }
 
    public B(int ss)
    {
        System.Console.WriteLine(ss);
    }
 
    public override void left()
    {
        base.right();
    }
 
    public override int ret(char s)
    {
        throw new System.NotImplementedException();
    }
 
    public override void show()
    {
        throw new System.NotImplementedException();
    }
}
 
 
class MainClass
{
    static void Main()
    {
        B ai = new B();
        ai.left();
    }
}
 
 
 
//결과 
//3
 
 

cs



봉인 클래스 및 클래스 멤버

클래스 정의 앞에 sealed 키워드를 배치하여 클래스를 sealed로 선언할 수 있습니다. 예:


public sealed class D { // Class members here. }




  • 봉인 클래스는 기본 클래스로 사용할 수 없습니다. 

  • 그러므로 추상 클래스가 될 수도 없습니다. 

  • 봉인 클래스는 상속할 수 없습니다.


 봉인 클래스는 기본 클래스로 사용될 수 없으므로 일부 런타임 최적화에서는 봉인 클래스 멤버 호출이 약간 더 빨라집니다.

기본 클래스의 가상 멤버를 재정의하는 파생 클래스의 메서드, 인덱서, 속성 또는
이벤트는 해당 멤버를 봉인으로 선언할 수 있습니다.


이렇게 하면 이후에 파생되는 클래스에서는 해당 멤버가 가상이 아니게 됩니다. 

클래스 멤버 선언에서 override 키워드 앞에 sealed키워드를 배치하면 됩니다. 예:


public class D : C { public sealed override void DoWork() { } }




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// compile with: -target:library
public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}
 
public abstract class E : D
{
    public sealed override void DoWork(int i)
    {
 
    }
}
 
public class F : E
{
 
    public /* new */  void DoWork(int i)
    {
 
    }
}
 
 
class MainClass
{
    static void Main()
    {
        D di = new D();
        F fi = new F();
        di.DoWork(3);
        fi.DoWork(3);
 
    }
}
 
 
/* 결과
경고    CS0114    'F.DoWork(int)'은(는) 상속된 'E.DoWork(int)' 멤버를 숨깁니다.
현재 멤버가 해당 구현을 재정의하도록 하려면 override 키워드를 추가하세요. 
그렇지 않으면 new 키워드를 추가하세요.
*/

cs




ref : https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members


+ Recent posts