본문 바로가기
C#

C# - 상속 ( Inheritance )

by Classic Master 2024. 5. 16.
728x90

상속이란??

상속 ( Inheritance )

개요

  • 상속은 객체 지향 프로그래밍(OOP)에서 중요한 개념으로, 기존 클래스를 재사용하고 확장할 수 있는 방법을 제공합니다. 상속을 통해 코드의 재사용성을 높이고 클래스 간의 관계를 명확히 할 수 있습니다.

정의

  • 상속(Inheritance)은 하나의 클래스가 다른 클래스의 속성과 메서드를 물려받아 재사용하고 확장할 수 있도록 하는 기능입니다. 이를 통해 코드의 중복을 줄이고, 유지보수를 용이하게 할 수 있습니다. 상속을 받는 클래스를 파생 클래스(Derived Class) 또는 **자식 클래스(Child Class)**라고 하고, 상속을 제공하는 클래스를 기본 클래스(Base Class) 또는 **부모 클래스(Parent Class)**라고 합니다.

기본개념

  • 기본 클래스(Base Class) / 부모 클래스(Parent Class) / 슈퍼 클래스(Super Class)
  • ▷ 다른 클래스가 상속받을 수 있는 클래스입니다.
  • 파생 클래스(Derived Class) / 자식 클래스(Child Class) / 서브 클래스(Sub Class)
  • ▷기본 클래스로부터 상속받아 기능을 확장하거나 변경하는 클래스입니다.

표현 방식

C#에서는 기호를 사용하여 클래스가 다른 클래스를 상속받도록 선언합니다. 기본 클래스와 파생 클래스의 관계는 다음과 같이 표현할 수 있습니다.

// 기본 클래스
public class Animal {
    public void Eat() {
        Console.WriteLine("Eating...");
    }
}

// 파생 클래스
public class Dog : Animal {
    public void Bark() {
        Console.WriteLine("Barking...");
    }
}

위 코드에서 Dog 클래스는 Animal 클래스를 상속받습니다. 따라서 Dog 클래스는 Animal 클래스의 Eat 메서드를 사용할 수 있으며, 자신만의 Bark 메서드를 추가로 가질 수 있습니다.

반응형

 

상속 장점 및 단점

장점

  • 코드 재사용 : 이미 작성된 클래스를 재사용하여 새로운 클래스를 만들 수 있어 개발 효율이 높아집니다.
  • 유지보수 용이성 : 기본 클래스를 수정하면 파생 클래스에도 자동으로 반영되어 유지보수가 용이합니다.
  • 계층적 분류 : 클래스 간의 관계를 계층적으로 표현할 수 있어 시스템의 구조를 명확하게 이해할 수 있습니다.
  • 확장성 : 기본 클래스의 기능을 확장하거나 변경할 수 있어 유연한 설계가 가능합니다.

단점

  • 복잡성 증가 : 상속 구조가 깊어지면 코드의 이해와 디버깅이 어려워질 수 있습니다.
  • 강한 결합 : 상속을 통해 클래스 간의 결합이 강해져 변경에 대한 유연성이 떨어질 수 있습니다.
  • 다중 상속 불가 : C#에서는 다중 상속을 지원하지 않기 때문에, 한 클래스가 두 개 이상의 클래스를 상속받을 수 없습니다.

 

예시

다음은 상속의 개념을 보여주는 예제입니다.

// 기본 클래스
public class Animal {
    public string Name { get; set; }

    public void Eat() {
        Console.WriteLine($"{Name} is eating.");
    }

    public void Sleep() {
        Console.WriteLine($"{Name} is sleeping.");
    }
}

// 파생 클래스
public class Dog : Animal {
    public void Bark() {
        Console.WriteLine($"{Name} is barking.");
    }
}

public class Program {
    public static void Main() {
        Dog myDog = new Dog();
        myDog.Name = "Rex";
        myDog.Eat();      // Rex is eating.
        myDog.Sleep();    // Rex is sleeping.
        myDog.Bark();     // Rex is barking.
    }
}

위 예제에서 Dog 클래스는 Animal 클래스를 상속받아 Eat과 Sleep 메서드를 사용할 수 있으며, Bark라는 새로운 메서드를 추가했습니다. Program 클래스의 Main 메서드에서는 Dog 객체를 생성하고 Animal 클래스와 Dog 클래스의 메서드를 호출합니다.

 

base 키워드 사용 

파생 클래스에서 기본 클래스의 생성자나 메서드에 접근할 때는 base 키워드를 사용할 수 있습니다. 예를 들어, 기본 클래스에 생성자가 있는 경우, 파생 클래스에서 이를 호출할 수 있습니다.

// 기본 클래스
public class Animal {
    public string Name { get; set; }

    public Animal(string name) {
        Name = name;
    }

    public void Eat() {
        Console.WriteLine($"{Name} is eating.");
    }
}

// 파생 클래스
public class Dog : Animal {
    public Dog(string name) : base(name) {
    }

    public void Bark() {
        Console.WriteLine($"{Name} is barking.");
    }
}

public class Program {
    public static void Main() {
        Dog myDog = new Dog("Rex");
        myDog.Eat();      // Rex is eating.
        myDog.Bark();     // Rex is barking.
    }
}

이 예제에서 Dog 클래스의 생성자는 base(name)을 사용하여 Animal 클래스의 생성자를 호출합니다. 이렇게 하면 Dog 객체를 생성할 때 Animal 클래스의 생성자도 함께 호출되어 Name 속성이 초기화됩니다.

 

 

접근 제한자 사용
기본 클래스의 멤버는 public, protected, internal 접근 제한자로 선언할 수 있으며, 파생 클래스는 이 멤버들에 접근할 수 있습니다. private 멤버는 상속된 클래스에서 접근할 수 없습니다.

public class Animal {
    public string Name { get; set; }
    private int age;

    protected void SetAge(int age) {
        this.age = age;
    }

    public void DisplayAge() {
        Console.WriteLine($"Age: {age}");
    }
}

public class Dog : Animal {
    public void SetDogAge(int age) {
        SetAge(age);  // protected 멤버에 접근 가능
    }
}

public class Program {
    public static void Main() {
        Dog myDog = new Dog();
        myDog.Name = "Rex";
        myDog.SetDogAge(5);
        myDog.DisplayAge();  // Age: 5
    }
}

이 예제에서 SetAge 메서드는 protected로 선언되어 Dog 클래스에서 접근할 수 있습니다. 그러나 age 필드는 private으로 선언되어 파생 클래스에서 직접 접근할 수 없습니다.


결론

상속은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 코드 재사용성을 높이고 클래스 간의 관계를 명확히 하는 데 중요한 역할을 합니다. 그러나 상속을 사용할 때는 복잡성을 관리하고 클래스 간의 결합도를 낮추는 것이 중요합니다. 상속을 적절하게 활용하면 효율적이고 유지보수 가능한 소프트웨어를 개발할 수 있습니다.

728x90
반응형