클래스 안에서 변수 혹은 메서드 앞에 static 키워드를 사용하면 해당 변수, 메서드가 인스턴스에 귀속되지 않고, 클래스에 귀속됩니다.
인스턴스와는 완전히 별개의 변수, 메서드가 됩니다.
<코드>
import 'dart:math';
void main() {
print(Numbers.maxNumber);
print(Numbers.getDefaultNumbers());
Numbers numbers1 = Numbers(startNumber: 1, endNumber: 30);
// numbers.maxNumber; 접근 불가, 인스턴스와 static은 별개이다.
print(numbers1.getNumbers());
Numbers.interval = 3;
Numbers numbers2 = Numbers(startNumber: 1, endNumber: 30);
print(numbers2.getNumbers());
}
class Numbers {
late int startNumber;
late int endNumber;
// 최대 범위 static const
static const int maxNumber = 50;
// 숫자간 간격 static var
static int interval = 1;
Numbers({startNumber = 0, endNumber = maxNumber}) {
this.startNumber = min(maxNumber, startNumber);
this.endNumber = min(maxNumber, endNumber);
}
List<int> getNumbers() {
return List.generate((endNumber - startNumber + 1) ~/ interval,
(index) => startNumber + index * interval);
}
static List<int> getDefaultNumbers() {
return List.generate(maxNumber, (index) => index + 1);
}
}
<결과>
const 키워드를 사용한 변수는 한번 값이 정해지면 더 이상 값이 바뀌지 않습니다.
final 키워드와 비슷한데, 차이점이라고 하면, const 변수는 컴파일 타임에 값이 정해진다는 것입니다.
<코드>
// 탑레벨 영역의 const
const String toplevelConst = 'this is toplevel const';
class ConstTestClass {
// 클래스 안에서의 const
static const String classConst = 'this is class const';
}
void constTestFunction() {
// 함수 안에서의 const
const String functionConst = 'this is function const';
print(functionConst);
// functionConst = '수정 해볼게요'; 에러 발생
}
void main() {
print(toplevelConst);
// toplevelConst = '수정 해볼게요'; 에러 발생
print(ConstTestClass.classConst);
// ConstTestClass.classConst = '수정 해볼게요'; 에러 발생
constTestFunction();
// const DateTime now = DateTime.now(); 에러 발생
}
<결과>
final 키워드를 사용한 변수는 한번 값이 정해지면 더 이상 값이 바뀌지 않습니다.
const 키워드와의 차이점은, final 은 런타임에 값이 정해집니다.
<코드>
final String toplevelFinal = 'this is toplevel final';
class FinalTest {
final String classFinal;
FinalTest({required this.classFinal});
}
void main() {
// toplevelFinal = '수정 해볼게요'; 에러 발생
print(toplevelFinal);
final String functionFinal = 'this is function final';
// functionFinal = '수정 해볼게요'; 에러 발생
print(functionFinal);
FinalTest finalTest = FinalTest(classFinal: 'this is class final');
// finalTest.classFinal = '수정 해볼게요'; 에러 발생
print(finalTest.classFinal);
}
<결과>