인프런 커뮤니티 질문&답변

YuCheol Chae님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

생성자

생성자를 생성하고 하고 그원본에 그값을 적용 시켜서 호출할때마다 값을 감소 시키고 싶어요

작성

·

238

1

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace CSharp
{
    //참조 Ref
    class Naruto
    {
        //붕어빵 재료
        //속성은 데이터로 기능은 함수로 표현
        public int HP;  //속성 
        public int Chakra;
        public int Nine_Tailed_Fox_Chakra;
        public Naruto() //생성자 
        {
            HP = 100;
            Chakra = 10;
            Nine_Tailed_Fox_Chakra = 1000;
        }

        public Naruto(int Chakra, int FoxChakra) : this()
        {
            this.Chakra -= Chakra;
            this.Nine_Tailed_Fox_Chakra -= FoxChakra;
        }
        
    }

    class Class2
    {
        static void AlterEgo()
        {
            Console.Clear();
            while (true)
            {
                
                string Ninja_Technique;
                Naruto NarutoAE = new Naruto(1, 30);
                Console.WriteLine("나루토 분신 생성\n");
                Console.WriteLine("나루토 본체 정보");
                Console.WriteLine($"체력: {NarutoAE.HP}\n차크라: {NarutoAE.Chakra}\n구미호차크라:{NarutoAE.Nine_Tailed_Fox_Chakra}\n\n");
                Console.WriteLine("[1]그림자 분신술");
                Console.WriteLine("[2]분신술 해제");
                Ninja_Technique = Console.ReadLine();
                if(Ninja_Technique == "1")
                {
                    AlterEgo();
                }
                else if(Ninja_Technique == "2")
                {
                    break; 
                }
            }
        }
        static void Main(string[] args)
        {
                    
            Naruto Naruto_Origenal = new Naruto();
            while (true)
            {
                Console.Clear();
                string Ninja_Technique;
                Console.WriteLine("나루토 본체\n");
                Console.WriteLine($"체력: {Naruto_Origenal.HP}\n 차크라: {Naruto_Origenal.Chakra}\n 구미호차크라:{Naruto_Origenal.Nine_Tailed_Fox_Chakra}\n");
                Console.WriteLine("[1]그림자 분신술");
                Ninja_Technique = Console.ReadLine();
                Console.Clear();
                if (Ninja_Technique == "1")
                {
                    AlterEgo();
                }
                
            }

        }
    }
}

답변 3

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

아무리 클래스가 참조값이라 해도,
생성자를 이용해서 새로 new를 하면 기존과 무관한 새로운 객체가 만들어집니다.
(즉, 기존의 나루토가 아닌 새로운 나루토가 만들어지게 됩니다.)

Naruto NarutoAE = new Naruto(1, 30);
이 부분은 정말 다른 원본 나루토이지만,
차크라가 더 적은 불량품을 만든 셈이 되겠네요.

말씀하신대로 본체의 차크라를 깎고 싶다면
생성자로 접근해서는 안 되고
다른 함수 (ex. SetChakra(int chakra))를 사용하거나
Chakra를 직접 세팅을 해야 합니다 (ex. NarutoAE.Chakra -= 10 )

[분신술 해제 시 원래 차크라로 돌아간다]는 사양은
의외로 실제로도 구현할 일이 생길법한 사양인데,
그 이유는 흔히 RPG에서 Hp와 MaxHp의 관계와 유사하기 때문입니다.
(ex. 최고급 포션을 먹으면 초기의 풀 Hp로 세팅해주세요! 라거나)
결국 분신술을 쓰기 전의 초기값을 다른 변수 (ex. InitChakra, MaxChakra) 등으로 따로 저장하고 있다가,
분신술을 해제할 경우 Chakra를 InitChakra로 되돌리는 방식으로 구현을 하시면 되겠습니다

0

YuCheol Chae님의 프로필 이미지
YuCheol Chae
질문자

아 그러면 결국은 생성자는 생성자로써만 이해하고 기능은 함수로 구성하는게 속편하겠네요 ^^

0

YuCheol Chae님의 프로필 이미지
YuCheol Chae
질문자

생성자를 이용해서 나루토 그림자 분신술 시도 할때마다 차크라를 감소 시키고 분신술 해제 할때 원래 차크라로 돌아가는 그런 간단한 방식을 구현 할 수 있겠다 했지만 음 생성자 원본값을 건드리는 방법이 없을까요?