C# - 추상 클래스 실습 문제 풀이

2025. 9. 21. 03:04·C#

과제 1)

Trainer라는 클래스를 하나 만들겠습니다. 해당 클래스는 필드로 획득뱃지 갯수를 저장하는 정수형, 이름을 나타내는 문자열 필드, 그리고 스타팅몬스터를 기입할 수 있는 문자열 필드를 보유하게 합니다.

using System;

namespace ClassInherit
{
    class Trainer
    {
        public int BadgeCount { get; set; }
        public string Name { get; set; }
        public string StartMonster { get; set; }
    }
}

 

 

과제 2)

트레이너를 생성할 때, 이름과 스타팅몬스터의 이름을 문자열로 입력받아 객체를 만드는 생성자를 하나 만들어 주세요. 또한 스타팅몬스터를 바꿀 수 있는 메소드도 하나 만들어주시기 바랍니다. (방식 자유)

using System;

namespace ClassInherit
{
    class Trainer
    {
        // 과제 1 Trainer 클래스 필드 선언
        public int BadgeCount { get; set; }
        public string Name { get; set; }
        public string InitMonster { get; set; }

				// 과제 2 생성자, 메서드
        public Trainer(string inputName, string inputMonster)
        {
            Name = inputName;
            InitMonster = inputMonster;
        }

        public void ChangeInitMonster(string inputMonster)
        {
            InitMonster = inputMonster;
        }
    }
}

 

 

과제 3)

클래스 외부에 열거형 자료형 MobType를 하나 만들고 요소로는 Normal, Fire, Water, Grass 를 입력하여 주시기 바랍니다.

그 후, Monster라는 클래스를 새로 하나 만들고, 해당 클래스의 필드로는 정수형 레벨, 열거형 몹타입, 그리고 문자열 이름을 넣어서 만들어 주시기 바랍니다.

using System;

namespace ClassInherit
{
    enum MobType { Normal, Fire, Water, Grass }

    class Monster
    {
        public int Level { get; set; }
        public MobType MType { get; set; }
        public string Name { get; set; }
    }
}

 

 

과제 4)

방금 만들어진 Monster 클래스에 인자값을 요구하지 않는 기본 생성자를 만들고, 이렇게 만들어 졌을 경우, 몹의 타입은 Normal, 이름은 "", 레벨은 1로 설정되게 코드를 작성하여 주시기 바랍니다. 두번째 생성자는, 인자값으로 몹의 타입, 레벨, 몹의 이름을 받아 생성과 동시에 값을 세팅하는 생성자도 만들어 주시기 바랍니다.

using System;

namespace ClassInherit
{
    enum MobType { Normal, Fire, Water, Grass }

    class Monster
    {
        public int Level { get; set; }
        public MobType MType { get; set; }
        public string Name { get; set; }

        public Monster()
        {
            MType = MobType.Normal;
            Name = "";
            Level = 1;
        }

        public Monster(MobType inputMobType, int inputLevel, string inputName)
        {
            MType = inputMobType;
            Level = inputLevel;
            Name = inputName;
        }
    }
}

 

 

 

과제 5)

Trainer 클래스의 필드에, 여러 몬스터를 담을 수 있는 배열을 만들어 주시기 바랍니다. 그 후, 과제2에서 만든 생성자 내부에 몬스터 배열을 6개 담을 수 있게 동적할당 시키는 코드를 작성하여 주시기 바랍니다.

using System;

namespace ClassInherit
{
    class Trainer
    {
        public int BadgeCount { get; set; }
        public string Name { get; set; }
        public string InitMonster { get; set; }

        private Monster[] monsters;

        public Trainer(string inputName, string inputMonster)
        {
            Name = inputName;
            InitMonster = inputMonster;
            
            monsters = new Monster[6];
        }

        public void ChangeInitMonster(string inputMonster)
        {
            InitMonster = inputMonster;
        }
    }
}

 

 

 

과제 6)

Trainer에게 생성자를 하나 더 추가하여 줍니다

  • 생성자 오버로딩을 통해, 인자값으로 몬스터를 받습니다
  • 트레이너가 가진 몬스터배열을 6개 담을 수 있게 동적할당 시킵니다
  • 만들어진 몹 배열의 0번째 인덱스에, 방금 건네받은 몹으로 담아줍니다
using System;

namespace ClassInherit
{
    class Trainer
    {
        // 과제 1 : Trainer 클래스 필드 선언
        public int BadgeCount { get; set; }
        public string Name { get; set; }
        public string InitMonster { get; set; }

        // 과제 5 : 몬스터 배열 생성
        private Monster[] monsters;

        // 과제 2 : 생성자
        public Trainer(string inputName, string inputMonster)
        {
            Name = inputName;
            InitMonster = inputMonster;
            
            // 과제 5: 몬스터 배열 6개 할당
            monsters = new Monster[6];
        }

        // 과제 6 : 생성자 추가
        public Trainer(Monster inputMob)
        {
            monsters = new Monster[6];
            monsters[0] = inputMob;
        }

        // 과제 2 : 시작 몬스터 변경 메서드
        public void ChangeInitMonster(string inputMonster)
        {
            InitMonster = inputMonster;
        }
    }
}

 

 

과제 7)

트레이너에게 ShowFirstMob이라는 메소드를 만들어, 콘솔창에는 배열의 0번째 몹의 레벨과 이름이 출력되는 내용을 기입하여 주시기 바랍니다.

using System;

namespace ClassInherit
{
    class Trainer
    {
        // 과제 1 : Trainer 클래스 필드 선언
        public int BadgeCount { get; set; }
        public string Name { get; set; }
        public string InitMonster { get; set; }

        // 과제 5 : 몬스터 배열 생성
        public Monster[] monsters;

        // 과제 2 : 생성자
        public Trainer(string inputName, string inputMonster)
        {
            Name = inputName;
            InitMonster = inputMonster;
            
            // 과제 5: 몬스터 배열 6개 할당
            monsters = new Monster[6];
        }

        // 과제 6 : 생성자 추가
        public Trainer(Monster inputMob)
        {
            monsters = new Monster[6];
            monsters[0] = inputMob;
        }

        // 과제 2 : 시작 몬스터 변경 메서드
        public void ChangeInitMonster(string inputMonster)
        {
            InitMonster = inputMonster;
        }

        // 과제 7 : 메서드
        public void ShowFirstMob()
        {
            Console.WriteLine("Lv " + monsters[0].Level + " : " + monsters[0].Name);
        }
    }
}

 

using System;

namespace ClassInherit
{
    class Program
    {
        static void Main(string[] args)
        {
            // 실행 테스트
            Console.WriteLine("-------------------------- Test Start --------------------------");

            Console.WriteLine("------------- 과제2 생성자 테스트 -------------");
            Console.WriteLine();

            Trainer trainer1 = new Trainer("피카츄", "지우");
            Console.WriteLine($"트레이너 이름 : {trainer1.Name}");
            Console.WriteLine($"시작 몬스터 : {trainer1.InitMonster}");

            Console.WriteLine();
            Console.WriteLine("-- 몬스터 배열 생성 확인 전부 비어있는 ** 면 정상 작동 --");
            foreach (Monster mon in trainer1.monsters)
            {
                Console.Write("*" + mon + "*" + "  ");
            }
            Console.WriteLine();


            Console.WriteLine();
            Console.WriteLine("---------- 과제 4 몬스터 생성자 2종 테스트 ----------");
            Console.WriteLine();

            Console.WriteLine("Monster 기본 생성자");
            Monster monster1 = new Monster();
            Console.WriteLine($"{monster1.Name}  {monster1.Level}  {monster1.MType} ");

            Console.WriteLine();

            Console.WriteLine("Monster 인자값 있는 생성자와 ShowFirstMob 메서드 확인");
            Monster monster2 = new Monster(MobType.Fire, 55, "불주먹 지우");
            Trainer trainer2 = new Trainer(monster2);
            trainer2.ShowFirstMob();

            Console.WriteLine("-------------------------- Test End --------------------------");
        }
    }
}

 

 

 

 


 

심화 과제 1

바로 위에서, Trainer라는 클래스를 만들었습니다. 해당 구현 과제를 추상 클래스를 활용하여 리팩토링(다시 만들기)를 진행하려 합니다. 다음 구현사항에 맞추어 Trainer클래스를 완성시켜 주시기 바랍니다.

Monster라는 추상 클래스를 새로 하나 만들고, 해당 클래스의 필드로는 정수형 레벨, 열거형 몹타입, 그리고 문자열 이름을 넣어서 만들어 주시기 바랍니다. Monster 추상 클래스에 BaseAttack이라는 abstract 메소드도 추가하여 주시기 바랍니다.

using System;

namespace ClassInherit
{
    enum MobType { Normal, Fire, Water, Grass }

    abstract class Monster
    {
        public int Level { get; set; }
        public MobType Type { get; set; }
        public string Name { get; set; }

        public abstract void BaseAttack();
    }
}

 

 

심화 과제 2

이 Monster 클래스를 상속받는 Pikachu, Squirtle, Bulbasaur, Charmander 네 가지의 클래스를 만들어 주시기 바랍니다. Pikachu의 BaseAttack에는 '전광석화', Squirtle는 '물총발사', Bulbasaur는 '덩굴채찍', Charmander는 '화염방사' 를 콘솔에 출력하는 기능을 각각 제작하여 주시기 바랍니다. 각각 몬스터들의 생성자에는 인자값으로 이름과 레벨을 받을 수 있게 하고, 몹타입은 본인 취향 적절한 타입을 기입하여 주시기 바랍니다.

using System;

namespace ClassInherit
{
    enum MobType { Normal, Fire, Water, Grass }

    abstract class Monster
    {
        public int Level { get; set; }
        public MobType Type { get; set; }
        public string Name { get; set; }

        public abstract void BaseAttack();
    }

    class Pikachu : Monster
    {
        public Pikachu(string inputName, int inputLevel)
        {
            Level = inputLevel;
            Name = inputName;
            Type = MobType.Normal;
        }

        public override void BaseAttack()
        {
            Console.WriteLine("전광석화");
        }
    }

    class Squirtle : Monster
    {
        public Squirtle(string inputName, int inputLevel)
        {
            Level = inputLevel;
            Name = inputName;
            Type = MobType.Water;
        }

        public override void BaseAttack()
        {
            Console.WriteLine("물총발사");
        }
    }

    class Bulbasaur : Monster
    {
        public Bulbasaur(string inputName, int inputLevel)
        {
            Level = inputLevel;
            Name = inputName;
            Type = MobType.Grass;
        }

        public override void BaseAttack()
        {
            Console.WriteLine("덩굴채찍");
        }
    }

    class Charmander : Monster
    {
        public Charmander(string inputName, int inputLevel)
        {
            Level = inputLevel;
            Name = inputName;
            Type = MobType.Fire;
        }

        public override void BaseAttack()
        {
            Console.WriteLine("화염방사");
        }
    }
}

 

 

심화 과제 3

Trainer 클래스에 6개의 몬스터형을 담을 수 있는 배열이 있을겁니다. 트레이너 생성자에는 자동으로 피카츄를 배열의 첫 번째에 담기게 하는 코드를 작성하여 주시기 바랍니다.

using System;

namespace ClassInherit
{
    class Trainer
    {
        public int BadgeCount { get; set; }
        public string Name { get; set; }
        public string InitMonster { get; set; }


        public Monster[] monsters;

        
        public Trainer(string inputName, string inputMonster)
        {
            Name = inputName;
            InitMonster = inputMonster;
            
            monsters = new Monster[6];
            monsters[0] = new Pikachu("지우 담당 일찐", 99);
        }

        public Trainer(Monster inputMob)
        {
            monsters = new Monster[6];
            monsters[0] = inputMob;
        }

        public void ChangeInitMonster(string inputMonster)
        {
            InitMonster = inputMonster;
        }

        public void ShowFirstMob()
        {
            Console.WriteLine("Lv " + monsters[0].Level + " : " + monsters[0].Name);
        }
    }
}

 

 

 

심화 과제 4

Trainer 클래스의 메소드로는, 몬스터를 인자값으로 받아 추가하는 기능, 만약 6마리를 초과해서 추가하려 하면, 추가하지 않고 경고문을 내는 메소드를 하나 제작해주시기 바랍니다. 이를 제작하기 위해 추가 필드가 필요하다면 추가 작성하시길 바랍니다.

using System;

namespace ClassInherit
{
    class Trainer
    {
        public int BadgeCount { get; set; }
        public string Name { get; set; }
        public string InitMonster { get; set; }


        public Monster[] monsters;

        
        public Trainer(string inputName, string inputMonster)
        {
            Name = inputName;
            InitMonster = inputMonster;
            
            monsters = new Monster[6];
            monsters[0] = new Pikachu("지우 담당 일찐", 99);
        }

        public Trainer(Monster inputMob)
        {
            monsters = new Monster[6];
            monsters[0] = inputMob;
        }

        public void ChangeInitMonster(string inputMonster)
        {
            InitMonster = inputMonster;
        }

        public void ShowFirstMob()
        {
            Console.WriteLine("Lv " + monsters[0].Level + " : " + monsters[0].Name);
        }

        public void AddMonster(Monster inputMob)
        {
            bool isComplete = false;

            for (int i = 0; i < monsters.Length; i++)
            {
                if (monsters[i] == null)
                {
                    monsters[i] = inputMob;
                    isComplete = true;
                }
            }

            if (!isComplete)
            {
                Console.WriteLine("monsters 배열이 가득차서 추가할 수 없습니다.");
            }
        }
    }
}

 

 

심화 과제 5

배열 속 보유중인 모든 몹들이 가진 BaseAttack을 전부 실행하는 AllAttack이라는 메소드를 작성하세요.

public void AllAtack()
{
    Console.WriteLine("전부 다굴쳐!!");
    foreach (Monster mon in monsters)
    {
        mon.BaseAttack();
    }
}

 

 

심화 과제 6

메인에서 Trainer를 하나 만든 후, Trainer 객체에 Charmander 한마리를 이름은 '파이리', 레벨은 5로 하여 추가하는 코드를 작성하세요. Trainer의 AllAttack 메소드를 호출하여 트레이너가 가진 모든 몹의 공격이 콘솔에 출력되게 하세요.

using System;

namespace ClassInherit
{
    class Program
    {
        static void Main(string[] args)
        {
            Trainer Saitama = new Trainer(new Charmander("파이리", 88));
            Saitama.monsters[1] = new Pikachu("조금 쎈 피카츄", 99);
            Saitama.monsters[2] = new Pikachu("그냥 피카츄", 99);
            Saitama.monsters[3] = new Pikachu("조금 많이 피카츄", 99);
            Saitama.monsters[4] = new Pikachu("너무 많이 강해진 피카츄", 99);

            Saitama.AddMonster(new Bulbasaur("초과해서 못들어갈걸?", 55));
            Saitama.AddMonster(new Squirtle("내가 누구게", 33));

            Saitama.AllAtack();
        }
    }
}

 

'C#' 카테고리의 다른 글

C# - 인터페이스 (Interface)  (0) 2025.09.21
C# - 제네릭 (Generic)  (0) 2025.09.21
C# - Null 조건부 연산자 ?.  (0) 2025.09.21
C# - 추상 클래스 (Abstract Class)  (0) 2025.09.21
C# - 오버로딩과 오버라이딩의 차이  (0) 2025.09.19
'C#' 카테고리의 다른 글
  • C# - 인터페이스 (Interface)
  • C# - 제네릭 (Generic)
  • C# - Null 조건부 연산자 ?.
  • C# - 추상 클래스 (Abstract Class)
ellug
ellug
Web / App / Game Dev
  • ellug
    dev.ellug
    ellug
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • Javascript (React, Next) (1)
      • C# (66)
      • Graphics (1)
      • Unity (25)
      • 프로그래머스 (0)
        • Lv.0 (0)
        • Lv.1 (0)
        • Lv.2 (0)
        • Lv.3 (0)
      • AI Agent (0)
      • StableDiffusion (0)
      • ETC (1)
      • 잡담 (0)
      • 유머 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Design Pattern
    클래스
    struct
    interface
    큐
    추상 클래스
    C#
    콘솔
    class
    stack
    function
    유니티
    list
    네트워크
    알고리즘
    스택
    게임
    inputsystem
    useState
    자료구조
    firebase
    Photon
    console
    터미널
    delegate
    Queue
    unity
    Network
    최적화
    Abstract
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ellug
C# - 추상 클래스 실습 문제 풀이
상단으로

티스토리툴바