챗지피티와 함께하는 오류 해결 모음
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)를 쓸 계획이 있다면 그냥 두셔도 됩니다.
'내일배움캠프 Unity 9기 > TIL' 카테고리의 다른 글
[Unity/TIL] - new로 생성한 객체는 클래스와 동기화 되나요? (1) | 2025.04.23 |
---|---|
[Unity/TIL] - static (0) | 2025.04.22 |
[Unity/TIL] - Top-level statements (최상위 문) / namespace(네임스페이스) (0) | 2025.04.16 |
[Unity/TIL] - 네이밍규칙(코딩스탠다드) (0) | 2025.04.15 |
[Unity/TIL] - C# 기본문법 (0) | 2025.04.14 |