* 정의
데이터 추상화는 특정 세부 내용을 감추고 필요한 부분을 유저에게 보여주는 과정이다. C#에서 추상화 방법이 크게 2가지가 있다.
- 인터페이스(interface)
- 추상 클래스(abstract class)
인터페이스는 암묵적으로 abstract이고 추상 클래스는 abstract 키워드를 사용하여 명시적으로 정의한다. 이러한 abstract 키워드는 불완전한 구현을 나타내며 클래스, 메소드, 프로퍼티, 인덱서, 이벤트에 사용될 수 있다.
* 사용 이유
- 추상 클래스는 인터턴스화 될 수 없다. 따라서 다른 클래스의 기본 클래스(base class)로만 사용하고 인스턴스화되지 않도록 하기 위해 추상 클래스를 사용한다.
- abstract 가 붙은 클래스 멤버는 해당 abstract 클래스를 상속받는 non-abstract 클래스에서 구현되어야 한다. 특정한 기능의 구현을 강제하고 기본적인 것들을 상속하여 사용하기 위해 추상 클래스가 사용될 수 있다.
// 추상 클래스를 상속받는 파생 추상 클래스에서 구현해도 인스턴스화 할 수 없기 때문에 의미가 없다.
* 동작 방식
- abstract class
클래스 선언 시 abstract 키워드를 붙여서 추상 클래스를 정의할 수 있다.
추상 클래스는 인스턴스 생성이 제한된 클래스이다. 추상 클래스를 상속 받는 파생 클래스를 통해서만 추상 클래스에 접근할 수 있다.
- abstract method, property, indexer, event
추상 클래스 내부에서만 abstract 키워드를 붙여서 여러 종류의 클래스 멤버를 선언할 수 있다.
추상 클래스 내부에서만 사용할 수 있는 메소드(method), 프로퍼티(property), 인덱서(indexer), 이벤트(event)이다. 구현부가 존재하지 않으며 구현부는 추상 클래스를 상속받은 파생 클래스에서 작성한다.
- 특징
- 추상 클래스는 인스턴스화될 수 없다.
- 추상 클래스는 특정 추상 메소드나 액세서(프로퍼티의 get, set)를 포함할 수 있다.
- 추상 클래스를 선언할 때 sealed 키워드를 같이 작성할 수 없다. abstract는 상속 받아서 사용해야한다는 의미이고 sealed 는 상속을 방지하는 의미를 지닌다. 서로 반대의 의미를 지니기 때문에 같이 사용할 수 없다.
- 추상 클래스를 상속 받은 non-abstract 클래스는 모든 추상 메소드와 액세서를 구현해야 한다.
- 추상 메소드는 암묵적으로 virtual 메소드이다. ildasm에서 보면 나타난다.
- static, virtual 과 abstract는 같이 사용할 수 없다. abstract는 virtual 키워드가 암묵적으로 붙기 때문에 virtual을 한번 더 쓸 필요 없고, static 멤버는 virtual이 될 수 없다. 메소드나 프로퍼티(프로퍼티도 get, set 메소드이다.)나 마찬가지이다.
- 파생 클래스에서는 override 키워드를 사용하여 구현부를 정의하면 된다.
- 메소드나 프로퍼티 선언에서 abstract를 사용하면 구현을 미포함한다는 것을 나타낸다.
- 추상 메소드는, 프로퍼티, 인덱서, 이벤트는 추상 클래스에서만 허용된다.
- 추상 메소드 선언은 실제 구현을 제공하지 않기 때문에 구현부가 없다. 메소드 정의는 세미콜론으로 끝난다.
* abstract class vs interface
https://create-new-worlds.tistory.com/348
[C#] abstract class vs interface
* abstract class vs interface abstract class interface 다중 상속 불가능하다. 가능하다. 필드(field) // 인스턴스와 관련있는 것들 포함할 수 있다. 일반적으로 포함할 수 없다. // C# 8.0부터 인스턴스와 관..
create-new-worlds.tistory.com
'C#' 카테고리의 다른 글
| [C#] Generic Collection 구현 해보기 (0) | 2022.07.01 |
|---|---|
| [C#] 인터페이스(interface) (0) | 2022.06.28 |
| [C#] abstract class vs interface (0) | 2022.06.28 |
| [C#] const, readonly (0) | 2022.06.28 |
| [C#] ref, out (0) | 2022.06.28 |