C#에서 상속(Inheritance) 은 객체 지향 프로그래밍(OOP)의 핵심 개념 중 하나입니다.
상속을 활용하면 기존 클래스를 재사용하여 코드를 효율적으로 관리할 수 있습니다.
이 글에서는 상속의 개념, 기본 문법, 실제 예제를 통해 C# 상속을 쉽게 이해할 수 있도록 정리했습니다. 😊
🔹 상속(Inheritance)이란?
💡 "기존 클래스(부모 클래스)의 기능을 새로운 클래스(자식 클래스)가 물려받는 것"
📌 상속의 핵심 개념
✅ 코드 재사용성 증가 → 기존 코드를 다시 작성할 필요 없음
✅ 유지보수 용이 → 공통 기능을 한 곳에서 수정하면 모든 자식 클래스에 반영
✅ 객체 간의 관계 형성 → 부모-자식 관계를 통해 계층적인 구조 형성
🔹 C# 상속 기본 문법
C#에서 :(콜론) 기호를 사용하여 상속을 선언합니다.
class 부모클래스
{
// 부모 클래스의 멤버 변수 & 메서드
}
class 자식클래스 : 부모클래스
{
// 자식 클래스는 부모 클래스의 멤버를 상속받음
}
🔹 예제 1: 기본적인 상속
🎯 Animal(부모) → Dog(자식) 클래스 만들기
using System;
class Animal // 부모 클래스
{
public string Name;
public void Eat()
{
Console.WriteLine($"{Name}이(가) 음식을 먹습니다.");
}
}
class Dog : Animal // 자식 클래스 (Animal을 상속)
{
public void Bark()
{
Console.WriteLine($"{Name}이(가) 멍멍 짖습니다!");
}
}
class Program
{
static void Main()
{
Dog myDog = new Dog();
myDog.Name = "바둑이"; // 부모 클래스의 변수 사용 가능
myDog.Eat(); // 부모 클래스의 메서드 사용 가능
myDog.Bark(); // 자식 클래스의 메서드 사용 가능
}
}
🔍 실행 결과
바둑이가 음식을 먹습니다.
바둑이가 멍멍 짖습니다!
✅ 부모 클래스 Animal의 Eat() 메서드를 자식 클래스 Dog에서 사용 가능
✅ 자식 클래스 Dog에만 있는 Bark() 메서드는 부모 클래스에서 사용할 수 없음
➡ 이제 상속을 확장해서 더 다양한 기능을 추가해 볼까요?
🔹 예제 2: 생성자(Constructor)와 상속
💡 부모 클래스의 생성자도 자식 클래스에서 사용할 수 있습니다.
💡 base 키워드를 사용하면 부모 클래스의 생성자를 호출할 수 있습니다.
using System;
class Animal
{
public string Name;
// 부모 클래스 생성자
public Animal(string name)
{
Name = name;
Console.WriteLine($"{Name}이(가) 태어났습니다!");
}
}
class Dog : Animal
{
public Dog(string name) : base(name) // 부모 클래스의 생성자 호출
{
}
public void Bark()
{
Console.WriteLine($"{Name}이(가) 멍멍 짖습니다!");
}
}
class Program
{
static void Main()
{
Dog myDog = new Dog("바둑이"); // 객체 생성 시 부모 생성자 호출
myDog.Bark();
}
}
🔍 실행 결과
바둑이가 태어났습니다!
바둑이가 멍멍 짖습니다!
✅ base(name)을 사용하여 부모 클래스의 생성자를 호출
✅ 부모 클래스의 생성자가 실행된 후, 자식 클래스의 메서드 사용 가능
🔹 protected 접근 제한자 (부모 클래스에서 자식 클래스만 접근 가능)
💡 private 멤버는 상속받은 클래스에서도 사용할 수 없지만,
💡 protected 멤버는 부모 클래스와 자식 클래스에서만 접근 가능합니다!
using System;
class Animal
{
protected string Name; // 자식 클래스에서만 접근 가능
public Animal(string name)
{
Name = name;
}
}
class Dog : Animal
{
public Dog(string name) : base(name) {}
public void ShowName()
{
Console.WriteLine($"강아지의 이름: {Name}"); // ✅ protected 멤버 사용 가능!
}
}
class Program
{
static void Main()
{
Dog myDog = new Dog("코코");
myDog.ShowName();
// Console.WriteLine(myDog.Name); // ❌ 오류! protected 변수는 외부에서 접근 불가
}
}
✅ protected를 사용하면 자식 클래스에서 부모의 변수 사용 가능
✅ 외부에서는 접근할 수 없으므로 데이터 보호 가능
🔹 override를 활용한 메서드 재정의
💡 자식 클래스에서 부모 클래스의 메서드를 덮어쓰고 싶다면?
💡 virtual 키워드와 override 키워드를 사용하면 됩니다!
using System;
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("동물이 소리를 냅니다.");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("멍멍!");
}
}
class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("야옹~");
}
}
class Program
{
static void Main()
{
Animal myAnimal = new Animal();
myAnimal.MakeSound(); // 부모 클래스 메서드 실행
Dog myDog = new Dog();
myDog.MakeSound(); // 자식 클래스에서 재정의한 메서드 실행
Cat myCat = new Cat();
myCat.MakeSound(); // 또 다른 자식 클래스에서 재정의한 메서드 실행
}
}
🔍 실행 결과
동물이 소리를 냅니다.
멍멍!
야옹~
✅ virtual 키워드를 사용하면 부모 클래스의 메서드를 재정의 가능
✅ 자식 클래스에서 override로 원하는 동작을 구현할 수 있음
🔹 상속 정리 🚀
✅ 상속(Inheritance) → 부모 클래스의 기능을 자식 클래스가 물려받음
✅ 코드 재사용 가능 & 유지보수 용이
✅ base → 부모 클래스의 생성자 호출
✅ protected → 부모 & 자식 클래스에서만 접근 가능
✅ virtual + override → 부모 메서드를 자식 클래스에서 재정의
💡 상속을 활용하면 코드가 더 깔끔하고 효율적으로 관리될 수 있습니다.
궁금한 점이 있다면 댓글로 남겨 주세요! 😊