HOWTO · Java

오류: Java의 정적 컨텍스트에서 비정적 변수 수를 참조할 수 없음

이 자습서에서는 다음 오류를 보여 줍니다. 비정적 변수 개수는 Java의 정적 컨텍스트에서 참조할 수 없습니다.

이 페이지의 내용

이 자습서에서는 Java의 오류: 비정적 변수 수를 정적 컨텍스트에서 참조할 수 없습니다를 보여 줍니다.

Java의 오류: 정적 컨텍스트에서 비정적 변수 수를 참조할 수 없습니다

대부분의 경우 main() 메소드가 정적이고 자동으로 호출됩니다. main() 메소드를 호출하기 위해 객체를 생성할 필요가 없습니다.

오류: 정적 컨텍스트에서 비정적 변수 수를 참조할 수 없음을 이해하려면 먼저 정적 및 비정적 메소드의 개념을 이해해야 합니다.

정적 메서드

정적 메서드는 클래스에 속하지만 해당 클래스의 인스턴스에는 속하지 않습니다. 정적 메서드는 클래스의 인스턴스나 개체 없이 호출됩니다.

정적 메서드는 정적 변수와 해당 클래스 및 기타 클래스의 정적 메서드의 다른 멤버에만 액세스할 수 있습니다. 정적 메서드는 클래스의 비정적 멤버에 액세스할 수 없습니다.

비정적 방법

Static 키워드를 포함하지 않는 모든 메서드는 비정적 메서드입니다. 비정적 메서드는 정적 및 비정적 변수와 동일한 클래스 또는 다른 클래스의 멤버에 액세스할 수 있습니다.

비정적 메서드는 정적 데이터의 값을 변경할 수도 있습니다.

Java의 정적 및 비정적 메서드의 예

정적 메서드와 비정적 메서드를 보여 주는 예제를 살펴보겠습니다.

package delftstack;

class DelftstackDemo {
  // non-static variable
  int Demo;

  // Static method
  public static void increment() {
    // Using a Non-Static Variable in Static Method. Error
    Demo++;
  }
}

public class Example {
  // Static Main method
  public static void main(String args[]) {
    DelftstackDemo Demo1 = new DelftstackDemo();
    DelftstackDemo Demo2 = new DelftstackDemo();
    DelftstackDemo Demo3 = new DelftstackDemo();

    Demo1.Demo = 7;
    Demo2.Demo = 8;
    Demo3.Demo = 9;

    // Calling the method
    DelftstackDemo.increment();

    System.out.println(Demo1.Demo);
    System.out.println(Demo2.Demo);
    System.out.println(Demo3.Demo);
  }
}

위의 코드에는 두 개의 클래스가 있습니다. 첫 번째 클래스에서 코드는 정적 메서드의 비정적 멤버 변수를 사용하고 두 번째 클래스는 기본 메서드의 인스턴스에서 비정적 멤버의 값을 변경하려고 시도합니다.

코드에서 오류가 발생합니다.

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
	Cannot make a static reference to the non-static field Demo

	at delftstack.DelftstackDemo.increment(Example.java:12)
	at delftstack.Example.main(Example.java:29)

위의 코드는 정적 메서드에서 비정적 멤버인 Demo를 사용하기 때문에 오류가 발생합니다. increment 메서드를 비정적으로 변경하고 첫 번째 클래스 인스턴스로 호출하면 문제가 해결됩니다.

해결 방법 보기:

package delftstack;

class DelftstackDemo {
  // non-static variable
  int Demo;

  // change to a non-static method
  public void increment() {
    // No error
    Demo++;
  }
}

public class Example {
  // Static Main method
  public static void main(String args[]) {
    DelftstackDemo Demo1 = new DelftstackDemo();
    DelftstackDemo Demo2 = new DelftstackDemo();
    DelftstackDemo Demo3 = new DelftstackDemo();

    Demo1.Demo = 7;
    Demo2.Demo = 8;
    Demo3.Demo = 9;

    // Calling the method
    Demo1.increment();

    System.out.println(Demo1.Demo);
    System.out.println(Demo2.Demo);
    System.out.println(Demo3.Demo);
  }
}

이제 비정적 메서드에서 비정적 멤버를 사용하고 첫 번째 클래스의 인스턴스에 의해 비정적 메서드를 기본 정적 메서드로 호출합니다. 그것은 문제를 해결합니다.

출력 참조:

8
8
9