"새로운 주제로 넘어갑시다. 이제 정적 변수와 메소드에 대해 논의하고 싶습니다."

"엘리야, 정적 변수와 메서드는 이미 배웠어. 하지만 좀 더 자세히 알고 싶어."

"클래스에서 변수를 선언할 때 이러한 변수가 한 번만 생성되는지 또는 클래스의 각 인스턴스(객체)에 자체 복사본이 있는지 정의합니다. 기본적으로 변수의 새 복사본은 각 객체에 대해 생성됩니다. . 이렇게 생겼습니다."

클래스 선언
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
기본 메서드 의 코드 :
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
화면출력
Oscar
Missy

"동일한 클래스(Cat)에서 선언되었음에도 불구하고 서로 다른 개체를 참조하기 때문에 변수 cat1.namecat2.name값이 다릅니다."
"말이 되네요."
"그러나 정적 변수의 복사본은 클래스의 모든 인스턴스에 대해 하나만 존재하며 클래스 이름을 사용하여 액세스해야 합니다."

클래스 선언
class Cat                   // Сlass
{
    String name;            // Instance (non-static) variable
    static int catCount;    // Static variable

    Cat(String name)
    {
        this.name = name;
        Cat.catCount++;   // Increment the static variable by 1
    }
}
기본 메서드의 코드:
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");

System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");

System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
화면 출력:
0
1
Oscar
Missy
2

"알았어, 그것도 말이 되는군."

"Java 메서드는 두 가지 범주로 나뉩니다. 인스턴스 메서드는 개체에서 호출되며 해당 개체의 데이터에 액세스할 수 있습니다. 정적 메서드 에는 개체 참조가 없기 때문에 해당 액세스 권한이 없습니다 . 그러나 다음을 참조할 수 있습니다. 클래스의 정적 변수 및 기타 정적 메서드.

정적 메서드는 비정적 메서드나 비정적 변수를 처리할 수 없습니다!"

"왜 그래, 엘리?"

"각 인스턴스 변수는 개체에 포함되어 있습니다. 해당 개체에 대한 참조가 있는 경우에만 액세스할 수 있습니다. 정적 메서드에는 이러한 참조가 없습니다."

"인스턴스 메소드에 그러한 참조가 있습니까?"

"예, 인스턴스 메서드에 간접적으로 전달됩니다. 인스턴스 메서드가 호출되는 개체에 대한 참조는 인스턴스 메서드에 간접적으로 전달됩니다. 이 참조를 저장하는 변수를 this 라고 합니다. 이를 통해 메서드는 항상 개체의 동일한 개체에서 다른 비정적 메서드를 호출하거나 데이터를 호출합니다.

개체 참조 대신 null이 정적 메서드에 전달됩니다. 그렇기 때문에 비정적 변수 및 메서드를 처리할 수 없습니다. 단순히 이러한 변수 및 메서드와 연결된 개체에 대한 참조가 없습니다."

"좋아, 엘리, 이해해."

"비정적 메서드가 작동하는 방식은 다음과 같습니다.

코드의 모양
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
실제로 일어나는 일
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
<object> dot <method name>을 사용하여 메서드를 호출하면 실제로 클래스 메서드를 호출하고 동일한 개체를 첫 번째 인수로 전달하는 것입니다. 메서드 내에서 객체는 'this' 입니다 . 메서드의 모든 작업은 이 개체와 해당 데이터에 대해 수행됩니다."

"정적 메서드가 작동하는 방식은 다음과 같습니다.

코드의 모양
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
실제로 일어나는 일
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
정적 메서드를 호출하면 개체가 전달되지 않습니다. 즉, 'this'는 null 과 같습니다 . 그렇기 때문에 정적 메소드는 비정적 변수 및 메소드에 액세스할 수 없습니다(비정적 메소드에 암시적으로 전달할 것이 없기 때문입니다)."

"변수나 메서드 앞에 static 키워드가 있으면 정적입니다."

"그렇게 엄격하게 제한된다면 왜 그러한 방법이 필요한가요?"

"글쎄요, 그런 방법에는 장점이 있습니다."

"첫째, 정적 메서드와 변수를 사용하기 위해 객체 참조를 전달할 필요가 없습니다. "

"둘째, 변수의 복사본이 하나만 있어야 하는 경우가 있습니다. 예를 들어 System.out(System 클래스의 정적 출력 변수)이 있습니다."

"셋째, 개체를 생성하기 전에 메서드를 호출해야 하는 경우가 있습니다."

"엘리, 나에게 이것의 예를 들어 줄 수 있니?"

"왜 main() 메서드가 정적이라고 생각하십니까 ? 정적이므로 프로그래머는 클래스를 메모리에 로드한 후 객체가 생성되기 전에 즉시 호출할 수 있습니다."