Compiler Error CS0120

강성원·2023년 11월 28일
0

C# 끄적끄적

목록 보기
2/11

비정적 필드, 메서드 또는 속성 'member'에 개체 참조가 필요합니다.

비정적 필드, 메서드 또는 속성을 사용하려면 개체 인스턴스를 먼저 만들어야 합니다. 정적 메서드에 대한 자세한 내용은 정적 클래스 및 정적 클래스 멤버를 참조하세요. 클래스 인스턴스를 만드는 방법에 대한 자세한 내용은 인스턴스 생성자를 참조하세요.

non-static field 메서드를 호출해서 생기는 오류

문서에 나온 오류를 일으키는 예시 코드들로 공부하자.

1. 비정적 멤버를 객체 생성 없이 사용한 경우

// CS0120_1.cs
public class MyClass
{
    // Non-static field.
    public int i;
    // Non-static method.
    public void f() {}
    // Non-static property.
    int Prop
    {
        get
        {
            return 1;
        }
    }

    public static void Main()
    {
        i = 10;   // CS0120
        f();   // CS0120
        int p = Prop;   // CS0120
    }
}

보면 클래스의 멤버들이 정적 멤버도 아닌데다, 밑에 Main()메서드에서 객체의 생성이 없이 멤버를 사용해서 생긴 오류이다.

// CS0120_1.cs
public class MyClass
{
    // Non-static field.
    public int i;
    // Non-static method.
    public void f() { }
    // Non-static property.
    int Prop
    {
        get
        {
            return 1;
        }
    }

    public static void Main()
    {
        var mc = new MyClass();
        mc.i = 10;
        mc.f();
        int p = mc.Prop;
    }
}

Main()메서드의 내용처럼 클래스의 인스턴스를 생성한 후에 멤버에 접근해야한다.

2. 정적 메서드에서 비정적 메서드 호출한 경우

// CS0120_3.cs
using System;

public class MyClass
{
   public static void Main()
   {
      DoIt("Hello There");   // CS0120
   }
  
   private void DoIt(string sText)
   {
      Console.WriteLine(sText);
   }
}

정적 메서드에서는 아직 실체가 존재하지 않는 비정적 메서드를 호출할 수 없다.

// CS0120_3.cs
using System;

public class MyClass
{
   public static void Main()
   {
      DoIt("Hello There");   // CS0120
   }
  
   private static void DoIt(string sText)
   {
      Console.WriteLine(sText);
   }
}

메서드 DoIt에 static 키워드를 붙여주자

3. 정적 메서드에서 인스턴스를 통하지 않은 메서드 호출한 경우

// CS0120_2.cs
// CS0120 expected
using System;

public class MyClass
{
    public static void Main()  
    {  
        TestCall();   // CS0120
   }

   public void TestCall()
   {
   }
}

2번과 같은 내용이지만 관점을 좀 다르게 하면 다른 문제로 보인다.
정적 메서드에서 인스턴스를 통한 메서드의 호출을 하지 않은 것이다.

// CS0120_2.cs
using System;

public class MyClass
{
    public static void Main()
    {
        var anInstanceofMyClass = new MyClass();
        anInstanceofMyClass.TestCall();
    }

    public void TestCall()
    {
    }
}

Main함수에서 클래스의 인스턴스를 생성해주고 메서드를 호출해준다.




C#에서는 이런 것까지 미리 잡아준다니..

공식문서의 예제 코드 2번과 3번이 바뀐 느낌이라서 내 글에서는 둘이 순서를 바꿔주었다.. 맞겠지?

레퍼런스 : ms 공식 문서

profile
개발은삼순이발

0개의 댓글