* 정의

 

데이터 추상화는 특정 세부 내용을 감추고 필요한 부분을 유저에게 보여주는 과정이다. 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

+ Recent posts