1. 정적 변수
클래스가 메모리에 로드되면 정적 객체가 즉시 생성됩니다. 이 개체는 정적 클래스 변수(정적 클래스 필드)를 저장합니다. 정적 객체는 클래스의 일반(비정적) 객체가 생성되지 않은 경우에도 존재합니다.
클래스에서 변수를 선언할 때 변수가 한 번만 생성되는지 또는 각 개체에 이러한 변수의 고유한 인스턴스가 있어야 하는지 여부를 나타냅니다. 기본적으로 각 개체에 대해 각 변수의 새 복사본이 생성됩니다.
정적 변수 는 클래스의 정적 개체에 바인딩되며 항상 단일 인스턴스가 있습니다.
클래스에서 정적 변수를 생성하려면 static
이름 앞에 키워드를 작성해야 합니다. 정적 변수를 선언하는 일반적인 형식은 다음과 같습니다.
static Type name = value;
정적 변수에 초기 값이 지정되지 않은 경우 기본값으로 초기화됩니다.
유형 | 기본값 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(같은 것은
) |
|
|
그리고 모든 수업 |
|
예:
암호 | 메모 |
---|---|
|
|
|
|
|
|
|
|
|
클래스 내에서 이름을 사용하여 정적 변수를 참조할 수 있습니다. 그러나 다른 클래스에서 액세스하려면 정적 변수 이름 앞에 클래스 이름을 써야 합니다.
ClassName.variable
예:
변하기 쉬운 | 수업 | 클래스 외부의 변수에 액세스 |
---|---|---|
|
|
|
|
|
|
|
|
변수는 입니다 private . 클래스 외부에서는 보이지 않습니다. |
|
|
변수는 입니다 private . 클래스 외부에서는 보이지 않습니다. |
|
|
변수는 입니다 private . 클래스 외부에서는 보이지 않습니다. |
2. 정적 변수와 비정적 변수의 차이점
클래스의 비정적(일반) 변수는 키워드 없이 정적 변수와 동일한 방식으로 선언됩니다 static
.
일반 변수와 정적 변수의 차이점은 무엇입니까?
클래스의 일반 변수는 클래스의 개체(클래스의 인스턴스)에 바인딩되는 반면 정적 변수는 클래스의 정적 개체에 바인딩됩니다.
클래스의 여러 인스턴스가 있는 경우 각 인스턴스에는 비정적(일반) 변수의 고유한 복사본이 있습니다. 클래스의 정적 변수는 항상 정적 개체에 저장되며 단일 인스턴스만 존재합니다.
클래스의 개체에 대한 참조가 있는 경우에만 클래스의 일반 변수(필드)에 액세스할 수 있습니다. 물론 클래스 내부 메서드도 마찬가지입니다.
예:
개체 참조를 사용하여 클래스의 필드에 액세스 |
---|
|
어디에서나 정적 변수에 액세스할 수 있습니다(가시성 수정자를 고려한 후): 일반 메서드, 동일한 클래스의 정적 메서드, 다른 클래스의 메서드 등.
예:
개체 참조를 사용 하지 않고 클래스의 정적 필드에 액세스 |
---|
|
메모리 구성 방법:
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
그림은 다음과 같이 됩니다.
두 개체 모두 두 개의 변수가 있지만 다른 변수입니다. 일반 개체에는 일반 변수가 있고 정적 개체에는 정적 변수가 있습니다.
우리는 더 많은 물건이 필요합니다
두 개의 개체를 더 만들어 봅시다 Person
. 이제 메모리는 다음과 같이 표시됩니다.
각 객체에는 고유한 연령 및 이름 변수가 있습니다.
static
3. 수정자 제거 및 추가
정적에서 일반으로
정적 변수를 가져와 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
수정자를 클래스의 일반 변수에 추가합니다. 모든 일반 개체에서 사라지고 정적 개체에 나타납니다. 및 변수를 정적 으로 만들기로 결정했다고 가정합니다 . age
name
그러면 코드는 다음과 같이 표시됩니다.
public class Person
{
public static int count = 0;
public int sum = 0;
public static int age = 0;
public static String name;
}
이제 메모리는 다음과 같이 표시됩니다.