비정적 필드, 메서드 또는 속성 'member'에 개체 참조가 필요합니다.
비정적 필드, 메서드 또는 속성을 사용하려면 개체 인스턴스를 먼저 만들어야 합니다. 정적 메서드에 대한 자세한 내용은 정적 클래스 및 정적 클래스 멤버를 참조하세요. 클래스 인스턴스를 만드는 방법에 대한 자세한 내용은 인스턴스 생성자를 참조하세요.
non-static field 메서드를 호출해서 생기는 오류
문서에 나온 오류를 일으키는 예시 코드들로 공부하자.
// 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()메서드의 내용처럼 클래스의 인스턴스를 생성한 후에 멤버에 접근해야한다.
// 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 키워드를 붙여주자
// 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 공식 문서