본문 바로가기
카테고리 없음

C# 클래스와 상속(Inheritance) 완벽 가이드!🚀 | 예제로 쉽게 배우기

by bbongz 2025. 3. 2.

 

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 → 부모 메서드를 자식 클래스에서 재정의


💡 상속을 활용하면 코드가 더 깔끔하고 효율적으로 관리될 수 있습니다.
궁금한 점이 있다면 댓글로 남겨 주세요! 😊