CodeGym /행동 /C# SELF /상속의 개념

상속의 개념

C# SELF
레벨 20 , 레슨 0
사용 가능

1. 소개

프로그래밍에서 상속은 현실 세계의 상속이랑 꽤 비슷해. 예를 들어, 너는 부모님한테 눈 색깔, 코 모양, 심지어 그림 그리는 재능까지 물려받을 수 있지. 이런 특징들은 "기본값"으로 받는 거고, 새로 만들 필요가 없어. 하지만 너만의 독특한 특징도 발전시킬 수 있어, 부모님한테 없는 것들도 말이야.

프로그래밍에서도 비슷하게 동작해:

  • 한 클래스(우리는 이걸 기본 클래스 또는 부모 클래스, 가끔은 슈퍼클래스라고 부를 거야)가 모든 "자식"이 가지는 공통 특성(속성)과 동작(메서드)을 정의해.
  • 다른 클래스(이건 파생 클래스 또는 자식 클래스, 가끔은 서브클래스라고 해)가 부모로부터 이런 공통된 특징을 상속받아. 자동으로 모든 publicprotected 속성과 메서드를 기본 클래스에서 가져와. 다시 선언할 필요 없어.
  • 그리고 파생 클래스는 부모 클래스에 없는 자신만의 고유한 속성이나 메서드를 추가할 수도 있어.
  • 가끔 파생 클래스가 상속받은 메서드의 동작을 바꿀 수도 있는데(이건 다음 강의에서 다룰 거고, 다형성이라고 불러).

상속의 핵심 개념은 "is-a 관계"(is-a relationship)라는 말로 표현돼. 예를 들어, 네가 마법사, 전사, 궁수가 나오는 게임을 만든다고 해보자:

  • 전사 캐릭터 .
  • 마법사 캐릭터 .
  • 궁수 캐릭터 .

전사캐릭터라면, 모든 캐릭터가 가진 걸 다 가져야 하고, 거기에 전사만의 특별한 것도 추가로 있어야 해.

2. 상속 문법

예제를 보면서 코딩 좀 해보자.

문법의 기본


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

    public void Move()
    {
        Console.WriteLine($"{Name} 움직인다.");
    }
}

// 자식 클래스
public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine($"{Name} 짖는다: 멍!");
    }
}

Dog 클래스 이름 뒤에 콜론이 붙은 거 봤지? 여기서 DogAnimal의 모든 걸 상속받는다고 말하는 거야.

Animal에 있는 모든 public과 protected가 Dog에도 생긴다!

상속 사용하기

이제 이 클래스들을 콘솔 앱에서 써보자:


var dog = new Dog();
dog.Name = "샤릭"; // Name 속성은 Animal에서 상속됨
dog.Move();         // Move 메서드는 Animal에서 상속됨
dog.Bark();         // Dog만의 메서드

// 출력:
// 샤릭 움직인다.
// 샤릭 짖는다: 멍!

동물원에 고양이도 추가해보자:

public class Cat : Animal
{
    public void Meow()
    {
        Console.WriteLine($"{Name} 야옹한다: 야옹!");
    }
}

var cat = new Cat();
cat.Name = "무르카";
cat.Move();
cat.Meow();

3. 상속이 얼마나 편한지

비슷한 객체가 여러 개 있을 때, 코드를 계속 복붙할 필요 없어. 상속은 마치 마스터 복사본 같아: 한 번만 로직을 정의하면 모든 자식이 그걸 가져가.

시각화: 상속 트리


.   Animal
     /    \
  Dog    Cat
클래스 상속 구조도
클래스 Name 속성 Move 메서드 자기만의 메서드
Animal + + -
Dog + + Bark()
Cat + + Meow()

또 다른 예시 — 앱 확장하기

여러 타입의 사람을 관리하는 시스템을 만든다고 해보자. 예전 방식은 이랬지:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

// 이제 직원 추가
public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Position { get; set; }
}

좀 불편하지! 이름 정보가 중복돼. 상속을 쓰면 이렇게 제대로 할 수 있어:


public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string Position { get; set; }
}

public class Student : Person
{
    public int Grade { get; set; }
}
코드 중복 제거를 위한 상속

이제 EmployeeStudent는 이미 FirstName이랑 LastName을 가지고 있어 — 두 번 쓸 필요 없어. 이제 다양한 역할로 시스템을 쉽게 확장할 수 있지.

이게 바로 상속의 마법이야: 공통된 특징을 기본 클래스에 한 번만 써두고, 파생 클래스에서 기능만 살짝 더하면 돼.

4. 상속의 장점

코드 재사용 (Code Reusability): 이게 제일 뚜렷한 장점이야. 같은 코드를 여러 군데에 쓸 필요 없어. 한 번만 쓰고 여러 번 써먹어. 코드가 더 깔끔하고 간결해져(프로그래밍 세계에선 "Don't Repeat Yourself" — DRY, "중복하지 마"라고 해).

유지보수 쉬움 (Easier Maintenance): 만약 이동 로직을 바꿔야 한다면, 기본 클래스 Animal에서만 바꾸면 돼. 모든 파생 클래스가 자동으로 그 변경을 받아. 큰 프로젝트에서 얼마나 시간 절약되는지 상상해봐!

계층 구조 만들기 (Creating Hierarchies): 상속은 현실 세계의 "is-a" 관계를 모델링해서 논리적이고 이해하기 쉬운 구조를 만들어. 전사 캐릭터 , 마법사 캐릭터 . 이렇게 하면 코드가 더 구조적이고 이해하기 쉬워져.

다형성의 기반: 아직 다형성은 자세히 안 배웠지만, 상속이 그 핵심이야. 다형성 덕분에 기본 클래스의 공통 인터페이스로 여러 파생 클래스 객체를 다룰 수 있어. 예를 들어, Animal 리스트에 Dog, Cat 등 다양한 동물을 넣고, 타입 신경 안 쓰고 Move 메서드를 호출할 수 있지. 이거 진짜 강력한 기능이고, 나중에 꼭 다시 다룰 거야!

5. 상속의 뉘앙스와 특징

C#의 단일 상속: C++ 같은 몇몇 언어와 달리, C#은 단일 상속만 지원해. 즉, 한 클래스는 오직 하나의 기본 클래스만 상속할 수 있어. Animal이랑 Vehicle(이런 클래스가 있다고 치자) 둘 다 동시에 상속은 안 돼.

모든 클래스는 암묵적으로 object를 상속함: 이거 재밌는 사실! 기본 클래스를 명시하지 않으면, 네 클래스는 자동으로 System.Object를 상속해. 이게 .NET에서 제일 기본 클래스고, ToString(), Equals(), GetHashCode() 같은 기본 메서드를 제공해. 그래서 ToString()을 오버라이드할 때 사실 object에서 상속받은 메서드를 바꾸는 거야!

생성자는 상속되지 않음: 파생 클래스는 기본 클래스의 생성자를 상속받지 않아. 파생 클래스에서 생성자를 직접 정의해야 해. 만약 기본 클래스에 매개변수 있는 생성자가 있다면, 파생 클래스 생성자에서 반드시 기본 클래스 생성자를 호출해야 해. 이건 base 키워드로 해.

private 멤버는 접근 불가: private 멤버는 파생 클래스에서 직접 접근할 수 없어. 객체 안에 존재는 하지만, 파생 클래스 코드에서 이름으로 접근은 안 돼. 파생 클래스에서만 접근 가능하게 하려면 protected 접근자를 써.

6. 계층 구조 시각화

상속 관계를 더 잘 이해하려면 다이어그램을 자주 써. 그중 제일 흔한 게 UML(통합 모델링 언어) 클래스 다이어그램이야. 동물 예시로 그리면 이렇게 돼:

classDiagram
    class Animal {
        + string Name
        + Move()
    }

    class Dog {
        + Bark()
    }

    class Cat {
        + Meow()
    }

    Animal <|-- Dog : inherits
    Animal <|-- Cat : inherits
상속 예시를 위한 UML 클래스 다이어그램

이 다이어그램에서 빈 삼각형 화살표(Dog에서 Animal로, Cat에서 Animal로)는 상속 관계, 즉 "is-a 관계"(is-a relationship)를 의미해.

7. 상속의 실전 활용

상속은 그냥 이론이 아니라, 실제 프로젝트에서 엄청 많이 쓰이는 현대 프로그래밍의 핵심 개념이야:

그래픽 UI 개발: WPF, WinForms, MAUI(.NET 데스크톱 앱 프레임워크)에서는 거의 모든 컨트롤(버튼, 텍스트박스, 창 등)이 Control이나 UIElement라는 공통 기본 클래스를 상속해. 그래서 크기, 위치, 보임 여부 같은 공통 속성과, 이벤트 처리 같은 공통 메서드를 가질 수 있지.
예를 들어, Button Control 이고, TextBox Control 이야.

게임 엔진: 상속은 게임 오브젝트 계층 만들 때 딱이야: GameObjectCharacterPlayer/Enemy 또는 VehicleCar/Motorcycle 이런 식으로.

데이터베이스 작업(ORM): Entity Framework Core 같은 프레임워크에서는 모든 엔티티의 기본 클래스를 정의하는 경우가 많아, 예를 들어 BaseEntityId(DB 레코드 식별자)나 CreatedAt(생성일) 같은 속성을 넣지. 그리고 User, Product, Order 같은 실제 엔티티들은 BaseEntity를 상속해서 이런 속성을 자동으로 가져가.

테스트: xUnit, NUnit 같은 테스트 프레임워크에서도 상속을 써. 공통 초기화/정리 로직이 들어있는 기본 테스트 클래스를 만들고, 구체적인 테스트 클래스들이 그걸 상속해.

라이브러리와 프레임워크: .NET 표준 라이브러리 자체도 상속을 엄청 써. 예를 들어, 많은 컬렉션과 타입들이 공통 기본 클래스를 상속하거나, 공통 인터페이스를 구현해(이건 나중에 배울 거야).

C#과 .NET 면접에서는 상속, 그 원칙(DRY, "is-a") 그리고 다른 개념(예: 컴포지션, 인터페이스)과의 차이점에 대한 질문이 기본 중의 기본이야. 단순히 설명만 할 줄 아는 게 아니라, 실제 코드나 현실 예시까지 들 수 있으면 진짜 실력자!

그러니까, 상속은 그냥 "언어의 기능"이 아니라, 코드를 구조화하고, 중복을 줄이고, 논리적으로 연결된 시스템을 만드는 강력한 도구야. 확장성 있고 유지보수 쉬운 코드를 쓰는 열쇠지.

2
과제
C# SELF, 레벨 20, 레슨 0
잠금
상속과 기본 클래스
상속과 기본 클래스
2
과제
C# SELF, 레벨 20, 레슨 0
잠금
기능 확장하기
기능 확장하기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION