1. 정적 메서드

정적 변수 외에도 클래스에는 정적 메서드도 있을 수 있습니다.

일반 메소드는 클래스의 객체(인스턴스)에 바인딩되며 클래스의 일반(비정적) 변수( 정적 변수 및 메소드 포함 )를 참조할 수 있습니다. 정적 메서드는 클래스의 정적 개체에 바인딩되며 클래스의 정적 변수 및/또는 기타 정적 메서드에만 액세스할 수 있습니다.

클래스에서 일반(비정적) 메서드를 호출하려면 먼저 클래스의 개체를 만든 다음 개체에서 메서드를 호출해야 합니다. 개체가 아닌 클래스에서 일반 메서드를 호출할 수 없습니다.

예:

클래스에서 비정적 메서드를 호출할 수 없습니다!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

그러나 정적 메서드를 호출하려면 클래스의 정적 개체가 단순히 존재하는 것으로 충분합니다(그리고 클래스가 메모리에 로드된 후에 항상 존재함). 이것이 main() 메서드가 정적인 이유입니다. 클래스의 정적 개체에 바인딩되어 있으므로 호출하기 위해 개체를 만들 필요가 없습니다.

메서드를 정적으로 선언하려면 메서드 헤더 앞에 static 키워드를 작성해야 합니다. 이 구성의 일반적인 모양은 다음과 같습니다.

static Type name(parameters)
{
   method code
}

예:

암호 메모
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


Java 머신은 main다음과 같은 명령으로 메소드를 호출합니다. Solution.main();



정적 test()메서드는 정적 main()메서드에서 호출됩니다.

다른 클래스에서 정적 메서드를 호출하려면 정적 메서드 이름 앞에 클래스 이름을 지정해야 합니다. 이 구성의 일반적인 모양은 다음과 같습니다.

Type name = ClassName.methodName(arguments)

예:

암호 정적 방법
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. 정적 대 일반(비정적) 방법

정적 메서드와 일반 메서드의 차이점은 무엇입니까?

일반 메서드는 일반 개체(클래스의 인스턴스)에 바인딩되지만 정적 메서드는 그렇지 않습니다. 일반 메서드는 인스턴스의 변수에 액세스할 수 있지만 정적 메서드는 액세스할 수 없습니다. 연결된 인스턴스가 없기 때문입니다.

두 가지 방법 유형 간의 차이점은 다음 표에 나와 있습니다.

능력/재산 일반적인 방법 정적 방법
클래스의 인스턴스에 바인딩됨 아니요
클래스의 일반적인 메서드를 호출할 수 있습니다. 아니요
클래스의 정적 메서드를 호출할 수 있습니다.
클래스의 일반 변수에 액세스할 수 있습니다. 아니요
클래스의 정적 변수에 액세스할 수 있습니다.
객체에서 호출 가능
클래스 호출 가능 아니요

그러한 방법이 매우 제한적이라면 왜 그러한 방법이 필요합니까? 답은 이 접근 방식에도 장점이 있다는 것입니다.

첫째, 정적 메서드 및 변수에 액세스하기 위해 개체 참조를 전달할 필요가 없습니다.

둘째, 때로는 변수의 단일 인스턴스만 있어야 합니다. 예를 들어, System.out( System 클래스의 정적 출력 변수 ).

셋째, 객체를 생성하기 전에 메서드를 호출해야 하는 경우가 있습니다. 예를 들어 자바 머신은 클래스의 인스턴스가 생성되기 전에도 프로그램 실행을 시작하기 위해 main() 메서드를 호출합니다.

클래스의 인스턴스에 바인딩됨

일반 메서드가 호출되면 인수( 메서드가 호출되는 개체 )가 암시적으로 전달됩니다. 이 매개변수를 이라고 합니다 this. 이 암시적 매개변수(메서드가 호출되는 개체에 대한 참조)는 일반적인 메서드와 정적 메서드를 구별합니다.

정적 메서드에는 이 암시적 매개 변수가 없으므로 this정적 메서드 내에서 키워드를 사용할 수 없으며 정적 메서드 내에서 비정적 메서드를 호출할 수 없습니다. 클래스의 인스턴스에 대한 참조를 얻을 수 있는 곳이 없습니다.

클래스의 일반적인 메서드를 호출할 수 있습니다.

일반 메서드에는 항상 암시적 this매개 변수가 있으므로 메서드가 호출되는 개체에 대한 참조가 항상 있습니다. 다른 일반 메서드 내에서 일반 메서드를 호출할 때마다 암시적 this매개 변수를 사용하여 해당 호출을 수행합니다. 예

암호 작동 방식
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

그렇기 때문에 정적 메서드에서 일반 메서드를 호출할 수 없습니다. this정적 메서드 내부에 명명된 암시적 변수는 없습니다 .

또는 다른 상황을 상상해보십시오. 우리 클래스의 단일 객체가 아직 프로그램에서 생성되지 않았습니다. 클래스의 정적 메서드를 호출할 수 있습니까? 예. 그리고 이 정적 메소드가 일반(비정적) 메소드를 호출할 수 있습니까?

글쎄, 우리는 그것을 어떤 객체에 부를까요? 결국 우리 클래스의 단일 인스턴스가 아직 존재하지 않습니다!

클래스의 정적 메서드를 호출할 수 있습니다.

정적 메서드는 프로그램의 어느 위치에서나 호출할 수 있습니다. 이는 정적 메서드와 일반 메서드 모두에서 호출할 수 있음을 의미합니다. 여기에는 제한이 없습니다.

클래스의 일반 변수에 액세스할 수 있습니다.

암시적 매개 변수를 통해 클래스의 인스턴스에 대한 참조를 쉽게 얻을 수 있으므로 일반 메서드에서 클래스의 일반 변수에 액세스할 수 있습니다 this.

정적 메서드는 일반 변수의 값을 가져오는 데 사용해야 하는 클래스의 인스턴스를 알지 못합니다. 그리고 보다 일반적으로 정적 메서드가 호출되었지만 프로그램에서 클래스의 단일 인스턴스가 아직 생성되지 않은 상황을 쉽게 가질 수 있습니다.

결과적으로 정적 메서드는 클래스의 일반 변수에 액세스할 수 없습니다.

정적 메서드가 일반 메서드를 호출한다고 가정합니다. 그 일반적인 메서드는 어떤 개체에서 호출해야 합니까?

정적 메서드

아무도 몰라! 그렇기 때문에 객체에 대한 참조를 전달하지 않고 정적 메서드에서 일반 메서드를 호출 할 수 없습니다 !

클래스의 정적 변수에 액세스할 수 있습니다.

정적 변수 호출 상황은 정적 메서드 호출 상황과 동일합니다. 정적 변수는 프로그램의 어디에서나 액세스할 수 있습니다. 즉, 정적 및 일반 메서드에서 액세스할 수 있습니다.

객체에서 호출 가능

정적 메서드와 일반 메서드 모두 개체에서 호출할 수 있습니다. 일반적인 메서드 호출이 가능합니다. 실제로 이것이 일반적인 메서드를 호출하는 유일한 방법입니다. 객체에서 정적 메서드를 호출할 수도 있습니다. 이 경우 컴파일러 자체에서 변수의 유형을 결정하고 해당 유형에 따라 정적 메서드를 호출합니다.

암호 컴파일러가 보는 방식
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

클래스 호출 가능

클래스에서 정적 메서드만 호출할 수 있습니다. 일반적인 메서드를 호출하려면 클래스의 인스턴스에 대한 참조가 필요합니다. 따라서 다음 구성을 사용하여 일반적인 메서드를 호출할 수 없습니다.ClassName.methodName(arguments)