변수란 변하다라는 뜻을 가지고 있다.
변수특징
var blackPink
_
로 시작할 수 있으며, 이 변수는 클래스의 private
변수명으로 사용됨.자바스크립트의 var
과 비슷한 동작을 하는 변수. 어떤 타입으로도 할당 할 수 있음.
void main() {
var name = '자동차'
name = '기차'
// name = 10
// error: 변수 타입 변경 불가.
// var name = '비행기'
// error: 재선언 불가.
}
한번 선언하면 그 선언타입으로 fixed가 된다. 바꿀수가 없다.
Dart에서 var
은 런타임 시에 타입이 결정되기 떄문에 코드만 보고 타입을 이해하기 명확하지 않다. 변수선언과 함께 타입을 선언하는 방식의 코드를 지향하자.
var키워드는 암시적 타입 지역 변수(Implicitly typed local variable)라고도 한다.
var
키워드
void main() {
dynamic name = 'Naruto';
print(name);
name = 10;
print(name);
}
var
과 다르게 타입변경이 된다.
정수형 데이터를 다룰때 사용하며 기본적인 수학 연산 가능.
void main() {
int num1 = 10;
int num2 = 20;
print(num1 + num2);
print(num1 - num2);
print(num1 * num2);
print(num1 / num2);
}
실수형 데이터를 다룰때 사용하며 기본적인 수학 연산 가능.
void main() {
double num1 = 1.2;
double num2 = 2.2;
print(num1 + num2);
print(num1 - num2);
print(num1 * num2);
print(num1 / num2);
}
문자열 데이터를 다룰때 사용.
void main() {
String name = 'Kakashi';
String name2 = 'Obito';
print(name);
print('my name is ' + name);
print('my name is $name');
print('${name.runtimeType} ${name2}');
print(name.toUpperCase());
print(name.toLowerCase());
}
참/거짓 저장할때 사용 가능.
void main() {
bool isTrue = true;
print(isTrue);
isTrue = false;
print(isTrue);
}
void main() {
List<String> blackPink = ['제니', '지수', '로제', '리사'];
List<int> numbers = [1, 2, 3, 4, 5, 6];
print(blackPink);
// [제니, 지수, 로제, 리사]
print(numbers);
// [1, 2, 3, 4, 5, 6]
print(blackPink[0]);
// 제니
print(blackPink.length);
// 4
blackPink.add('호기');
print(blackPink);
// [제니, 지수, 로제, 리사, 호기]
blackPink.remove('호기');
// blackPink.removeAt(4);
print(blackPink);
// [제니, 지수, 로제, 리사]
print(blackPink.indexOf('로제'));
// 2
}
"<>"사이에 타입을 명시해놓는 형태를 Generic(제네릭) 이라고 한다.
join
: 각 요소를 합쳐 하나의 문자열을 만듬
void main() {
List<String> blackPink = ['제니', '지수', '로제'];
print(blackPink.join(', '));
// 제니, 지수, 로제
}
indexOf
: 요소를 찾고, 해당 요소의 index를 반환함.
void main() {
List<String> blackPink = ['제니', '지수', '로제'];
print(blackPink.indexOf('지수'));
// 1
}
key-value 형태로 데이터를 저장하는 자료구조이며 key 값을 통해 데이터를 검색, 저장, 삭제한다.
중복된 key 값은 허용되지 않는다.
void main() {
// Map
// Key / Value
Map<String, String> dictionary = {
'Harry Potter': '해리포터',
'Ron weasley': '론 위즐리',
'Hermione Granger': '허마이오니 그레인저',
};
print(dictionary);
// {Harry Potter: 해리포터, Ron weasley: 론 위즐리, Hermione Granger: 허마이오니 그레인저}
Map<String, bool> isHarryPotter = {
'Harry Potter': true,
'Ron Wasley': true,
'Ironman': false,
};
print(isHarryPotter);
// {Harry Potter: true, Ron Wasley: true, Ironman: false}
print(isHarryPotter['Ironman']);
// false
}
void main() {
// Map
// Key / Value
Map<String, bool> isHarryPotter = {
'Harry Potter': true,
'Ron Wasley': true,
'Ironman': false,
};
// Add
isHarryPotter.addAll({
'Spiderman': false,
'Naruto': false,
});
print(isHarryPotter);
// {Harry Potter: true, Ron Wasley: true, Ironman: false, Spiderman: false, Naruto: false}
// Add
isHarryPotter['Hulk'] = false;
print(isHarryPotter);
// {Harry Potter: true, Ron Wasley: true, Ironman: false, Spiderman: false, Naruto: false, Hulk: false}
// Remove
isHarryPotter.remove('Harry Potter');
print(isHarryPotter);
// {Ron Wasley: true, Ironman: false, Spiderman: false, Naruto: false, Hulk: false}
}
enum Status{
approved, // 승인
pending, // 대기
rejected, // 거절
}
void main() {
Status status = Status.pending;
if(status == Status.approved){
print('승인입니다');
}else if(status == Status.pending){
print('대기입니다.');
}else{
print('거절입니다.');
}
}
enum
을 사용하는 이유는 정확히 이 안의 값들만 있다는걸 명시해 두고 사용한다 라는걸 알려주기, 정의하기 위해.
List<>처럼 하나의 값들만 저장할 수 있는 형태이다.
List와 Set은 비슷한 함수들이 매우 많다.
List와 Set의 차이는 List와 다르게 Set은 중복값이 들어갈 수 없다.
즉, 중복을 자동으로 처리해준다.
void main() {
Set<String> names = {
'Naruto',
'Sasuke',
'Kakashi',
'Sasuke',
};
print(names);
// {Naruto, Sasuke, Kakashi}
names.add('Obito');
print(names);
// {Naruto, Sasuke, Kakashi, Obito}
names.remove('Obito');
print(names);
// {Naruto, Sasuke, Kakashi}
print(names.contains('Kakashi'));
// true
}
상수란 항상 같은 수, 변하지 않는 수를 말한다.
영어로는 constant.
일반적으로 변수를 선언할때 변수 앞에다가 선언하면 된다.
void main() {
final String name = 'Kakashi';
print(name); // 'Kakashi;
const String name2 = 'Obito';
print(name2); // 'Obito;
// name2 = 'Sasuke';
// error: 값을 한 번 선언하면 변경 불가.
}
final과 const의 차이를 알아보기 전에 DateTime을 알아보자.
void main() {
// DateTime now = DateTime.now();
// 컴파일 하는순간이 아닌(!) 이 코드가 실행되는 순간에 실행된다.
final DateTime now = DateTime.now();
print(now);
// const DateTime now2 = DateTime.now();
// error: DateTime은 빌드가 되고 해당 코드를 읽을때 실행되는것이다(읽기 전에는 실행되지 않는다). 하지만 const는 빌드가 되는 순간의 값을 알아야 하기 때문에 에러가 난다.
}
한 번 선언하면 값을 바꿀 수 없는건 똑같다.
final
은 실행중에 값이 결정된다.final
은 이 파일이 실행될 때 해당 위치에서 값이 결정된다.final
은 빌드타임의 값을 몰라도 된다.final
변수는 해당 함수가 리턴되면 메모리에서 정리됩니다.const
는 컴파일시에 값이 결정된다.
const
는 이 파일을 컴파일할 때 기계어로 번역될 때 값이 결정된다.
const
는 빌드타임의 값을 절대적으로 알아야 한다.
Class
안에서 const
키워드는 static
필드에서만 사용 가능하다.
이는 Class
가 인스턴스화 되기 전, compile-time에 해당 필드의 값이 정해지기 때문이다.(static
필드는 compile-time에 메모리 상에 올라단다.)
Class
의 생성자에서 필드의 기본값으로 사용할 때, const 키워드를 사용한다.
null이 들어갈 수 있는 변수에 사용하며 변수타입뒤에 ?
를 붙인다.
void main(){
// null - 아무런 값도 있지 않다.
// nullable - null이 될 수 있다.
// non-nullable - null이 될 수 없다.
// String name;
// error: non-nullable. null이 들어갈수없다.
String name = 'Kakashi';
print(name);
String? name2;
print(name2);
// String? name2 = 'Obito';
// print(name2);
// print(name2!);
// name2! = name2는 null이 아니다.
number ??= 3;
// number가 만약 null이면은 3을 넣어라.
}
변수에 쓰이는 operator를 알아보자.
void main() {
int? num = 3;
print(num);
num = null;
print(num);
num ??= 3;
print(num);
}
void main() {
int num1 = 1;
print(num1 is int);
// ture
print(num1 is String);
// false
print(num1 is! int);
// false
print(num1 is! String);
// ture
}
reference