1. 정적 변수

클래스가 메모리에 로드되면 정적 객체가 즉시 생성됩니다. 이 개체는 정적 클래스 변수(정적 클래스 필드)를 저장합니다. 정적 객체는 클래스의 일반(비정적) 객체가 생성되지 않은 경우에도 존재합니다.

클래스에서 변수를 선언할 때 변수가 한 번만 생성되는지 또는 각 개체에 이러한 변수의 고유한 인스턴스가 있어야 하는지 여부를 나타냅니다. 기본적으로 각 개체에 대해 각 변수의 새 복사본이 생성됩니다.

정적 변수 는 클래스의 정적 개체에 바인딩되며 항상 단일 인스턴스가 있습니다.

클래스에서 정적 변수를 생성하려면 static이름 앞에 키워드를 작성해야 합니다. 정적 변수를 선언하는 일반적인 형식은 다음과 같습니다.

static Type name = value;

정적 변수에 초기 값이 지정되지 않은 경우 기본값으로 초기화됩니다.

유형 기본값
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(같은 것은
0
)
boolean
false
Object
그리고 모든 수업
null

예:

암호 메모
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

클래스 내에서 이름을 사용하여 정적 변수를 참조할 수 있습니다. 그러나 다른 클래스에서 액세스하려면 정적 변수 이름 앞에 클래스 이름을 써야 합니다.

ClassName.variable

예:

변하기 쉬운 수업 클래스 외부의 변수에 액세스
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
변수는 입니다 private. 클래스 외부에서는 보이지 않습니다.
private static int count = 0;
Counter
변수는 입니다 private. 클래스 외부에서는 보이지 않습니다.
private static boolean flag;
Arithmetic
변수는 입니다 private. 클래스 외부에서는 보이지 않습니다.


2. 정적 변수와 비정적 변수의 차이점

클래스의 비정적(일반) 변수는 키워드 없이 정적 변수와 동일한 방식으로 선언됩니다 static.

일반 변수와 정적 변수의 차이점은 무엇입니까?

클래스의 일반 변수는 클래스의 개체(클래스의 인스턴스)에 바인딩되는 반면 정적 변수는 클래스의 정적 개체에 바인딩됩니다.

클래스의 여러 인스턴스가 있는 경우 각 인스턴스에는 비정적(일반) 변수의 고유한 복사본이 있습니다. 클래스의 정적 변수는 항상 정적 개체에 저장되며 단일 인스턴스만 존재합니다.

클래스의 개체에 대한 참조가 있는 경우에만 클래스의 일반 변수(필드)에 액세스할 수 있습니다. 물론 클래스 내부 메서드도 마찬가지입니다.

예:

개체 참조를 사용하여 클래스의 필드에 액세스
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

어디에서나 정적 변수에 액세스할 수 있습니다(가시성 수정자를 고려한 후): 일반 메서드, 동일한 클래스의 정적 메서드, 다른 클래스의 메서드 등.

예:

개체 참조를 사용 하지 않고 클래스의 정적 필드에 액세스
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

메모리 구성 방법:

4개의 필드가 있는 클래스 가 있다고 가정해 보겠습니다 Person. 두 개는 정적이고 두 개는 그렇지 않습니다.

public class Person
{
   public static int count = 0;
   public static int sum = 0;
   public int age = 0;
   public String name;
}

클래스 로딩 직후

Java 시스템이 Person클래스 로드를 완료하면 메모리는 다음과 같이 표시됩니다.

첫 번째 객체 생성 후

객체를 생성하면 Person그림은 다음과 같이 됩니다.

정적 변수와 비정적 변수의 차이점 2

두 개체 모두 두 개의 변수가 있지만 다른 변수입니다. 일반 개체에는 일반 변수가 있고 정적 개체에는 정적 변수가 있습니다.

우리는 더 많은 물건이 필요합니다

두 개의 개체를 더 만들어 봅시다 Person. 이제 메모리는 다음과 같이 표시됩니다.

정적 변수와 비정적 변수의 차이점 3

각 객체에는 고유한 연령 및 이름 변수가 있습니다.



static3. 수정자 제거 및 추가

정적에서 일반으로

정적 변수를 가져와 static수정자를 제거하여 일반 변수로 바꾸면 어떻게 될까요? 예를 들어 static int sum변수입니다.

수정된 코드는 다음과 같습니다.

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public int age = 0;
   public String name;
}

이제 메모리는 다음과 같습니다.

정적 변수와 비정적 변수의 차이점

정적 객체에서 정적 변수가 사라지고 이제 일반 객체마다 고유한 sum변수가 있습니다.

일반에서 정적으로

반대로 할 수 있습니다. static수정자를 클래스의 일반 변수에 추가합니다. 모든 일반 개체에서 사라지고 정적 개체에 나타납니다. 및 변수를 정적 으로 만들기로 결정했다고 가정합니다 . agename그러면 코드는 다음과 같이 표시됩니다.

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

이제 메모리는 다음과 같이 표시됩니다.

정적 수정자 제거 및 추가