"교수님은 틀에서 벗어나지 못하십니다. 강의에 익숙한 옛 선생들은 항상 이렇습니다. 책에서 찾을 수 없는 것을 그가 알려줄 수 있는 것은 없습니다. 수영은 말로만 배우는 것이 아닙니다 . 수영강의까지요. 강의는 주제에 대해 잘 알고 있고 교수만큼 많이 알고 있을 때만 유용합니다."

"그래도 그의 교훈은 유용합니다."

"네. 내 말은, 우리는 그들이 그러기를 바랍니다. 당신이 듣는 주제에 대해 더 많은 관점을 가질수록 진실에 더 가까워질 것입니다. 당신이 한 가지만 들었을 때, 당신이 할 수 있는 일은 그것을 믿거나 믿지 않는 것입니다. 좋아요, 갑시다. 다시 사업을 시작하십시오."

"예전에 보여드렸던 사진을 봅시다."

┏
┃public class Variables
┃┏
┃┃{
┃┃   private static String TEXT = "The end.";
┃┃  ┗━━━━━━━━━━━━━━━━━━━┛
┃┃   public static void main (String[] args)
┃┃ ┏                         ┗━━━━━━━┛
┃┃ ┃ {
┃┃ ┃    System.out.println("Hi");
┃┃ ┃    String s = "Hi!";
┃┃ ┃  ┏┗━━━━┛
┃┃ ┃  ┃ System.out.println(s);
┃┃ ┃  ┃ if (args != NULL)
┃┃ ┃  ┃ {
┃┃ ┃  ┃    String s2 = s;
┃┃ ┃  ┃   ┗━━━━┛
┃┃ ┃  ┃  ┏
┃┃ ┃  ┃  ┃ System.out.println(s2);
┃┃ ┃  ┃  ┗
┃┃ ┃  ┃ }
┃┃ ┃  ┃ Variables variables = new Variables();
┃┃ ┃  ┃ System.out.println(variables.instanceVariable);
┃┃ ┃  ┃ System.out.println(TEXT);
┃┃ ┃  ┗
┃┃ ┃ }
┃┃ ┗
┃┃   public String instanceVariable;
┃┃  ┗━━━━━━━━━━━━━━━┛
┃┃   public Variables()
┃┃   {
┃┃      instanceVariable = "Instance variable test.";
┃┃   }
┃┃}
┃┗
┗

1. 메소드에서 선언된 변수는 선언 시작부터 메소드 끝까지 존재(보이는)합니다.

2. 코드 블록에 선언된 변수는 코드 블록 끝까지 존재합니다.

3. 메소드의 매개변수는 메소드가 리턴될 때까지 존재합니다.

4. 개체의 변수는 변수를 포함하는 개체의 전체 수명 동안 존재합니다. 가시성도 특수 액세스 수정자에 의해 제어됩니다.

5. 정적(클래스) 변수는 프로그램이 실행되는 내내 존재합니다. 이들의 가시성은 액세스 수정자에 의해 정의됩니다."

"그래. 이 사진 기억나."

"좋습니다. 몇 가지 핵심 사항을 상기시켜 드리겠습니다."

"메서드 내부에 선언된 모든 변수는 선언된 시점부터 메소드가 끝날 때까지 존재(표시)됩니다(예제 1)."

"변수가 코드 블록에서 선언되면 코드 블록 끝까지 존재합니다(예제 2)."

"변수가 메소드 매개변수인 경우 메소드의 전체 본문에 존재합니다(표시됨)(예제 3)."

"변수가 인스턴스 변수(예제 4)이면 특정 객체에 연결되어 객체가 존재하는 한 존재합니다. 객체가 없으면 변수의 인스턴스가 없습니다. 변수에 액세스할 수 있습니다(즉, 변수는 변수가 이전 또는 이후에 선언되었는지 여부에 관계없이 클래스의 모든 메소드에서 볼 수 있습니다. 각 객체에 대해 새 변수가 생성됩니다. 다른 객체와 독립적입니다. 정적 메소드에서 인스턴스 변수에 액세스할 수 없습니다. . "

"변수가 static으로 선언되면, 즉 static 키워드로 표시된 변수 는 해당 클래스가 존재하는 한 존재합니다. JVM은 일반적으로 처음 사용할 때 클래스를 메모리에 로드합니다. 이때도 정적 변수가 초기화됩니다."

변수 범위에 대한 추가 정보 - 1

"위의 예는 a, b, s(비정적 변수) 및 count(정적 변수)의 네 가지 변수가 있는 Cat 클래스를 선언합니다. 이 클래스의 여러 개체(예: 3개)를 만들면 각 여기에는 클래스의 비정적 변수에 대한 자체 인스턴스가 포함됩니다. 정적 변수는 클래스의 모든 객체에서 공유됩니다. 기술적으로 말하자면 Cat 객체가 생성되기 전에도 존재했기 때문에 이러한 객체 내부에도 존재하지 않습니다."

"변수를 정적으로 선언하면 다음과 같은 일이 발생합니다 s."

변수 범위에 대한 추가 정보 - 2

"좋아. 알 것 같아."

"동일한 이름으로 변수를 선언할 수 있습니까?"

"메소드 내부가 아닙니다. 메소드 내부에서 선언된 모든 변수는 고유한 이름을 가져야 합니다. 메소드의 인수도 지역 변수로 간주됩니다."

"멤버 변수는 어떻습니까?"

"구성원 변수도 각 클래스에 대해 고유해야 합니다."

"하지만 예외가 있습니다. 지역 변수와 멤버 변수의 이름은 동일할 수 있습니다. "

"이러한 변수를 변경하면 이름이 동일한 두 변수 중 어떤 변수가 변경됩니까?"

"우리 코드에 가시적인(액세스 가능한) 변수가 여러 개 있는 경우(예: 인스턴스 변수 및 로컬 변수) 로컬 변수에 액세스할 것입니다."

두 개의 카운트 변수가 있는 예
class Main
{
    public int count = 0;     // Declare an instance variable

    public void run()
    {
        count = 15;           // Access the instance variable
        int count = 10;       // Declare a local method variable
        count++;             // Access the method variable
    }
}

"이 코드는 두 개의 카운트 변수를 선언합니다. 3행은 인스턴스 변수를 선언 하고 8행은 지역 변수를 선언합니다 ."

"run 메서드가 실행될 때 발생하는 상황은 다음과 같습니다."

"7행에서 인스턴스 변수 에 액세스 하고 값 15를 할당합니다."

"8행에서 우리는 새 지역 변수를 선언(생성)합니다 . count인스턴스 변수를 마스킹합니다. 지역 변수는 메서드의 모든 후속 코드가 볼(액세스) 것입니다."

"알았어요."

"로컬 변수는 인스턴스 변수를 마스킹합니다. 즉, 로컬 변수는 액세스할 수 있는 변수입니다. 그러나 인스턴스 변수에도 액세스할 수 있습니다. 그렇게 하는 것이 조금 더 복잡합니다."

정적(클래스) 변수
ClassName.variableName

// Here are some examples:
Cat.catsCount
비정적(인스턴스) 변수
this.variableName

// Here are some examples:
this.catsCount

"정적 메서드와 정적 변수에 대해 또 무엇을 말씀해 주시겠습니까?"

"정적 메서드와 변수는 클래스의 개체에 연결되지 않고 클래스 자체에 연결됩니다. 10개의 Variables 개체를 만들면(이 수준의 시작 부분에 있는 예 참조) 10개의 instanceVariable 변수(각각에 대해 하나씩)를 갖게 됩니다. 객체) 및 단 하나의 공유(정적) 변수 TEXT ."

"질문이 있습니다."

"정적 방법과 비정적 방법의 차이점은 무엇입니까?"

"비정적 메서드가 어떻게 작동하는지 살펴보겠습니다."

코드의 모양
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과 같습니다 . 이것이 정적 메서드가 비정적 변수 및 메서드에 액세스할 수 없는 이유입니다( 전달할 'this' 가 없기 때문입니다. 이러한 방법에)."

"음. 알 것 같아. 적어도 조금은."

"그리고 여기 디에고 삼촌과 그의 임무가 온다."