C#

C# 기초부터 고급까지 Chapter 1.8. 상속, 다형성, 캡슐화 – OOP 3대장 완전 이해하기

Juan_ 2025. 4. 25. 18:59
728x90

📚 Chapter 1.8: 상속, 다형성, 캡슐화 – OOP 3대장 완전 이해하기


✅ 이 챕터에서 배울 것

클래스 잘 만들었다고 끝 아님!

"코드 재사용", "확장성", "보안"을 가능하게 하는 게 객체지향의 진짜 힘이다!
  • 상속이란? 왜 쓰는가?
  • 다형성이란? 어떤 식으로 작동하는가?
  • 캡슐화란? 보호 + 유연성의 핵심!
  • 실무에서 쓰는 예제 중심 정리

🧬 1. 상속 (Inheritance)

기존 클래스를 기반으로 새로운 클래스를 만드는 것
→ 코드 재사용 + 기능 확장 가능!
public class Animal
{
    public void Breathe()
    {
        Console.WriteLine("숨 쉰다...");
    }
}

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

Dog d = new Dog();
d.Breathe(); // 부모 메서드 사용 가능
d.Bark();    // 자식 고유 기능
  • ✅ 클래스는 : 키워드로 상속
  • ✅ C#은 단일 상속만 지원

🧠 2. 다형성 (Polymorphism)

같은 타입이지만 실행 결과는 다르게
→ 객체의 "행동"을 유연하게 바꾸는 기술!
public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("...");
    }
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("멍멍!");
    }
}

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

Animal a = new Dog();
a.MakeSound(); // 멍멍!

Animal b = new Cat();
b.MakeSound(); // 야옹!
  • 기반 클래스 타입으로 자식 객체를 다룰 수 있음
  • virtual, override 키워드 필수!

✨ 다형성 실무 예시: 전략 패턴 느낌

public class Logger
{
    public virtual void Log(string message)
    {
        Console.WriteLine("[LOG] " + message);
    }
}

public class FileLogger : Logger
{
    public override void Log(string message)
    {
        // 파일로 저장
    }
}

public class ConsoleLogger : Logger
{
    public override void Log(string message)
    {
        Console.WriteLine("[콘솔] " + message);
    }
}
다형성을 이용하면 나중에 Logger 바꾸는 게 겁나 쉬워짐!

🛡️ 3. 캡슐화 (Encapsulation)

필드 등 내부 데이터는 감추고
외부에는 필요한 것만 노출하는 구조
public class BankAccount
{
    private int balance = 0;

    public void Deposit(int amount)
    {
        if (amount > 0) balance += amount;
    }

    public int GetBalance()
    {
        return balance;
    }
}
  • balance는 직접 접근 불가
  • public 메서드로만 접근 허용

💥 3개 개념 정리

✅ 1. 상속 (Inheritance) – "부모 걸 자식이 물려받는다"

public class Animal
{
    public void Breathe() => Console.WriteLine("숨 쉰다");
}

public class Dog : Animal
{
    public void Bark() => Console.WriteLine("멍멍!");
}
[Animal] ─────────────▶ Breathe()
   ▲
   │ 상속
   │
[Dog] ───────────────▶ Bark()
Dog는 Breathe()도 쓸 수 있고, 자기만의 기능 Bark()도 가짐 → 기능 확장 + 재사용

✅ 2. 다형성 (Polymorphism) – "같은 타입, 다른 행동"

public class Animal
{
    public virtual void Speak() => Console.WriteLine("...");
}

public class Dog : Animal
{
    public override void Speak() => Console.WriteLine("멍멍!");
}

public class Cat : Animal
{
    public override void Speak() => Console.WriteLine("야옹~");
}

Animal a = new Dog();
Animal b = new Cat();

a.Speak(); // 멍멍!
b.Speak(); // 야옹~
[Animal a] ---▶ 실제는 Dog → 멍멍!
[Animal b] ---▶ 실제는 Cat → 야옹~
동일한 Animal 타입이지만, 실행 결과는 다르다 = 다형성!

✅ 3. 캡슐화 (Encapsulation) – "내부는 감추고, 안전하게 다룬다"

public class Account
{
    private int balance;

    public void Deposit(int amount)
    {
        if (amount > 0)
            balance += amount;
    }

    public int GetBalance() => balance;
}
[Account]
   ┌────────────────────┐
   │ private balance    │  ← 외부 접근 불가
   │ public Deposit()   │  ← 안전한 입금만 허용
   │ public GetBalance()│  ← 잔액 조회만 허용
   └────────────────────┘
변수는 숨기고, 메서드를 통해서만 접근하도록 만드는 게 핵심!
데이터 보호 + 유효성 검사 → 실무에서 제일 중요한 기본기

🔥 정리 한 줄씩 다시 박자!

개념 정의 핵심 키워드
상속 부모 기능을 자식이 받음 재사용, 확장
다형성 같은 타입, 다른 동작 override, virtual
캡슐화 내부를 숨기고 안전하게 외부에 제공 private + public method

🎯 언제 어떻게 써야 할까?

개념 설명 실무 예
상속 기능을 공유하고 확장 BaseController, BaseViewModel
다형성 같은 메서드 이름, 다른 실행 ILogger, IShape.Draw()
캡슐화 내부 데이터 보호, 유효성 유지 User.Password, Account.Balance

✅ 장선생의 실전 꿀팁

  • 상속은 무조건 좋은 게 아니다!
    • 너무 깊어지면 유지보수 지옥구성(composition)도 고려!
  • 다형성은 인터페이스랑 궁합 최고 → SOLID 원칙(LSP)의 핵심
  • 캡슐화는 Getter/Setter 남발 금지 → 꼭 필요한 구조만 노출!

✅ 요약 정리

개념 핵심
상속 코드 재사용 + 기능 확장
다형성 부모 타입으로 다양한 자식 객체 다루기
캡슐화 필드 숨기고 메서드로만 접근 허용

📘 다음 챕터 예고 🎓

📘 Chapter 1.9: 델리게이트, 이벤트, 람다식 – 진짜 개념으로 이해하기!

728x90