목 차
- 변수와 타입
- 조건문과 반복문
- 함수
- 함수형 프로그래밍
- 객체지향 프로그래밍
- Enum
- Dart 3.0 업데이트 내용
- 비동기 프로그래밍
var name = "홍길동"; // 타입 추론 (String)
print(name.runtimeType); // String
name = "김철수"; // 재할당 가능
String name = "홍길동";
int age = 25;
double height = 175.5;
bool isStudent = true;
String name = "aa";
String name2 = "bb";
print(name+name2); // aabb
print('${name} ${name2}') // aa bb
print('$name') // aa, 변수가 하나일 경우 {} 생략 가능
var
는 타입 추론 후 고정된 타입으로만 재할당을 허용하는 반면,dynamic
은 특수 타입으로 컴파일 타임 타입 체크를 완전히 비활성화하여 어떤 타입의 값이든 재할당할 수 있음.dynamic
타입은 어떤 데이터를 받았는데 그 데이터의 type을 알 수 없는 경우에 유용하게 사용함.dynamic value = "문자열";
value = 123; // 숫자로 변경 가능
value = true; // 불린으로 변경 가능
String name = "홍길동"; // null 불가
String? nickname = null; // null일 수 있음, 타입에 ?를 붙이면 nullable이 됨
String name2 = "bb";
name2! = null // 에러 발생, !는 절대 null이 아니라는 의미이기 때문
final
: 변수 선언부 앞에 사용, final로 선언하게 되면 값을 변경할 수 있음const
: 변수를 한번 선언하게 되면 값을 변경할 수 없음final
과 const
를 사용하면 var
키워드 생략 가능. 즉, 타입도 생략할 수 있음// 시간과 날짜를 저장할 수 있는 DateTime 타입
// 이 코드가 실행되는 순간의 시간을 나타냄
DateTime now = DateTime.now();
final DateTime now = DateTime.now(); // 정상
print(now);
const DateTime now2 = DateTime.now(); // 에러
const String appName = "MyApp"; // 정상
final
은 정상 실행되고 const
는 에러가 발생하는 이유
const
는 컴파일 타임의 값을 알고 있어야 하며, final
은 컴파일 타임의 값을 알고 있지 않아도 됨.컴파일 타임
이라 함.DateTime.now()
는 코드가 실행되는 순간에만 값을 알 수 있기 때문에 const
로 사용할 수 없음const
값들은 이 시점에 이미 메모리에 고정됨. 즉, 컴파일 타임에 값이 확정되어야 함.final
값들은 프로그램 실행 중에 한번만 할당됨. 즉, 런타임에 값이 결정되어도 OKint number = 2;
number++; // 증가
number--; // 감소
number += 2; // 더하기 할당
number *= 3; // 곱하기 할당
print(number % 2); // 나머지
double? number = 4.0;
number = 2.0;
print(number); // 2.0
number = null;
print(number); // null
number ??= 3.0; // number가 만약 null 이라면 우측 값으로 변경
print(number); // 3.0
int a = 1, b = 2;
print(a > b); // false
print(a < b); // true
print(a == b); // false
print(a != b); // true
int number = 1;
print(number is int); // true
print(number is! int); // false
bool result = 12 > 10 && 1 > 0; // true (AND)
bool result2 = 12 > 10 || 1 < 0; // true (OR)
List<리스트 안에 어떤 타입의 변수를 넣을건지>
List<String> fruits = ['사과', '바나나', '오렌지'];
List<int> numbers = [1,2,3,4];
fruits.add('포도'); // 추가
fruits.remove('바나나'); // 제거
print(fruits[0]); // 인덱스 접근, 사과
print(fruits.length); // 길이, 3
print(fruits.indexOf('사과')); // 인덱스 찾기, 0
key-value
쌍Map<key 타입, value 타입>
Map<String, int> scores = {
'국어': 90,
'영어': 85,
'수학': 92
};
// 추가
scores['과학'] = 88;
scores.addAll({'사회': 78});
// 조회
print(scores['국어']); // 90
print(scores.keys); // 키 목록, (국어, 영어, 수학, 과학, 사회)
print(scores.values); // 값 목록, (90, 85, 92, 88, 78)
// 제거 .remove(key값)
scores.remove('영어');
Map
과 비슷하나 key-value 쌍이 아니라 List
처럼 하나의 값만 저장List
는 중복 값 가능, Set
은 중복 값 불가Set<String> uniqueNames = {'김철수', '이영희', '김철수'};
print(uniqueNames); // {김철수, 이영희} - 중복 제거
uniqueNames.add('박민수'); // 추가
uniqueNames.remove('김철수'); // 제거
uniqueNames.contains('이영희')); // 존재 여부 확인, true/false
이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗