class A {
static int aa = 1;
static void aaPrint() {
print(aa);
}
}
코드를 작성하는 동안 “공전“어떤 역할을 할까?
정적이란 무엇입니까?
“정적”은 프로그래밍에서 많은 의미를 갖는 키워드 중 하나입니다. 일반적으로 static 키워드를 사용하는 변수 및 함수 이것은 메모리가 한 번 할당되고 프로그램이 종료될 때 해제됨을 의미합니다.
void main() {
final b = B(); //B클래스 선언
print(b.bb); //출력 2
b.bbPrint(); //출력 2
}
class B {
int bb = 2;
void bbPrint() {
print(bb);
}
}
기본적으로 클래스의 멤버 변수나 멤버 함수는 클래스 객체를 생성한 후에만 사용할 수 있습니다. 그러나 정적 변수나 함수는 클래스 객체를 생성하지 않고 사용할 수 있습니다.
void main() {
print(A.aa); // 출력 1
A.aaPrint(); // 출력 1
}
class A {
static int aa = 1;
static void aaPrint() {
print(aa);
}
}
static 키워드를 사용하면 이미 메모리에 할당되어 있기 때문에 클래스 객체를 생성하지 않고 사용할 수 있습니다.
어떻게 가능합니까?
static 키워드만 첨부했는데 클래스 객체를 생성하지 않고 어떻게 가능할까요? 이를 이해하려면 메모리 할당과 컴파일 타임/런타임을 알아야 합니다.
void main() {
final b = B(); //B클래스 선언
print(b.bb); //출력 2
b.bbPrint(); //출력 2
}
class B {
int bb = 2;
void bbPrint() {
print(bb);
}
}
클래스 B를 사용하기 위해 객체를 생성할 때 힙 메모리에서 할당된.
(힙 메모리 : 동적으로 할당된 메모리가 저장되는 영역)
즉, 객체를 생성할 때 / 실행 시간메모리에 할당되기 때문에 할당 후 클래스의 멤버 변수나 멤버 함수에 접근하여 사용할 수 있다.
(실행 시간 : 사용할 때)
void main() {
print(A.aa); // 출력 1
A.aaPrint(); // 출력 1
}
class A {
static int aa = 1;
static void aaPrint() {
print(aa);
}
}
클래스 A를 사용할 때 개체를 만들지 않았습니다. 하지만 “공전” 키워드를 붙여서 컴파일 시간 다음과 같은 경우 static으로 표시된 변수 데이터 섹션 메모리에 할당되고 기능은 텍스트 섹션 메모리에 할당됩니다.
(데이터 섹션 메모리 : 글로벌 변수, 정적 변수 등의 데이터가 저장되는 영역)
(텍스트 섹션 메모리 : 실행 가능한 코드가 저장되는 영역)
(컴파일 시간 : 앱 실행 시)
쉽게 말해 앱을 실행할 때 A 클래스의 aa 변수와 aaPrint 함수를 기억하고 사용하면 됩니다.
데이터 섹션 메모리 및 텍스트 섹션 메모리에 할당된 데이터 프로그램이 종료되면 해제됩니다.
참고 사항
class A {
static int aa = 1;
int bb = 2;
static void aPrint() {
print(aa);
print(bb); // error : Instance members can't be accessed from a static method.
}
void bPrint() {
print(aa);
print(bb);
}
}
정적 함수에서 static으로 선언되지 않은 bb 변수는 사용할 수 없습니다. Static은 컴파일 타임에 할당되지만 인스턴스 멤버 bb 변수는 런타임에 할당되므로 컴퓨터는 bb가 수행하는 코드를 알 수 없습니다.
그러나 일반 함수인 bPrint는 런타임에 할당되므로 aa와 bb의 모든 정보를 알고 있기 때문에 문제 없이 사용할 수 있습니다.