본문 바로가기
Programming Language/C#

[C#] 추상 클래스

by dbxxrud 2019. 9. 12.

 

추상 클래스 - 인터페이스와 달리 구현을 가질 수 있으나, 클래스와는 달리 인스턴스를 가질 수 없는 클래스.

 

 

선언

 

abstract 한정자와 class 키워드를 이용

 

추상 클래스는 클래스에 더 가깝다(접근성). 인터페이스에서는 모든 메서드가 public으로 선언되는 반면, 클래스는 한정자를 명시하지 않으면 모든 메서드가 private로 선언된다. 

추상 클래스는 인스턴스를 만들 수 없다는 점 외에도 클래스와 다른 점은 추상 메서드를 가질 수 있다는 것이다.

 

추상 메서드 - 추상 클래스가 인터페이스의 역할도 할 수 있게 해주는 장치.

 

구현을 갖지는 못하지만 파생 클래스에서 반드시 구현하도록 강제하기 때문이다. 다시 말해, 추상 클래스를 상속하는 클래스들이 반드시 이 메서드를 갖고 있을 거라는 "약속"인 것이다. 

 

 

추상 클래스의 접근성

 

추상 클래스나 클래스는 그 안에서 선언되는 모든 필드, 메서드, 프로퍼티, 이벤트 모두 접근 한정자를 명시하지 않으면 private이다.

하지만 "약속"역할을 하는 추상 메서드는 C# 컴파일러가 반드시 public, protected, internal, protected internal 한정자 중 하나로 수식될 것을 강요한다. 이렇게 하면 클래스의 접근성 원칙도, 인터페이스의 접근성 원칙도 지켜질 수 있다. 

 

 

선언

 

추상 메소드도 abstract 한정자 이용

 

 

추상 클래스가 또 다른 추상 클래스를 상속하는 경우
추상 클래스는 또 다른 추상 클래스를 상속할 수 있으며, 이 경우 자식 추상 클래스는 부모 추상 클래스의 추상 메소드를 구현하지 않아도 된다. 추상 메소드는 인스턴스를 생성할 클래스에서 구현하면 되기 때문이다.

 

 

 

예제

 

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
DevBearDevlog