[TIL_35] feat. int vs long 자료형 차이로 일어나는 사소한 오류

H·2024년 2월 9일
0
post-custom-banner

은행 ATM 시스템을 만들려고 하는데

초기에 TMP로 이렇게 세팅하고 51조가 들어간 계좌를 만들려고 한다.
그리고 게임매니저를 통해서 저 초기 세팅값의 숫자를 바꾸려고 했다.

그래서

using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using UnityEngine;

[System.Serializable]
public class UserData 
{
    public string Name;
    public int Balance;
    public int Cash;

    public UserData(string name, int balance, int cash)
    {
        Name = name;
        Balance = balance;
        Cash = cash;
    }

    public bool Deposit (int money)
    {
        if (Cash < money)
            return false;

        Cash -= money;
        Balance += money;

        return true;
      
    }

    public bool Withdraw(int money)
    {
        if(Balance < money) return false;  

        Cash+= money;
        Balance -= money;

        return true;
    }


}

이 코드를 이용해서

게임매니저에 유저 데이터를 입력받을 수 있는 창을 만들고
Name과 cash 만 조금 다르게 적었다.
Name은 끝에 ~ 추가
cash는 5만 추가
Balance는 그대로 51조

그런데?

플레이를 해보면 다른것은 다 적용이 되는데
Balance가 2147483647로 자동으로 고정이 되었다.

이게 뭘까 왜그럴까 생각해보다가 저 고정되는 숫자가 뭔가 특이한데? 왜 저 숫자로 고정되지? 아 가장 높은 숫자의 끝이 있나? 생각하다가
갑자기 떠오른 자료형!

그렇다 int의 가장큰 수는2147483647 였다.

그래서 내가 원하는 51조를 넣기위해서 코드에서 int로 받은녀석을 long으로 바꿔야 한다!

바꾼 코드

using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using UnityEngine;

[System.Serializable]
public class UserData 
{
    public string Name;
    public long Balance;
    public int Cash;

    public UserData(string name, long balance, int cash)
    {
        Name = name;
        Balance = balance;
        Cash = cash;
    }

    public bool Deposit (int money)
    {
        if (Cash < money)
            return false;

        Cash -= money;
        Balance += money;

        return true;
      
    }

    public bool Withdraw(int money)
    {
        if(Balance < money) return false;  

        Cash+= money;
        Balance -= money;

        return true;
    }


}

다음과 같이 잘 바뀌는 것을 확인 할 수 있다.

그런데 생각해 보니 Balance에서 몇십억 이상을 출금 할때
현금으로 나타나져 있는 부분에서 제대로 나오게 처리하려면 Balance, cash 모두 long으로 받아야 될것 같아서

using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using UnityEngine;

[System.Serializable]
public class UserData 
{
    public string Name;
    public long Balance;
    public long Cash;

    public UserData(string name, long balance, long cash)
    {
        Name = name;
        Balance = balance;
        Cash = cash;
    }

    public bool Deposit (long money)
    {
        if (Cash < money)
            return false;

        Cash -= money;
        Balance += money;

        return true;
      
    }

    public bool Withdraw(long money)
    {
        if(Balance < money) return false;  

        Cash+= money;
        Balance -= money;

        return true;
    }


}

long으로 변경

그런데


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;


public class PopupBank : MonoBehaviour
{
    [SerializeField] private TMP_Text userName;
    [SerializeField] private TMP_Text balance;
    [SerializeField] private TMP_Text cash;
    [SerializeField] private GameObject PopupError;

    private void Start()
    {
        GameManager.Instance.LoadUserData("I'm 신뢰에요~");

        Refresh();
    }

    public void Deposit(int money)
    {
        if (!GameManager.Instance.User.Deposit(money))
        {
            PopupError.SetActive(true);
            return;
        }
        GameManager.Instance.SaveUserData();

        Refresh();
    }

    public void Withdraw(int money)
    {
        if (!GameManager.Instance.User.Withdraw(money))
        {
            PopupError.SetActive(true);
            return;
        }

        GameManager.Instance.SaveUserData();
        Refresh();
    }

    public void CustomDeposit(TMP_InputField inputField)
    {
        Deposit(int.Parse(inputField.text));
    }

    public void CustomWithdraw(TMP_InputField inputField)
    {
        Withdraw(int.Parse(inputField.text));
    }

    private void Refresh()
    {
        userName.text = GameManager.Instance.User.Name;
        balance.text = GameManager.Instance.User.Balance.ToString();
        cash.text = GameManager.Instance.User.Cash.ToString();
    }

    // 숫자를 쉼표로 구분된 형식으로 변환하는 함수
    private string FormatNumber(long number)
    {
        return string.Format("{0:#,##0}", number);
    }

}

여기에 있는 money를 int로 받으면 유니티에서 button이 작동을 안함.. 왜 안하나 봤더니 인스펙터 창에서 withdraw와 deposit을 받는 function이 나오질 않음.

왜 그런지 시간을 두면서 알아봐야 될듯..

profile
IT 서비스 구현 및 게임에 관심이 많습니다.
post-custom-banner

0개의 댓글