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. 실무에서의 상속과 인터페이스 활용 💼
- 상속: 코드 재사용이 필요한 경우 (예: 공통 로직을 부모 클래스에 작성).
- 인터페이스: 서로 다른 클래스 간의 공통 기능을 강제할 때 (예: ILogger, IDisposable).
- 다형성: 런타임에 객체의 동작을 유연하게 변경할 때.
인터페이스 활용 예시: 로깅 시스템
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# 개발자가 되어보세요! 🚀
'C#' 카테고리의 다른 글
C#에서 효율적인 데이터 관리: 컬렉션과 자료 구조 📊🔧 (0) | 2024.12.17 |
---|---|
C#에서 비동기 프로그래밍 다루기 ⚡️💻 (0) | 2024.12.17 |
.NET 프레임워크와 C#으로 애플리케이션 만들기 💻🚀 (0) | 2024.12.17 |
C# 고급 기능들: LINQ, Delegates, Events📊🧑💻 (0) | 2024.12.17 |
C# 기본 문법 마스터하기 📚✨ (0) | 2024.12.16 |