const
: compile시, 값이 할당되어 있어야 한다.
final
: runtime시, 값을 할당해도 된다.
. 값이 할당되면 바꿀 수 없다는 것은 동일하다.
. 일반적으로 final을 더 많이 쓴다.
// const는 compile시 값이 할당되어 있어야 하므로 아래 코드는 실행 전 에러가 발생한다.
// Error: Cannot invoke a non-'const' constructor where a const expression is expected.
void main() {
const DateTime now = DateTime.now();
print(now);
Future.delayed(
Duration(milliseconds: 1000),
() {
const DateTime now2 = DateTime.now();
}
);
}
// const 대신 final로 변수를 선언하여 사용하면 문제없이 실행된다.
static
: instance에 귀속되지 않고 class에 통째로 귀속되는 변수에 사용한다.void main() {
//Static keyword
Employee seulgi = new Employee('슬기');
Employee chorong = new Employee('초롱');
seulgi.printNameAndBuilding();
chorong.printNameAndBuilding();
//building은 static keyword로 선언되어 있어서 class에 바로 접근해서 값을 할당할 수 있다.
Employee.building = '여의도 위워크';
seulgi.printNameAndBuilding();
chorong.printNameAndBuilding();
Employee.building = '을지로 위워크';
seulgi.printNameAndBuilding();
chorong.printNameAndBuilding();
}
class Employee {
//직원: 모든 직원이 같거나 다른 값을 가짐 (final)
//건물: 모든 직원이 같은 값을 가짐 (static)
static String? building;
String name;
Employee(name) : this.name = name;
void printNameAndBuilding() {
print('제 이름은 ${this.name}입니다. ${building} 건물에서 근무하고 있습니다.');
}
}
void main() {
//OOP - Objected Oriented Programming
//객체지향 프로그래밍
//Instantiation 인스턴스화 과정, 여기서 redVelvet은 새로 생성된 Instance이다.
//named parameter는 순서가 바뀌어도 상관이 없다.
Idol redVelvet = new Idol(group: '레드벨벳', name: '슬기');
redVelvet.sayName();
print(redVelvet.name);
//seulgi.name = '코드팩토리'
//print(seulgi.name); final로 선언되지 않았다면 코드팩토리가 결과값으로 뜬다.
Idol bts = new Idol.fromMap({
'name': 'rm',
'group': 'bts',
});
bts.sayName();
}
class Idol {
final String name;
final String group;
//1번 방법
Idol({name, group}) : this.name = name, this.group = group;
void sayName() {
print('제 이름은 ${this.name}입니다.');
}
//2번 방법
Idol.fromMap(Map input) : this.name = input['name'], this.group = input['group'];
}
출처:YOUTUBE-코드팩토리