C#에서 abstract 키워드는 추상 클래스(abstract class)를 정의할 때 사용됩니다. 추상 클래스는 구현부가 없는 추상 메서드(abstract method)와 일반적인 비추상 메서드(non-abstract method)를 함께 포함할 수 있으며, 직접 인스턴스화(instantiation)할 수 없다는 것이 가장 큰 특징입니다.
추상 클래스란 무엇인가?
추상 클래스는 객체 지향 프로그래밍에서 공통된 동작을 여러 파생 클래스가 물려받도록 설계하는 기반 클래스 역할을 합니다. 즉, 추상 클래스 자체로는 객체를 생성할 수 없고, 반드시 이를 상속받은 자식 클래스가 추상 메서드를 오버라이드(override)하여 구체적인 동작을 구현해야 합니다.
다음은 추상 클래스 Vehicle과 추상 메서드 display()를 선언한 예제입니다.
public abstract class Vehicle {
public abstract void display();
}파생 클래스 구현하기
추상 클래스 Vehicle에는 Bus, Car, Motorcycle이라는 세 개의 파생 클래스가 존재합니다. 각 파생 클래스는 부모 클래스의 추상 메서드인 display()를 반드시 재정의해야 합니다.
그중 파생 클래스 Car의 구현 예는 다음과 같습니다.
public class Car : Vehicle {
public override void display() {
Console.WriteLine("Car");
}
}override 키워드를 사용하여 부모 클래스의 추상 메서드를 재정의하며, 이때 각 클래스에 맞는 고유한 출력 내용을 작성합니다.
전체 예제 코드
아래는 C#에서 추상 클래스를 활용한 다형성(polymorphism)을 보여주는 완전한 예제입니다.
using System;
public abstract class Vehicle {
public abstract void display();
}
public class Bus : Vehicle {
public override void display() {
Console.WriteLine("Bus");
}
}
public class Car : Vehicle {
public override void display() {
Console.WriteLine("Car");
}
}
public class Motorcycle : Vehicle {
public override void display() {
Console.WriteLine("Motorcycle");
}
}
public class MyClass {
public static void Main() {
Vehicle v;
v = new Bus();
v.display();
v = new Car();
v.display();
v = new Motorcycle();
v.display();
}
}실행 결과
Bus Car Motorcycle
핵심 포인트 정리
- abstract 키워드: 클래스나 메서드에 적용되어, 해당 멤버가 완전한 구현을 갖지 않음을 나타냅니다.
- 인스턴스화 불가: 추상 클래스는
new키워드로 직접 객체를 생성할 수 없습니다. - 강제 오버라이드: 추상 클래스를 상속하는 모든 파생 클래스는 추상 메서드를 반드시 구현해야 합니다.
- 다형성 활용: 위 예제처럼 부모 클래스 타입의 변수(
Vehicle v)로 다양한 자식 객체를 참조할 수 있어 유연하고 확장 가능한 코드를 작성할 수 있습니다.
이처럼 C#의 추상 클래스는 공통 인터페이스를 정의하면서 세부 구현은 파생 클래스에 맡기는 설계 방식으로, 코드의 재사용성과 유지보수성을 높이는 데 매우 유용합니다.