추상 클래스 - 인터페이스와 달리 구현을 가질 수 있으나, 클래스와는 달리 인스턴스를 가질 수 없는 클래스.
선언
추상 클래스는 클래스에 더 가깝다(접근성). 인터페이스에서는 모든 메서드가 public으로 선언되는 반면, 클래스는 한정자를 명시하지 않으면 모든 메서드가 private로 선언된다.
추상 클래스는 인스턴스를 만들 수 없다는 점 외에도 클래스와 다른 점은 추상 메서드를 가질 수 있다는 것이다.
추상 메서드 - 추상 클래스가 인터페이스의 역할도 할 수 있게 해주는 장치.
구현을 갖지는 못하지만 파생 클래스에서 반드시 구현하도록 강제하기 때문이다. 다시 말해, 추상 클래스를 상속하는 클래스들이 반드시 이 메서드를 갖고 있을 거라는 "약속"인 것이다.
추상 클래스의 접근성
추상 클래스나 클래스는 그 안에서 선언되는 모든 필드, 메서드, 프로퍼티, 이벤트 모두 접근 한정자를 명시하지 않으면 private이다.
하지만 "약속"역할을 하는 추상 메서드는 C# 컴파일러가 반드시 public, protected, internal, protected internal 한정자 중 하나로 수식될 것을 강요한다. 이렇게 하면 클래스의 접근성 원칙도, 인터페이스의 접근성 원칙도 지켜질 수 있다.
선언
추상 클래스가 또 다른 추상 클래스를 상속하는 경우 | ||||||
추상 클래스는 또 다른 추상 클래스를 상속할 수 있으며, 이 경우 자식 추상 클래스는 부모 추상 클래스의 추상 메소드를 구현하지 않아도 된다. 추상 메소드는 인스턴스를 생성할 클래스에서 구현하면 되기 때문이다. |
예제
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
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using System.IO;
namespace Practice2
{
abstract class AbstractBase // 추상 클래스
{
protected void PrivateMethodA() // 구현부를 갖도록 구현함
{
WriteLine("AbstractBase.PrivateMethodA()");
}
public void PublicMethod()
{
WriteLine("AbstractBase.PublicMethodA()");
}
public abstract void AbstractMethodA(); // abstract 한정자를 사용해 인터페이스 처럼 구현부 없이 선언 가능
}
class Derived : AbstractBase
{
public override void AbstractMethodA() // 추상 클래스에서 선언한 AbstractMethodA() 반드시 구현
{
WriteLine("Derived.AbstractMethodA()");
PrivateMethodA();
}
}
class MainApp
{
static void Main(string[] args)
{
AbstractBase obj = new Derived(); // Derived의 생성자를 이용해 obj라는 인스턴스 생성
obj.AbstractMethodA();
obj.PublicMethod();
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
※ 혼자 공부하며 정리하는 블로그 입니다.
참고서적 : 이것이 C# 이다
문제가 있다면 지적 감사하겠습니다.
'Programming Language > C#' 카테고리의 다른 글
[C#] 무명 형식 (0) | 2019.10.02 |
---|---|
[C#] 프로퍼티 (0) | 2019.09.28 |
[C#] 분할 클래스 (0) | 2019.08.11 |
[C#] ToCharArray() (0) | 2019.05.23 |
[C#] 인터페이스 (Interface) (0) | 2019.05.18 |