본문 바로가기
C#

C#에서 객체지향 프로그래밍 (OOP) 이해하기 🧩✨

by 다다면체 2024. 12. 17.
728x90
반응형
반응형

C#은 **객체지향 프로그래밍(OOP)**을 강력히 지원하는 언어로, 소프트웨어의 재사용성과 유지보수성을 높이는 데 탁월합니다. 이번 포스팅에서는 OOP의 핵심 개념인 클래스와 객체, 상속, 다형성, 추상화, 캡슐화를 다룹니다. 또한 C#에서의 상속과 인터페이스 사용 예제를 통해 실무에서 활용할 수 있는 팁을 제공하겠습니다. 🚀


1. 클래스와 객체 📦

OOP의 기본 단위는 클래스와 객체입니다. 클래스는 객체의 청사진(설계도) 역할을 하고, 객체는 클래스의 인스턴스입니다.

클래스와 객체의 기본 예제

public class Car
{
    public string Brand { get; set; }
    public string Model { get; set; }
    
    public void Drive()
    {
        Console.WriteLine($"Driving {Brand} {Model}");
    }
}

Car myCar = new Car { Brand = "Toyota", Model = "Corolla" };
myCar.Drive(); // Output: Driving Toyota Corolla

위 코드는 Car 클래스의 속성과 메서드를 정의하고, 이를 활용해 객체를 생성하고 동작시키는 방법을 보여줍니다. 🏎️


2. 상속과 다형성 🪜

상속 (Inheritance)

상속은 기존 클래스의 속성과 메서드를 재사용하여 새로운 클래스를 생성하는 기능입니다. 이를 통해 코드 중복을 줄이고, 계층 구조를 형성할 수 있습니다.

public class Animal
{
    public string Name { get; set; }
    public void Eat()
    {
        Console.WriteLine($"{Name} is eating.");
    }
}

public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("Woof! Woof!");
    }
}

Dog myDog = new Dog { Name = "Buddy" };
myDog.Eat(); // Output: Buddy is eating.
myDog.Bark(); // Output: Woof! Woof!

다형성 (Polymorphism)

다형성은 동일한 메서드 호출이 객체의 타입에 따라 다른 동작을 수행하도록 합니다.

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 Rectangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a rectangle.");
    }
}

Shape shape = new Circle();
shape.Draw(); // Output: Drawing a circle.

shape = new Rectangle();
shape.Draw(); // Output: Drawing a rectangle.

3. 추상화와 캡슐화 🎭

추상화 (Abstraction)

추상화는 중요한 정보만 노출하고 세부 사항은 감추는 개념입니다. C#에서는 추상 클래스와 인터페이스를 통해 이를 구현합니다.

추상 클래스 예제

public abstract class Animal
{
    public abstract void MakeSound();
}

public class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Meow");
    }
}

Animal myCat = new Cat();
myCat.MakeSound(); // Output: Meow

캡슐화 (Encapsulation)

캡슐화는 데이터와 메서드를 하나로 묶고, 외부에서 접근을 제한하는 것입니다. C#에서는 접근 제한자(public, private, protected)를 통해 캡슐화를 구현합니다.

public class BankAccount
{
    private decimal balance;

    public void Deposit(decimal amount)
    {
        if (amount > 0)
        {
            balance += amount;
            Console.WriteLine($"Deposited: {amount}");
        }
    }

    public decimal GetBalance()
    {
        return balance;
    }
}

BankAccount account = new BankAccount();
account.Deposit(100);
Console.WriteLine(account.GetBalance()); // Output: 100

4. 인터페이스와 추상 클래스의 차이점 🛠️

인터페이스 (Interface)

인터페이스는 메서드와 속성의 시그니처만 정의하며, 구현은 이를 상속받은 클래스에서 제공합니다.

public interface IFlyable
{
    void Fly();
}

public class Bird : IFlyable
{
    public void Fly()
    {
        Console.WriteLine("Flying in the sky");
    }
}

IFlyable bird = new Bird();
bird.Fly(); // Output: Flying in the sky

추상 클래스와 인터페이스 비교

특징추상 클래스인터페이스

다중 상속 불가능 가능
구현 메서드 포함 여부 가능 불가능
기본 필드 선언 가능 불가능

5. 실무에서의 상속과 인터페이스 활용 💼

  1. 상속: 코드 재사용이 필요한 경우 (예: 공통 로직을 부모 클래스에 작성).
  2. 인터페이스: 서로 다른 클래스 간의 공통 기능을 강제할 때 (예: ILogger, IDisposable).
  3. 다형성: 런타임에 객체의 동작을 유연하게 변경할 때.

인터페이스 활용 예시: 로깅 시스템

public interface ILogger
{
    void Log(string message);
}

public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine($"Log: {message}");
    }
}

public class FileLogger : ILogger
{
    public void Log(string message)
    {
        // 파일에 로그 작성 코드
    }
}

ILogger logger = new ConsoleLogger();
logger.Log("Application started"); // Output: Log: Application started

마무리 🌟

객체지향 프로그래밍은 코드의 구조를 개선하고 유지보수를 용이하게 하는 핵심 패러다임입니다. 클래스와 객체의 활용부터 상속, 다형성, 추상화, 캡슐화까지 잘 이해하고 연습해보세요. 특히, 인터페이스와 추상 클래스는 실무에서 빈번하게 사용되므로 다양한 상황에서 활용법을 익히는 것이 중요합니다. 💪

더 깊이 있는 객체지향 프로그래밍을 익혀, 실무에서도 빛나는 C# 개발자가 되어보세요! 🚀

728x90
반응형