"새로운 주제로 넘어갑시다. 이제 정적 변수와 메소드에 대해 논의하고 싶습니다."
"엘리야, 정적 변수와 메서드는 이미 배웠어. 하지만 좀 더 자세히 알고 싶어."
"클래스에서 변수를 선언할 때 이러한 변수가 한 번만 생성되는지 또는 클래스의 각 인스턴스(객체)에 자체 복사본이 있는지 정의합니다. 기본적으로 변수의 새 복사본은 각 객체에 대해 생성됩니다. . 이렇게 생겼습니다."
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.name
와 cat2.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이 정적 메서드에 전달됩니다. 그렇기 때문에 비정적 변수 및 메서드를 처리할 수 없습니다. 단순히 이러한 변수 및 메서드와 연결된 개체에 대한 참조가 없습니다."
"좋아, 엘리, 이해해."
"비정적 메서드가 작동하는 방식은 다음과 같습니다.
코드의 모양
|
실제로 일어나는 일
|
<object> dot <method name>을 사용하여 메서드를 호출하면 실제로 클래스 메서드를 호출하고 동일한 개체를 첫 번째 인수로 전달하는 것입니다. 메서드 내에서 객체는 'this' 입니다 . 메서드의 모든 작업은 이 개체와 해당 데이터에 대해 수행됩니다." |
"정적 메서드가 작동하는 방식은 다음과 같습니다.
코드의 모양
|
실제로 일어나는 일
|
정적 메서드를 호출하면 개체가 전달되지 않습니다. 즉, 'this'는 null 과 같습니다 . 그렇기 때문에 정적 메소드는 비정적 변수 및 메소드에 액세스할 수 없습니다(비정적 메소드에 암시적으로 전달할 것이 없기 때문입니다)." |
"변수나 메서드 앞에 static 키워드가 있으면 정적입니다."
"그렇게 엄격하게 제한된다면 왜 그러한 방법이 필요한가요?"
"글쎄요, 그런 방법에는 장점이 있습니다."
"첫째, 정적 메서드와 변수를 사용하기 위해 객체 참조를 전달할 필요가 없습니다. "
"둘째, 변수의 복사본이 하나만 있어야 하는 경우가 있습니다. 예를 들어 System.out(System 클래스의 정적 출력 변수)이 있습니다."
"셋째, 개체를 생성하기 전에 메서드를 호출해야 하는 경우가 있습니다."
"엘리, 나에게 이것의 예를 들어 줄 수 있니?"
"왜 main() 메서드가 정적이라고 생각하십니까 ? 정적이므로 프로그래머는 클래스를 메모리에 로드한 후 객체가 생성되기 전에 즉시 호출할 수 있습니다."