2022. 3. 23. 15:08ㆍLanguages/C#
추상 클래스 (Absract Class)
구현부를 가질 수 있지만, 인스턴스는 생성할 수 없다.
추상 클래스는 구현부를 가질 수 있다. 구현부를 가질 수는 있지만, 클래스와 달리 인스턴스 생성은 할 수 없다.
하지만 추상 클래스를 상속 받은 클래스의 인스턴스는 생성 가능하며, 업캐스팅 또한 가능하다.
추상 클래스 선언은 다음과 같이 absract 키워드를 사용하여 선언한다.
abstract class 클래스이름
{
// 클래스와 동일하게 구현
}
접근성 측면에서 본다면, 클래스와 더 가깝다.
인터페이스는 모든 메소드가 public으로 선언되는 반면, 클래스는 한정자를 명시하지 않으면 모든 메소드가 private으로 선언된다.
추상 메소드(Abstract Method)를 가질 수 있다.
abstract class AbstractClass
{
public abstract void AbstractMethod(); // 추상 메소드
}
class DerivedClass : AbstractClass
{
public override void AbstractMethod() // 추상 메소드 구현 강제
{
...
}
}
추상 메소드는 추상 클래스가 인터페이스의 역할을 할 수 있게 해주는 장치이다.
구현을 갖지는 못하지만, 자식 클래스에서 반드시 구현하도록 강제한다.
자식 클래스들은 반드시 이 추상 메소드들을 가지고 구현해놨을 거라는 일종의 약속인 셈이다.
추상 메소드의 기본 접근성은 무엇일까?
abstract class AbstractClass
{
abstract void AbstractMethod(); // public? private?
추상 클래스나 클래스는 그 안에서 선언되는 모든 필드, 메소드, 프로퍼티, 이벤트 모두 접근 한정자를 명시하지 않으면 private으로 간주한다. 여기에 추상 메소드 또한 예외가 될 수는 없다.
하지만 약속 역할을 하는 추상 메소드가 private이라는 것이 말이 안 된다.
그래서 C# 컴파일러는 추상 메소드가 반드시 public, protected, internal, protected internal 한정자 중 하나로 수식될 것을 강요한다.
추상 클래스가 또 다른 추상 클래스를 상속하는 경우
추상 클래스는 또 다른 추상 클래스를 상속할 수 있으며, 이 경우 자식 추상 클래스는 부모 추상 클래스의 추상 메소드를 구현하지 않아도 된다. 추상 메소드는 인스턴스를 생성할 클래스에서 구현하면 되기 때문이다.
"그래서, 추상 클래스는 왜 사용하는건데?"
추상 클래스를 사용하지 않으면 어떤 일이 발생할까? 만약 팀끼리 일을 하는데, 다음과 같은 말을 들었다고 생각 해보자.
"이 클래스는 직접 인스턴스화하지 말고 자식 클래스를 만들어 사용하세요.
Method1()과 Method2()는 꼭 오버라이딩 해야 합니다."
프로그래머도 사람이기 때문에 아무리 이런 좋은 메뉴얼이 있다고 하더라도, 일이 많다보면 까먹을 수도 있다.
추상 클래스를 사용하면 이런 문제가 발생할 일이 없어진다.
컴파일러가 오버라이딩을 강제하도록 요구하고, 안 하면 컴파일 오류를 발생시키기 때문이다.
이것이 추상 클래스를 사용하는 이유다.
- 이 글은 <이것이 C#이다> 책을 바탕으로 공부한 글입니다.
'Languages > C#' 카테고리의 다른 글
[C#] 객체를 배열처럼 인덱싱하자! : 인덱서(Indexer) (0) | 2022.03.25 |
---|---|
[C#] 레코드(Record) 형식으로 만드는 불변(Immutable) 객체 (1) | 2022.03.23 |
[C#] 객체지향의 꽃, 인터페이스(Interface) - 2편 (0) | 2022.03.22 |
[C#] 객체지향의 꽃, 인터페이스(Interface) - 1편 (2) | 2022.03.22 |
[C#] 여러 필드를 담을 수 있는 구조체, 튜플(Tuple) (0) | 2022.03.21 |