C#의 인터페이스와 추상 클래스의 차이는 무엇인가요?
_____- 인터페이스 는 메서드, 속성, 이벤트, 인덱서의 시그니처만 정의하며, 구현 내용은 가지지 않습니다. 즉, 해당 멤버들이 어떤 행위를 해야 하는지 명세만 제공합니다.
- 추상 클래스 는 클래스와 유사하지만 인스턴스를 만들 수 없고, 일부 구현된 멤버(메서드, 속성 등)를 포함할 수 있으며, 일부는 추상 멤버로 구현을 강제할 수 있습니다.
---
Q2: 주요 용도의 차이는 무엇인가요?
- 인터페이스는 서로 관련 없는 클래스들이 동일한 행위를 하도록 강제해, 다중 상속과 비슷한 다형성을 제공합니다.
- 추상 클래스는 공통 기능과 기본 구현을 공유하되, 구체적인 세부 구현은 파생 클래스가 하도록 할 때 사용합니다.
---
Q3: 다중 상속 지원 여부는 어떻게 되나요?
- 인터페이스는 여러 개를 동시에 상속(구현)할 수 있습니다.
- 추상 클래스는 하나만 상속할 수 있습니다 (단일 상속).
---
Q4: 멤버 구현 여부에 차이가 있나요?
- 인터페이스 멤버는 구현을 포함하지 않고, 모두 추상 상태입니다 (단, C 8.0 이후로는 디폴트 구현도 가능).
- 추상 클래스는 추상 멤버와 일반 멤버(이미 구현된 메서드 등)를 가질 수 있습니다.
---
Q5: 접근 제한자 사용에 차이가 있나요?
- 인터페이스의 멤버는 기본적으로 public이며, 접근 제한자를 지정할 수 없습니다 (C 8.0 기준으로는 인터페이스 내 멤버에 접근 제한자 사용 가능).
- 추상 클래스는 public, protected, private 등 다양한 접근 제한자를 사용할 수 있습니다.
---
Q6: 생성자, 필드, 상태(State) 보유가 가능한가요?
- 인터페이스는 필드나 생성자를 가질 수 없습니다.
- 추상 클래스는 필드, 생성자, 상태 정보를 포함할 수 있습니다.
---
Q7: 언제 인터페이스를 사용하면 좋나요?
- 서로 관련 없는 클래스들이 공통의 역할을 수행해야 할 때 (예: IComparable, IDisposable).
- 다중 상속이 필요하거나, 다양한 클래스에 기능을 강제하고 싶을 때.
---
Q8: 언제 추상 클래스를 사용하면 좋나요?
- 공통 기능과 상태를 공유하면서 일부 메서드 구현을 강제하고 싶을 때.
- 기본 구현을 제공하고, 파생 클래스가 이를 확장하거나 구현하도록 할 때.
---
Q9: 성능 차이가 있나요?
- 일반적인 상황에서는 거의 차이가 없습니다. 다만, 내부적으로 약간의 호출 오버헤드 차이가 있을 수 있으나 무시해도 됩니다.
---
Q10: C 에서 둘을 혼용할 수 있나요?
- 네, 인터페이스와 추상 클래스는 함께 사용 가능하며, 추상 클래스가 인터페이스를 구현할 수도 있습니다.
---
요약
| 구분 | 인터페이스 | 추상 클래스 |
|----------------|------------------------------|----------------------------|
| 구현 가능 여부 | 기본적으로 구현 없음 (C 8 이후 디폴트 구현 가능) | 일부 구현 가능 |
| 다중 상속 여부 | 다중 구현 가능 | 단일 상속 |
| 멤버 접근 제한자| 기본 public (C 8 이후 가능) | 다양한 접근 제한자 가능 |
| 상태(필드) 보유 | 불가능 | 가능 |
| 생성자 | 불가능 | 가능 |
| 용도 | 역할(계약) 정의, 다중 상속 | 공통 기능 공유, 기본 구현 제공 |
그러나 이 두 가지는 여러 면에서 다릅니다.
아래에서 그 차이점을 자세히 설명하겠습니다.
1. 정의와 목적 - 인터페이스 : 인터페이스는 클래스가 구현해야 하는 메서드, 속성, 이벤트 등을 정의하는 계약(Contract)입니다.
인터페이스는 구현을 포함하지 않으며, 오직 메서드의 시그니처만을 정의합니다.
여러 클래스가 동일한 인터페이스를 구현함으로써, 서로 다른 클래스 간의 일관성을 유지할 수 있습니다.
- 추상 클래스 : 추상 클래스는 일부 구현을 포함할 수 있는 클래스입니다.
즉, 추상 클래스는 추상 메서드(구현이 없는 메서드)와 일반 메서드(구현이 있는 메서드)를 모두 가질 수 있습니다.
추상 클래스는 상속을 통해 공통적인 기능을 공유하고, 자식 클래스에서 추가적인 기능을 구현하도록 강제하는 데 사용됩니다.
2. 상속 - 인터페이스 : C 에서는 클래스가 여러 개의 인터페이스를 구현할 수 있습니다.
이는 다중 상속을 지원하는 방식으로, 다양한 기능을 조합하여 사용할 수 있게 합니다.
인터페이스는 `:` 기호를 사용하여 구현합니다.
```csharp public interface IAnimal { void Speak(); } public class Dog : IAnimal { public void Speak() { Console.WriteLine("Bark"); } } ``` - 추상 클래스 : C 에서는 클래스가 단 하나의 추상 클래스만 상속받을 수 있습니다.
이는 단일 상속을 지원하는 방식으로, 클래스 간의 계층 구조를 명확하게 유지합니다.
추상 클래스는 `abstract` 키워드를 사용하여 정의합니다.
```csharp public abstract class Animal { public abstract void Speak(); } public class Dog : Animal { public override void Speak() { Console.WriteLine("Bark"); } } ```
3. 구현 - 인터페이스 : 인터페이스는 메서드의 구현을 포함하지 않으며, 모든 메서드는 기본적으로 `public`입니다.
C
8.0부터는 인터페이스에 기본 구현을 제공할 수 있는 기능이 추가되었지만, 여전히 인터페이스의 주 목적은 계약을 정의하는 것입니다.
- 추상 클래스 : 추상 클래스는 추상 메서드와 일반 메서드를 모두 가질 수 있습니다.
추상 메서드는 자식 클래스에서 반드시 구현해야 하며, 일반 메서드는 기본 구현을 제공할 수 있습니다.
추상 클래스의 접근 제한자는 `public`, `protected`, `internal` 등 다양하게 설정할 수 있습니다.
4. 필드와 속성 - 인터페이스 : 인터페이스는 필드를 가질 수 없으며, 속성만 정의할 수 있습니다.
속성은 기본적으로 `get`과 `set` 접근자를 가지며, 구현은 인터페이스를 구현하는 클래스에서 제공해야 합니다.
- 추상 클래스 : 추상 클래스는 필드를 가질 수 있으며, 속성도 정의할 수 있습니다.
필드는 상태를 유지하는 데 사용되며, 자식 클래스에서 상속받아 사용할 수 있습니다.
5. 사용 시나리오 - 인터페이스 : 인터페이스는 서로 다른 클래스가 동일한 기능을 제공해야 할 때 유용합니다.
예를 들어, 다양한 종류의 동물 클래스가 `IAnimal` 인터페이스를 구현하여 `Speak` 메서드를 제공할 수 있습니다.
또한, 인터페이스는 클래스 간의 느슨한 결합을 유지할 수 있도록 도와줍니다.
- 추상 클래스 : 추상 클래스는 공통적인 기능을 공유해야 할 때 유용합니다.
예를 들어, 여러 종류의 동물 클래스가 공통적으로 `Eat` 메서드를 가질 경우, `Animal`이라는 추상 클래스를 만들고, 그 안에 `Eat` 메서드를 구현할 수 있습니다.
이렇게 하면 코드의 중복을 줄이고, 유지보수를 용이하게 할 수 있습니다.
결론 C 에서 인터페이스와 추상 클래스는 각각의 목적과 사용 방식이 다릅니다.
인터페이스는 계약을 정의하고, 다중 상속을 지원하여 다양한 기능을 조합할 수 있게 해줍니다.
반면, 추상 클래스는 공통적인 기능을 공유하고, 일부 구현을 제공하여 코드 재사용성을 높입니다.
개발자는 상황에 맞게 이 두 가지를 적절히 활용하여 객체 지향 프로그래밍의 이점을 극대화할 수 있습니다.
작성자:
최지안 [비회원]
| 작성일자: 1년 전
2024-09-09 08:38:53
조회수: 304 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 304 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.