C# 추상 클래스와 추상 메서드: 실전 가이드
C# 추상 클래스와 추상 메서드 마스터하기
명확한 예제, 상속 패턴, 생성자, 실전 유스케이스로 C# 추상 클래스와 메서드 탐구.
추상 클래스 (Abstract Class)
C#에서 추상 클래스는 직접 인스턴스화 불가한 템플릿 역할. abstract 키워드로 서브클래싱 목적 명시. 예:
// 추상 클래스 정의
abstract class Language {
// 필드와 메서드
}
// 인스턴스 생성 시도 시 에러
// Language obj = new Language();
추상 클래스는 추상 메서드(본문 없는 선언)와 구상 메서드(완전 구현) 모두 포함 가능. 예:
abstract class Language {
// 추상 메서드 – 본문 없음
public abstract void Display();
// 구상 메서드 – 구현 있음
public void DisplayInfo() {
Console.WriteLine("Concrete method in abstract class");
}
}
진행 전 C# 상속 개념 숙지 권장.
추상 클래스 상속
추상 클래스 직접 인스턴스화 불가하므로 구체적 서브클래스 생성해 파생. 서브클래스 추상 클래스 멤버 상속, 파생 객체 통해 사용. 예:
using System;
namespace AbstractClassDemo {
abstract class Language {
public void Display() {
Console.WriteLine("Concrete method in abstract class");
}
}
// 구상 서브클래스
class Program : Language {
static void Main(string[] args) {
Program prog = new Program();
prog.Display();
Console.ReadLine();
}
}
}
출력
Concrete method in abstract class
Language 추상, Program 상속받아 Display() 호출. 추상 클래스는 sealed 불가, 항상 기반 타입 역할.
참고: 여러 파생 타입이 구현할 공통 계약 필요 시 이 패턴 사용.
C# 추상 메서드 (Abstract Methods)
추상 메서드는 본문 없는 시그니처만 선언. 구상(비추상) 파생 클래스에 구현 강제. 예:
public abstract void Display();
추상 클래스만 추상 메서드 가질 수 있음. 구상 서브클래스 상속 시 모든 추상 멤버 오버라이드 필수(자신도 추상 선언 안 하면).
예제: 추상 메서드 구현
using System;
namespace AbstractClassDemo {
abstract class Animal {
public abstract void MakeSound();
}
class Dog : Animal {
public override void MakeSound() {
Console.WriteLine("Bark Bark");
}
}
class Program {
static void Main(string[] args) {
Dog dog = new Dog();
dog.MakeSound();
Console.ReadLine();
}
}
}
출력
Bark Bark
Animal이 추상 메서드 MakeSound() 선언. 구상 서브클래스 Dog가 오버라이드로 계약 이행.
참고: 추상 메서드는 암시적 virtual이므로 virtual 키워드 불필요/불가.
Getter/Setter 있는 추상 속성 (Abstract Properties)
추상 접근자로 파생 클래스에서 속성 get/set 로직 커스터마이즈 가능. 예:
using System;
namespace AbstractClassDemo {
abstract class Animal {
protected string name;
public abstract string Name { get; set; }
}
class Dog : Animal {
public override string Name {
get { return name; }
set { name = value; }
}
}
class Program {
static void Main(string[] args) {
Dog dog = new Dog();
dog.Name = "Tom";
Console.WriteLine("Name: " + dog.Name);
Console.ReadLine();
}
}
}
출력
Name: Tom
파생 클래스 추상 속성 구현으로 캡슐화된 상태 관리 가능.
추상 클래스 생성자
추상 클래스 생성자 정의 가능, 모든 서브클래스 공유 상태 초기화. 서브클래스 인스턴스 생성 시 추상 클래스 생성자 먼저 실행. 예:
using System;
namespace AbstractClassDemo {
abstract class Animal {
public Animal() {
Console.WriteLine("Animal Constructor");
}
}
class Dog : Animal {
public Dog() {
Console.WriteLine("Dog Constructor");
}
}
class Program {
static void Main(string[] args) {
Dog d1 = new Dog();
Console.ReadLine();
}
}
}
출력
Animal Constructor
Dog Constructor
필요 시 서브클래스 소멸자(Destructor) 정의 가능.
참고: 생성자는 모든 파생 타입 필요 공통 리소스 설정 시 유용.
추상 클래스로 C# 추상화 (Abstraction)
추상 클래스는 구현 세부사항 숨기고 깔끔한 인터페이스 노출로 추상화 제공. "어떻게" 아닌 "무엇"에 집중해 복잡계 단순화.
실생활 비유: 오토바이 브레이크 시스템. 외부 동작(감속/정지) 일관되나 내부 메커니즘 모델별 상이. 추상 클래스로 각 모델 고유 제동 로직 구현하되 외부 계약 불변.
예제: 오토바이 브레이크
using System;
namespace AbstractClassDemo {
abstract class MotorBike {
public abstract void Brake();
}
class SportsBike : MotorBike {
public override void Brake() {
Console.WriteLine("Sports Bike Brake");
}
}
class MountainBike : MotorBike {
public override void Brake() {
Console.WriteLine("Mountain Bike Brake");
}
}
class Program {
static void Main(string[] args) {
SportsBike s1 = new SportsBike();
s1.Brake();
MountainBike m1 = new MountainBike();
m1.Brake();
Console.ReadLine();
}
}
}
출력
Sports Bike Brake
Mountain Bike Brake
MotorBike 추상 메서드 Brake() 선언. 각 구상 바이크 클래스 고유 구현 제공, 다형성 시연.
참고: 기반 구현 전혀 없는 완전 추상화 원하면 인터페이스 고려.