객체지향 프로그래밍(OOP)은 소프트웨어 개발에서 널리 사용되는 패러다임으로, 코드의 재사용성과 유지보수성을 높이는 데 중점을 둡니다. 이 글에서는 OOP의 네 가지 핵심 원칙인 캡슐화, 상속, 다형성, 추상화에 대해 자세히 살펴보겠습니다.
1. 캡슐화 (Encapsulation)
캡슐화는 객체의 상태(속성)를 외부에서 직접 접근하지 못하도록 감추고, 대신 공개된 메서드를 통해 상태를 변경하거나 접근하도록 하는 원칙입니다. 이로 인해 내부 구현을 변경하더라도 외부에 미치는 영향을 줄일 수 있으며, 객체의 일관성을 유지할 수 있습니다.
public class BankAccount
{
private decimal balance;
public void Deposit(decimal amount)
{
if (amount > 0)
{
balance += amount;
}
}
public decimal GetBalance()
{
return balance;
}
}
위 예제에서 balance
필드는 private
으로 정의되어 외부에서 직접 접근할 수 없습니다. 대신 Deposit
과 GetBalance
메서드를 통해 안전하게 접근하고 수정할 수 있습니다.
2. 상속 (Inheritance)
상속은 한 클래스가 다른 클래스의 속성과 메서드를 물려받을 수 있는 기능입니다. 이를 통해 코드의 중복을 줄이고, 계층적인 관계를 표현할 수 있습니다. 자식 클래스는 부모 클래스의 모든 기능을 상속받고, 필요에 따라 이를 오버라이드(재정의)할 수 있습니다.
public class Animal
{
public void Eat()
{
Console.WriteLine("Animal is eating");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine("Dog is barking");
}
}
이 예제에서 Dog
클래스는 Animal
클래스를 상속받아 Eat
메서드를 사용할 수 있습니다. 추가로 Bark
메서드를 정의하여 개의 고유한 행동을 구현할 수 있습니다.
3. 다형성 (Polymorphism)
다형성은 하나의 메서드나 속성이 여러 형태를 가질 수 있는 능력을 의미합니다. OOP에서는 주로 메서드 오버라이딩과 메서드 오버로딩을 통해 다형성을 구현합니다. 다형성을 통해 코드는 더 유연해지고, 다양한 객체를 동일한 인터페이스로 다룰 수 있습니다.
public class Shape
{
public virtual void Draw()
{
Console.WriteLine("Drawing a shape");
}
}
public class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a circle");
}
}
public class Square : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a square");
}
}
위의 예제에서 Shape
클래스는 기본적인 Draw
메서드를 정의하고, Circle
과 Square
클래스는 이를 오버라이드하여 서로 다른 구현을 제공합니다. 다음처럼 다형성을 활용할 수 있습니다:
public void DrawShape(Shape shape)
{
shape.Draw();
}
// 사용 예
DrawShape(new Circle());
DrawShape(new Square());
4. 추상화 (Abstraction)
추상화는 복잡한 시스템에서 중요하지 않거나 불필요한 세부 사항을 숨기고, 오히려 중요한 개념이나 기능에 초점을 맞추는 과정입니다. OOP에서는 추상 클래스를 사용하여 일부 메서드는 자식 클래스에서 구현하도록 강제할 수 있습니다.
public abstract class Vehicle
{
public abstract void Drive();
}
public class Car : Vehicle
{
public override void Drive()
{
Console.WriteLine("Driving a car");
}
}
위의 예제에서 Vehicle
클래스는 추상 클래스로, Drive
메서드는 구현되지 않았습니다. Car
클래스가 이를 구현하여 구체적인 행동을 정의합니다.