내일배움캠프 Unity 9기/TIL

[Unity/TIL] - 오류해결모음

song-ssi 2025. 4. 18. 10:27

챗지피티와 함께하는 오류 해결 모음

 

1. 오류

public Character()
{
    public string name = "";
    ...
} // ❌

클래스의 필드(변수)는 클래스 본문에서 선언하고, 생성자 안에서는 초기화만 해야 돼.

 

1. 해결

class Character
{
    public string name;
    public string job;
    public int level;
    public int attack;
    public int defense;
    public int hp;
    public int gold;

    public Character()
    {
        name = "";
        job = "";
        level = 1;
        attack = 5;
        defense = 10;
        hp = 300;
        gold = 1000;
    }
}

 

 

 

2. 오류

public void Main() // ❌

C# 프로그램의 진입점인 Main()은 반드시 static 이어야 해!

 

2. 해결

public static void Main()

 

 

 

3. 궁금증

public Character(string name, string job){

왜 매개변수로 name이랑 job만 받을까?

 

3. 해결

이름과 직업은 "플레이어가 정하는 값 이기 때문.

즉, 이 둘은 게임 시작할 때 외부에서 받아와야 해

level, gold 같은 건 게임 시작할 때 항상 같은 값이니까!

 

 

 

4. 오류

cs0120

"An object reference is required for the non-static field, method, or property 'TextRPG.Waiting()'"

TextRPG.Waiting() 이라고 호출했는데, Waiting()은 static이 아닌 메서드라서 객체 없이 부를 수 없다!

 

 

class TextRPG
{
    public void Waiting() {
        Console.WriteLine("아무 키나 누르세요...");
    }

    public static void Main()
    {
        Waiting();  // ❌ 오류! → static 메서드에서 일반 메서드 직접 호출 불가
    }
}

이때 위처럼 static 메서드 (Main)에서 non-static 메서드 (Waiting)를 호출하면
바로 이 에러가 발생해

 

3. 해결

Waiting()을 static으로 바꾸기

public static void Waiting()
{
    Console.WriteLine("아무 키나 누르세요...");
    Console.ReadKey();
}

public static void Main()
{
    Waiting(); // ✅ OK
}

그럼 Main()에서 이렇게 호출 가능:

 

또는 객체생성해서 불러오기

public void Waiting()
{
    Console.WriteLine("아무 키나 누르세요...");
    Console.ReadKey();
}

public static void Main()
{
    TextRPG game = new TextRPG(); // 객체 생성
    game.Waiting();               // ✅ 객체를 통해 호출
}
게임 전체 흐름 관리용 클래스 메서드 객체 생성 후 사용 (game.Waiting())
단순 유틸리티 함수 (ex: 기다림, 랜덤 생성 등) static으로 선언

 

 

 

5. 오류

"같은 이름의 지역 변수 vs 필드 변수" 충돌

class TextRPG
{
    Character player;  // ✅ 필드

    public static void Main()
    {
        Character player = new Character("홍길동", "전사"); // ❌ 지역 변수로 다시 선언!
        // 이건 위의 필드랑 완전 다른 '지역 player'
    }

    void StatusWindow()
    {
        Console.WriteLine(player.name);  // ❗ null 에러 or 접근 불가
    }
}

Character player;를 필드로 선언했는데, Main()에서 같은 이름의 지역 변수를 또 만들어버렸기 때문에 생기는 충돌이야.

 

 

5.해결

둘 중 하나를 없애.

필드를 남기고

Main()이 아닌 다른 함수에 player=new Character(매개변수) 넣어서 생성해주기

(Main()에 하면 static이라 코드 꼬일 수 있으니 다른 함수에 해주는게 좋음) 

 

 

6. 경고

Run 밑에있는 점 세개. 이게 뭐지? 작동은 잘 되는데....

 

CA1822

Member 'Run' does not access instance data and can be marked as static

Run이라는 메서드(함수)가 **인스턴스의 데이터(필드, 속성, 메서드 등)**를 전혀 사용하지 않고 있다는 뜻이에요. 즉, 그 메서드는 굳이 객체를 생성하지 않아도 실행할 수 있다. "이 메서드는 객체랑 상관없으니까 static으로 바꾸면 더 깔끔할 것 같아!"

 

 

6. 해결

오류는 아니고 경고라고 한다.

안 고쳐도 됨.

또는

public static void Run()으로 고치기.

 

 

  • 반드시 고쳐야 하는 건 아니에요.
  • 다만, 정적(static)으로 바꾸면 코드가 더 명확해지고, 성능도 미세하게 좋아질 수 있어요.
  • 만약 나중에 인스턴스 데이터(예: this.name)를 쓸 계획이 있다면 그냥 두셔도 됩니다.