추상 클래스 ( Abstract Class )
여러 클래스가 비슷한 구조를 가질 때, 그 공통된 틀과 동작을 정의.
구체적인 구현은 각각의 클래스에 맡기고 싶을 때 추상 클래스를 사용한다.
추상 클래스는 완전한 구현을 갖지 않고, 파생 클래스가 반드시 재정의해야 하는 멤버 ( 추상 메서드 )를 포함할 수 있는 클래스이다.
단독으로 객체를 생성할 수 없으며, 상속 전용 목적으로 사용된다.
문법
▼추상 클래스 선언
abstract class Animal
{
public abstract void MakeSound(); // 추상 메서드
public void Sleep() // 일반 메서드도 가능
{
Console.WriteLine("Zzz...");
}
}
▼파생 클래스에서 반드시 구현
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Woof!");
}
}
abstract 메서드는 구현이 없으며, 자식 클래스에서 반드시 override 해야 한다.
일반 메서드도 함께 선언할 수 있다.
추상 클래스는 완전한 클래스와 불완전한 클래스의 중간 형태라고 볼수 있다.
▼추상 클래스는 인스턴스화 할수 없다
Animal animal = new Animal();
// 추상클래스로 선언된 클래스는 인스턴스 생성 불가
추상 클래스는 객체로 직접 만들 수 없다.
의도된 제한으로, 반드시 상속을 통해 사용해야 한다.
주의 사항
- 추상 클래스 선언 : abstract 키워드를 사용
- 객체 생성 불가 : 인스턴스를 직접 만들 수 없다
- 필수 구현 : 추상 메서드가 하나라도 있으면 추상 클래스가 되어야 한다
- 필수 구현 : 자식 클래스는 추상 메서드를 반드시 override 해야 한다
- 인터페이스와 차이 : 추상 클래스는 "상태 ( 필드 , 생성자 )" 를 가질 수 있지만, 인터페이스는 그렇지 않다. ( Signature )
추상 클래스 사용 이유
- 여러 클래스가 공통된 동작을 가짐과 동시에 각각 다른 방식으로 특정 동작을 구현해야 할 때
- 공통 로직은 부모 클래스 , 변해야 하는 부분만 자식 클래스에 위임하고 싶을 때
- 일관된 상속 구조를 강제하여 확장성과 유지보수성을 높일때 사용
일반 클래스 상속 vs 추상 클래스 상속
일반 클래스 상속
- 부모 클래스가 완전히 구현되어 있다
- 자식 클래스는 부모의 기능을 그대로 사용하거나 override 로 일부 수정 가능
- 객체 생성 가능 ( 부모 클래스도 new 해서 직접 사용 가능 )
추상 클래스 상속
- 부모 클래스가 불완전 → 추상 메서드를 가지고 있다
- 자식 클래스는 추상 메서드를 반드시 구현해야 한다 ( 강제성 있음 )
- 객체 생성 불가 ( new 추상클래스() )
인터페이스 ( Interface ) 와 추상 클래스의 공통점과 차이점
공통점
- 둘 다 객체 생성 불가 ( new )
- 상속 / 구현 전용으로만 사용
- 파생 클래스 ( 자식 )는 정의된 메서드를 반드시 구현해야 한다
차이점
| 구분 | 추상 클래스 | 인터페이스 |
| 상속 / 구현 | class Dog : Animal 처럼 단일 상속만 가능 | 다중 구현 가능 |
| 멤버 | 추상 메서드 , 메서드 , 필드 , 속성 , 생성자 | 메서드 시그니처 ( 정의 ) |
| 생성자 | 생성자 정의 가능 ( 직접 new 불가 ) | 생성자 불가 |
| 상태 ( 필드 ) | 가질 수 있다 → 공통된 상태 / 값 저장 가능 | 가질 수 없다 → 기능만 정의 |
| 목적 | 틀 ( 템플릿 ) 제공 + 일부 공통 기능 구현 | 규칙만 정의 → 구현은 자식 클래스에 위임 |
▲인터페이스 멤버는 C# 8.0 이후 default 구현 가능하지만 기본적으로는 없다
▲인터페이스는 규칙만 강제, 나머지는 전적으로 자식 클래스에 맡긴다
정리
추상 클래스는 "탬플릿 역할"을 하는 클래스 → 객체 생성 불가, 반드시 상속받아 구현
- 추상 클래스 : "기본 틀 + 일부 구현" 제공
- 인터페이스 : "순수 규칙" 제공
- 일반 상속 : "필요하면 덮어써도 되고 안해도 됨"
참고 자료
'⭐C Sharp > 11. 객체 지향' 카테고리의 다른 글
| readonly (0) | 2025.10.02 |
|---|---|
| 상속 ( OOP ) (0) | 2025.09.28 |
| 인터페이스 ( Interface ) (0) | 2025.09.28 |
| this ( 매개변수 키워드 ) (0) | 2025.09.28 |
| 클래스 ( Class ) (0) | 2025.09.22 |