전체 코드

using System.ComponentModel;
using System.Numerics;
using System.Threading;

namespace CSharp
{
    // OOP 3대 특성 (은닉성, 상속성, 다형성)

    // 부모 클래스 혹은 기반클래스
    class Player
    {
        static public int counter = 1;
        public int id;
        public int hp;
        public int attack;

        //public Player()
        //{
        //    Console.WriteLine("Player 생성자 호출");
        //}

        //public Player(int hp)
        //{
        //    this.hp = hp;
        //    Console.WriteLine("Player hp 생성자 호출");
        //}
        public void Move()
        {
            Console.WriteLine("Player Move");
        }
        public void Attack()
        {
            Console.WriteLine("Player Attack");
        }
    }

    // 메이지 클래스 추가

    // 자식 혹은 파생 클래스
    class Mage : Player
    {
        // 공통적으로 들어가는 특징
        // 중복되는 데이터를 계속 추가할 것이냐 -> 왜냐 비효율적
        // 만약에 몬스터라면 몇백가지의 몬스터가 생김 -> 필드 메소드를 다만들면 너무 비효율적

        
    }

    class Archer : Player
    {

    }

    class Knight : Player
    {
      

        
       
    }

    
    internal class Program
    {
        
        static void Main(string[] args)
        {
            Knight knight = new Knight();
            // 부모의 속성과 기능들도 자식이 상속받아 사용 가능

        }

    }
}

1. 상속(Inheritance)란?

  • 코드의 재사용성을 높이는 핵심 개념
  • 부모 클래스(기반 클래스, Base Class): 공통된 속성과 기능을 정의하는 클래스
  • 자식 클래스(파생 클래스, Derived Class): 부모 클래스를 상속받아 기능을 확장하는 클래스
  • base 키워드를 사용하여 부모 생성자를 명시적으로 호출할 수 있음

2. 상속 코드 예제

부모 클래스 (Player)

using System;

class Player // 부모 클래스
{
    protected int hp; // 체력
    protected int attack; // 공격력
    
    // 기본 생성자
    public Player()
    {
        hp = 100;
        attack = 10;
        Console.WriteLine("Player 기본 생성자 호출");
    }

    // 매개변수가 있는 생성자
    public Player(int hp, int attack)
    {
        this.hp = hp;
        this.attack = attack;
        Console.WriteLine("Player 매개변수 생성자 호출");
    }

    public void Move()
    {
        Console.WriteLine("Player 이동");
    }
    
    public void Attack()
    {
        Console.WriteLine("Player 공격");
    }
}

자식 클래스 (Knight, Mage, Archer)

class Knight : Player // Player 클래스를 상속받음
{
    public Knight() : base(120, 15) // 부모 클래스의 생성자 호출
    {
        Console.WriteLine("Knight 생성자 호출");
    }
}

class Mage : Player
{
    public Mage() : base(80, 25) // 부모 클래스의 생성자 호출
    {
        Console.WriteLine("Mage 생성자 호출");
    }
}

class Archer : Player
{
    public Archer() : base(90, 20) // 부모 클래스의 생성자 호출
    {
        Console.WriteLine("Archer 생성자 호출");
    }
}

프로그램 실행 (Main 메서드)

class Program
{
    static void Main(string[] args)
    {
        Knight knight = new Knight();
        Mage mage = new Mage();
        Archer archer = new Archer();

        knight.Move(); // Player 클래스에서 상속된 기능 사용 가능
        mage.Attack();
    }
}

3. 부모 생성자가 먼저 호출됨

  • 자식 클래스가 객체를 생성할 때 부모 생성자가 먼저 호출
  • base(매개변수)를 사용하여 부모 클래스의 특정 생성자를 명시적으로 호출할 수 있음
  • 부모 클래스에 기본 생성자가 없을 경우 자식 클래스에서 base(값)을 명시하지 않으면 컴파일 오류 발생

부모 클래스에 기본 생성자가 없을 때 문제 발생 예제

class Player
{
    protected int hp;
    
    // 매개변수가 있는 생성자만 정의됨
    protected Player(int hp)
    {
        this.hp = hp;
    }
}

class Knight : Player
{
    public Knight() // ❌ 오류 발생: Player(int hp) 생성자를 명시적으로 호출해야 함
    {
    }
}

해결 방법: base(값) 사용

class Knight : Player
{
    public Knight() : base(120) // ⭕ 문제 해결
    {
    }
}

4. 상속의 주요 특징

✅ 상속의 장점

개념설명
코드 재사용성중복 코드를 줄이고, 유지보수를 쉽게 함
부모 클래스 확장자식 클래스에서 부모의 기능을 확장할 수 있음
base 키워드 사용부모 클래스의 생성자를 명시적으로 호출할 수 있음

base 키워드 사용법

class Knight : Player
{
    public Knight() : base(120, 15) // 부모 생성자 호출
    {
        Console.WriteLine("Knight 생성됨");
    }
}

profile
李家네_공부방

0개의 댓글