1. 지역 변수

변수에 대해 좀 더 진지하게 이야기해 봅시다. 그러나 이번에는 내부 구조에 대해 설명하지 않습니다. 대신 변수가 있는 코드와 어떻게 상호 작용하는지에 초점을 맞춥니다.

메서드 내에서 선언된 모든 변수를 지역 변수 라고 합니다 . 지역 변수는 선언된 코드 블록에만 존재합니다. 또는 더 정확히 말하면 선언된 순간부터 선언된 코드 블록이 끝날 때까지 존재합니다.

간단하게 예를 들어 보겠습니다.

암호 변수 가시성
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}


a
a
a
a, b
a, b
a, b
a, b, x
a, b, x
a, b
a, b
a
a

지역 변수에 접근하는 방법에 대해 한 번 더 이야기해 봅시다. 다음은 중괄호로 구성된 코드 블록입니다. 이것은 메서드 본문, 루프 본문 또는 조건문에 대한 코드 블록일 수 있습니다. 코드 블록에서 선언된 변수는 해당 코드 블록이 끝날 때까지 존재합니다.

변수가 루프 본문에서 선언되면 루프 본문에만 존재합니다. 루프가 반복될 때마다 생성되고 소멸됩니다.

한 메서드에서 같은 이름을 가진 두 개의 지역 변수를 선언할 수 없습니다. 프로그램이 컴파일되지 않습니다. 그러나 변수가 선언된 코드 블록이 겹치지 않는 경우에는 이렇게 할 수 있습니다.

예:

암호 변수 가시성
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     System.out.println(b);
   }

   if (a < 20)
   {
     int b = 20;
     System.out.println(b);
   }
}


a
a
a
a, b
a, b
a
a
a
a
a, b
a, b
a

 두 번째 변수가 선언된 코드 블록에서 b 첫 번째 변수가 표시되지 않기 때문에 명명된 두 번째 지역 변수를 선언할 수 있었습니다 .bb


2. 매개변수

앞에서 말했듯이 각 메서드에는 매개 변수라고 하는 변수가 있을 수 있습니다. 가시성과 수명은 어떻습니까?

모두 간단합니다. 매개변수는 실행 단계가 메서드로 들어갈 때 생성됩니다(즉, 메서드의 코드가 실행을 시작할 때). 메서드가 종료되면 제거됩니다. 메서드 본문 전체에서 볼 수 있습니다.

예:

암호 변수 가시성
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}

args
args, a
args, a
args, a
args, a, b
args, a, b
args, a, b
args, a, b, x
args, a, b, x
args, a, b
args, a, b
args, a
args, a

이전에 말했듯이 는 args유형이 문자열 배열인 변수일 뿐입니다. 그리고 모든 매개변수와 마찬가지로 메서드 본문 내의 모든 위치에서 사용할 수 있습니다. 즉, 우리는 일반적으로 예제에서 이를 무시합니다.



3. 클래스의 변수

클래스가 메서드와 변수를 가질 수 있다는 레벨 1의 수업을 기억할 것입니다. 메소드는 때때로 인스턴스 메소드라고 하고 변수는 인스턴스 변수 또는 필드라고 합니다. 이들은 실제로 Java의 동의어입니다.

클래스의 변수(또는 필드)는 무엇입니까?

메서드가 아닌 클래스에서 선언되는 변수입니다.

클래스의 모든(비정적) 메서드에서 액세스할 수 있습니다. 대략적으로 말하면 인스턴스 변수는 클래스의 모든 메서드가 공유하는 변수입니다 .

예:

암호 변수 가시성
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     count++;
   }

   public void remove(int data)
   {
     sum = sum - data;
     count--;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum

add()이 예에는 두 가지 방법 이 있습니다 remove(). 메서드 는 및 인스턴스 변수를 add()증가시키고 메서드는  및 변수를 감소시킵니다 . 두 방법 모두 공유 인스턴스 변수에서 작동합니다.sumcountremove()sumcount

메서드가 실행되는 동안 지역 변수가 존재합니다. 클래스 의 인스턴스 변수는 해당 객체가 존재하는 한 클래스의 객체 내에 존재합니다. 다음 단계에서는 클래스의 개체에 대한 세부 정보를 배웁니다.


4. 정적 변수

메서드와 마찬가지로 클래스의 변수는 정적이거나 비정적일 수 있습니다. 정적 메서드는 정적 변수에만 액세스할 수 있습니다.

레벨 11에서는 정적 변수 및 메서드의 구조를 분석하고 이러한 제한의 이유를 이해하게 됩니다.

정적 변수(클래스 변수)를 만들려면 static해당 선언에 키워드를 작성해야 합니다.

정적 변수는 선언된 클래스의 개체 또는 인스턴스에 바인딩되지 않습니다. 대신 클래스 자체에 속합니다. 그렇기 때문에 클래스의 단일 개체가 생성되지 않은 경우에도 존재합니다 . 다음과 같은 구성을 사용하여 다른 클래스에서 참조할 수 있습니다.

ClassName.variableName

예:

암호 변수 가시성
public class Solution
{
   public void add(int data)
   {
     Storage.sum = Storage.sum + data;
     Storage.count++;
   }

   public void remove(int data)
   {
     Storage.sum = Storage.sum - data;
     Storage.count--;
   }
}

public class Storage
{
   public static int count = 0;
   public static int sum = 0;
}

Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum



Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum

위의 예에서 우리는 별도의 클래스를 만들고  변수 를 Storage이동  하고 static 으로 선언했습니다 . 공용 정적 변수는 프로그램의 모든 메서드에서 액세스할 수 있습니다(메서드뿐만 아니라).countsum