C# - 클래스 실습 문제 풀이 (생성자)

2025. 9. 17. 21:47·C#

과제1 - 트레이너와 몬스터 제작하기

트레이너와 몬스터 클래스를 구현하시오. 각 클래스는 다음과 같은 속성과 기능을 지녀야 한다.

Class Trainer

이름 : 플레이어 이름, 프로그램 시작 시 입력하도록 구현 몬스터를 보관할 수 있는 크기 6의 배열

Add() : 매개변수로 몬스터를 하나 입력받아 배열의 빈 자리에 추가. 빈 자리가 없다면 추가되지 않음

Remove() : 매개변수로 몬스터를 하나 입력받아 동일한 이름을 가진 몬스터를 배열에서 삭제.

이름에 해당하는 몬스터가 없거나 배열에 몬스터가 한마리도 없는 경우 아무 기능도 수행하지 않음.

PrintAll() : 자신이 가지고 있는 모든 포켓몬에 대한 정보를 출력

Class Monster 이름, 레벨 : 객체의 인스턴스 생성 시 new할당에서 이름과 레벨을 입력받을 수 있도록 구현

Print() : 자신(몬스터)에 대한 정보를 출력

 

Monster.cs

using System;

namespace ClassCtor
{
    class Monster
    {
        public string Name { get; set; }
        public int Level { get; set; }


        public Monster(string inputName, int inputLevel = 1)
        {
            Name = inputName;
            Level = inputLevel;
        }

        public void Print()
        {
            Console.WriteLine($"반갑소. 나는 {Name} 이외다. 본좌의 레벨은 {Level} 이오. 잘부탁하오.");
        }
    }
}

 

Trainer.cs

using System;

namespace ClassCtor
{
    class Trainer
    {
        public string Name { get; set;}
        public Monster[] monsters = new Monster[6];

        public void Add(Monster inputMonster)
        {
            for (int i = 0; i < monsters.Length; i++)
            {
                if (monsters[i] == null)
                {
                    monsters[i] = inputMonster;
                    Console.WriteLine($"{i} 번째 배열에 {monsters[i].Name} 를 추가.");
                    return;
                }
            }
        }

        public void Remove(string inputMonster)
        {
            for (int i = 0;i < monsters.Length; i++)
            {
                if (monsters[i].Name == inputMonster)
                {
                    Console.WriteLine($"{i} 번째 배열에서 {monsters[i].Name} 를 삭제.");
                    monsters[i] = null;
                }
            }
        }

        public void PrintAll()
        {
            Console.WriteLine("----------Print All Start---------");
            foreach (Monster mon in monsters)
            {
                if (mon == null)
                {
                    Console.WriteLine("비어있음");
                }
                else
                {
                    Console.WriteLine($"{mon.Name} - Lv{mon.Level}");
                }
            }
            Console.WriteLine("----------Print All End----------");
        }
    }
}

 

Program.cs

using System;

namespace ClassCtor
{
    class Program
    {
        static void Main(string[] args)
        {
            // 프로그램 시작시 플레이어 이름 입력
            Trainer trainer = new Trainer();

            Console.WriteLine("트레이너 이름을 입력하시게나");
            trainer.Name = Console.ReadLine();
            Console.WriteLine($"your name is {trainer.Name}");
            Console.WriteLine("----------------------------------------");

            // random for rd level
            Random randomNum = new Random();

            // Trainer.Add 함수 테스트
            Console.WriteLine("포켓몬을 얻었다. 이름을 입력하시오");
            Monster firstMon = new Monster(Console.ReadLine(), randomNum.Next(1, 100));
            trainer.Add(firstMon);
            trainer.monsters[0].Print();

            Console.WriteLine();
            Monster Mon2 = new Monster("카카로트", randomNum.Next(1, 100));
            trainer.Add(Mon2);
            trainer.monsters[1].Print();

            Console.WriteLine();
            Monster Mon3 = new Monster("카카로트", randomNum.Next(1, 100));
            trainer.Add(Mon3);
            trainer.monsters[2].Print();

            Console.WriteLine();
            Monster Mon4 = new Monster("에버그레이스", randomNum.Next(1, 100));
            trainer.Add(Mon4);
            trainer.monsters[3].Print();

            Console.WriteLine();
            Monster Mon5 = new Monster("카제로스", randomNum.Next(1, 100));
            trainer.Add(Mon5);
            trainer.monsters[4].Print();

            Console.WriteLine();
            Monster Mon6 = new Monster("샨디야 집에 가라", randomNum.Next(1, 100));
            trainer.Add(Mon6);
            trainer.monsters[5].Print();
            
            // trainer.PrintAll 메서드 테스트
            trainer.PrintAll();
            Console.WriteLine();

            // trainer.Remove 메서드 테스트
            Console.WriteLine("삭제할 몬스터 이름을 입력하시요");
            trainer.Remove(Console.ReadLine());

            // remove check
            Console.WriteLine("Print All 메인에서 출력 테스트");
            trainer.PrintAll();
        }
    }
}

 

 

추가 과제 1 - Hero 클래스 생성

새로운 cs 파일을 만들고, Hero 클래스 생성

필드 혹은 프로퍼티

문자열 영웅의 이름

정수형 영웅의 체력

정수형 영웅의 공격력

정수형 영웅의 방어력

생성자 기본 생성자: "Unknown Hero"로 영웅 이름을 설정하고, HP는 100, 공격력은 20, 방어력은 10으로 설정

오버로딩 생성자: 이름, 체력, 공격력, 방어력을 모두 외부에서 세팅해 줄 수 있는 생성자도 하나 생성

메서드

피격을 나타내는 메서드 TakeDamage 반환은 없음. 인자값은 정수형 damage 받은 피해를 체력에서 차감, 방어력은 피해를 경감시키는 역할

예를 들어, 인자로 넘어온 데미지는 40, 방어력은 10이면 총 30 데미지 받음

몬스터 공격하는 메서드 AttackMob

반환 없음. 인자값은 아래 만들 Monster형 mob

cw 로 “몹 이름을 공격!” 출력

mob의 TakeDamage 메서드 호출하되, 인자로 hero의 공격력 넘김

영웅의 상태를 출력하는 함수 DisplayInfo

cw로 영웅 속 다양한 요소들을 본인 취향에 맞게 자유롭게 출력하는 기능

using System;

namespace MobileHero
{
    class Hero
    {
        public string Name { get; set; }
        public int HP { get; set; }
        public int Atk { get; set; }
        public int Def {  get; set; }

        public Hero()
        {
            Name = "Unknown Hero";
            HP = 100;
            Atk = 20;
            Def = 10;
        }

        public Hero(string inputName, int inputHP, int inputAtk, int inputDef)
        {
            Name = inputName;
            HP = inputHP;
            Atk = inputAtk;
            Def = inputDef;
        }

        public void TakeDamage(int damage)
        {
            int totalDam = damage - Def;
            if (totalDam > 0)
            {
                HP -= totalDam;
            }
        }

        public void AttackMob(Monster mob)
        {
            Console.WriteLine($"{mob.Name} 을 공격!");
            mob.TakeDamage(Atk);
        }

        public void DisplayInfo()
        {
            Console.WriteLine("----------------------------------");
            Console.WriteLine($"Hero Name : {Name}");
            Console.WriteLine($"HP : {HP}");
            Console.WriteLine($"Atk : {Atk}");
            Console.WriteLine($"Def : {Def}");
            Console.WriteLine("----------------------------------");
        }
    }
}

 

추가 과제 2 - Monster 클래스 생성

새로운 cs 파일을 만들고, Monster 클래스를 생성
필드 혹은 프로퍼티
문자열 몹 이름
정수형 몹 체력
정수형 몹 공격력
정수형 몹 방어력
정수형 몹 레벨
생성자
기본 생성자: “Basic Monster"로 몬스터 이름을 설정하고, HP는 50, 공격력은 15, 방어력은 5, 레벨은 1로 설정
오버로딩 생성자: 이름, 체력, 공격력, 방어력, 레벨을 외부에서 세팅해 줄 수 있는 생성자도 하나 생성
메서드
TakeDamage
반환은 없음
받은 피해를 체력에서 차감, 방어력은 피해를 경감시키는 역할
예를 들어, 인자로 넘어온 데미지가 40이고 방어력이 5이면 35 뎀지 입음
AttackHero
반환은 없음
인자값으로 영웅 객체 hero 를 받아 몬스터가 영웅을 공격하도록 구현
hero 속 메서드 TakeDamage를 호출, 인자값으로 몹 공격력 넘겨줌
DisplayInfo
몬스터의 상태를 출력하는 함수
몬스터의 이름, 체력, 공격력, 방어력, 레벨을 출력

using System;

namespace MobileHero
{
    class Monster
    {
        public string Name { get; set; }
        public int HP { get; set; }
        public int Atk { get; set; }
        public int Def { get; set; }
        public int Level { get; set; }


        public Monster()
        {
            Name = "Basic Monster";
            HP = 50;
            Atk = 15;
            Def = 5;
            Level = 1;
        }

        public Monster(string inputName, int inputHP, int inputAtk, int inutDef, int inputLevel)
        {
            Name = inputName;
            HP = inputHP;
            Atk = inputAtk;
            Def = inutDef;
            Level = inputLevel;
        }


        public void TakeDamage(int damage)
        {
            int totalDam = damage - Def;
            if (totalDam > 0)
            {
                HP -= totalDam;
            }
        }

        public void AttackHero(Hero hero)
        {
            hero.TakeDamage(Atk);
        }

        public void DisplayInfo()
        {
            Console.WriteLine("----------------------------------");
            Console.WriteLine($"Mob Name : {Name}");
            Console.WriteLine($"HP : {HP}");
            Console.WriteLine($"Atk : {Atk}");
            Console.WriteLine($"Def : {Def}");
            Console.WriteLine("----------------------------------");
        }
    }
}

 

과제3 - 게임 테스트

메인으로 이동해서 다음을 작성 후 테스트
Hero 객체와 Monster 객체를 각각 하나씩 생성.
Hero는 기본 생성자로 호출해보고 Monster는 오버로딩된 생성자 호출하고 값은 적당히 체력 40, 공격력 14, 방어력 4, 레벨3 정도 세팅
Hero 객체는 AttackMob() 메서드를 사용하여 Monster 객체를 공격
Monster 객체는 AttackHero() 메서드를 사용하여 Hero 객체를 공격
각각의 공격 후 Hero와 Monster 객체의 상태를 출력하는 DisplayInfo 를 활용해서 현재 상태 확인하기

using System;

namespace MobileHero
{
    class Program
    {
        static void Main(string[] args)
        {
            Hero hero = new Hero("Kadan", 10000, 1000, 500);
            Monster mob1 = new Monster("Kamen", 1000, 950, 450, 999);

            hero.AttackMob(mob1);
            mob1.AttackHero(hero);

            hero.DisplayInfo();
            mob1.DisplayInfo();
        }
    }
}

 

심화과제

위에서 main문에 적힌 모든 코드 삭제. 메인문은 아래 코드만 적음

class Program
{
    static void Main(string[] args)
    {
        Game game = new Game();
        game.Play();
    }
}
  • Game이라는 클래스를 새로운 cs에 작성
  • Game 클래스는 맴버변수로 Hero 하나와 Monster 하나를 가짐
  • Game 클래스는 생성과 동시에 Hero 와 Monster에 각각 뉴할당을 함.
    • Hero 는 이름"Archer", 체력 100, 공격력 30, 방어력 5 로 세팅
    • Monster는 이름"Skeleton", 체력 50, 공격력 20, 방어력 5, 레벨은 1로 세팅
  • Game속에 Play라는 메서드 작성(반환X, 인자X)
    • 일단 게임이 시작되었다는 cw 출력
    • Game이 들고있는 영웅과 몹의 체력이 둘 다 0 이상이라면 무한 반복 시작
    • 무한 반복을 하며, 사용자에게 다음 행동을 물어봄csharp 다음 행동으로 무엇을 하시겠습니까? (1혹은2 입력 후 엔터) 1. 영웅이 몬스터를 공격 2. 몬스터가 영웅 공격
    • 만약 1번이 입력되었다면 영웅이 몹 공격하는 로직 실행
    • 2번이 입력되었다면 몹이 영웅 치는 로직 실행
    • 1,2 가 아닌 입력값 들어오면 제대로 다시 입력하라고 출력 후 다시 입력받음
    • 1 혹은 2가 정상 수행되었다면, 이후 영웅과 몹의 상태 보여주는 메서드 각각 실행
    • 만약 영웅 체력이 0 이하면 “영웅 사망으로 종료” 출력 후 무한루프 탈출
    • 만약 몹 체력이 0 이하면 “몹 사망으로 종료” 출력 후 무한루프 탈출
    • 위 내용을 구현하면서 만약 Hero나 Monster쪽에 추가로 필요한 메서드나 프로퍼티가 있다면 자유롭게 추가해보기(0 이하 처리 등등)
using System;

namespace MobileHero
{
    class Game
    {
        Hero hero = new Hero("Archer", 100, 30, 5);
        Monster mob = new Monster("Skeleton", 50, 20, 5, 1);
        public void Play()
        {
            Console.WriteLine("게임을 시작해보지");

            while (hero.HP > 0 && mob.HP > 0)
            {
                Console.WriteLine("다음 행동으로 무엇을 하시겠습니까?");
                Console.WriteLine("1. 영웅이 몬스터를 공격");
                Console.WriteLine("2. 몬스터가 영웅을 공격");

                ConsoleKeyInfo mKey = Console.ReadKey(true);
                switch (mKey.Key)
                {
                    case ConsoleKey.D1: hero.AttackMob(mob); break;
                    case ConsoleKey.D2: mob.AttackHero(hero); break;
                }

                hero.DisplayInfo();
                mob.DisplayInfo();

                if (hero.HP <= 0)
                {
                    Console.WriteLine("영웅 사망으로 종료");
                    break;
                }

                if (mob.HP <= 0)
                {
                    Console.WriteLine("몹 사망으로 종료");
                    break;
                }
            }
        }

    }
}

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

C# - 클래스와 구조체의 차이  (0) 2025.09.17
C# - 메모리와 가비지 컬렉터 (GC)  (0) 2025.09.17
C# - 생성자, 소멸자, 부분 클래스, 네임스페이스, 깊은 복사, 얕은 복사, 매개변수 한정자  (0) 2025.09.16
C# - 클래스 (Class) 생성 실습 문제 풀이  (0) 2025.09.15
C# - 클래스(Class) & 객체지향  (1) 2025.09.15
'C#' 카테고리의 다른 글
  • C# - 클래스와 구조체의 차이
  • C# - 메모리와 가비지 컬렉터 (GC)
  • C# - 생성자, 소멸자, 부분 클래스, 네임스페이스, 깊은 복사, 얕은 복사, 매개변수 한정자
  • C# - 클래스 (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)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바