클래스 밖에서 선언가능
// static > heap > stack
class Animal {
//static
int id = 1;
static String name = "동물";
void speak() {
//메서드 (상태 변경할때)
}
}
void hello() {
//static
// 메서드가 아니라 함수다. (기능을 가지는 친구)
int num = 10; //스택
}
String name = "Hello World"; //static에 뜬다.
void main() {
print(name);
print(Animal.name);
Animal a = Animal();
print(a.id);
hello();
}
Animal 클래스, hello, static String name, name, main 모두 선언가능
자바에서는 무조건 클래스 안에다 설정해야되지만
Dart에서는 변수, 함수, 클래스 등을 클래스 밖에서 전역적으로 정의할 수 있습니다. 이는 Dart의 유연한 구조 덕분입니다. 즉, 꼭 클래스 안에 정의하지 않아도 함수나 변수를 전역에서 선언하고 사용할 수 있다.
Dart에서의 변수 타입
void main() {
int n1 = 1;
double d1 = 10.1;
bool b1 = true;
String s1 = "홍길동";
// print() 함수는 Console에 출력을 해주는 함수입니다.
// ${} 를 활용하면 문자열에 변수를 바인딩할 수 있습니다.
print("정수 : ${n1.runtimeType}"); //1급객체
print("실수 : ${d1.runtimeType}");
print("부울 : ${b1.runtimeType}");
print("문자열 : ${s1.runtimeType}");
}
Dart에서는 모든 데이터가 **객체(1급 객체)**로 동작합니다. 심지어 기본적인 데이터 타입(정수, 실수, 부울 값 등)조차도 객체로 취급됩니다. 이것은 자바와 Dart의 큰 차이점 중 하나입니다.
int
:n1
은 정수형 값을 가지는 객체입니다. Dart에서int
는 객체로 취급되며, 객체이기 때문에runtimeType
메서드를 호출하여 타입 정보를 얻을 수 있습니다.
double
:d1
은 실수형 값을 가지는 객체입니다. Dart에서는 모든 숫자 타입도 객체로 처리되며, 객체의 메서드와 속성을 사용할 수 있습니다.
bool
:b1
은 참/거짓을 표현하는 부울 값으로, 이 역시 객체로 동작합니다.
String
:s1
은 문자열 값을 가지는 객체입니다. 문자열도 다른 타입처럼 객체로 취급됩니다.
Dart의 runtimeType
:
Dart에서
runtimeType
은 객체의 실제 타입을 런타임 중에 반환해주는 속성입니다. 모든 변수는 객체이기 때문에 runtimeType
을 호출하여 해당 변수의 타입 정보를 알 수 있습니다.dynamic 타입
dynamic 타입은 모든 타입을 받을 수 있고 다른 타입으로 변경도 가능하다.
void main() {
//자바의 오브젝트타입 다운캐스팅해서 사용가능
dynamic n1 = 1;
print("정수 : ${n1.runtimeType}");
n1 = 10.5;
print("n1 : ${n1.runtimeType}");
}
null safety(널 안전성)
변수가
null
값을 가질 수 있는지 여부를 명시적으로 구분하도록 했습니다. 기본적으로, Dart에서 변수는 null을 허용하지 않으며, 변수가 null
값을 가질 수 있도록 하려면 **nullable
타입(String?
)**으로 명시해줘야
class A {
late int num;
}
//String username = null; 안됨
String? username = null; //새로운 타입 null을 받을 수 있음
//전역 정적 메모리 (static)
void main() {
print(username);
print(username ?? "임시아이디");
print(username == null ? "임시아이디" : username);
}
late
키워드와 null
late
키워드는 변수를 나중에 초기화할 때 사용됩니다.late
변수를 사용할 때는, 초기화 전에 변수에 접근하면 런타임 에러가 발생합니다. 하지만late
변수는 반드시 null이 아닌 값을 할당해야 하며, null을 허용하지 않습니다.
class A {
late int num; // 나중에 초기화할 변수
}
여기서
late int num;
는 나중에 초기화되지만, null을 허용하지 않는다는 점이 중요합니다. 초기화 전에 접근하면 런타임 에러가 발생할 수 있습니다.Share article