📚 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: 델리게이트, 이벤트, 람다식 – 진짜 개념으로 이해하기!