1. Record 타입
- Record 타입은 타입과 타입의 순서를 무조건 보장받을 수 있다.
1void main() {2final result = nameAndAge({3'name': '민지',4'age': 20,5});67print(result); // (민지, 20)8print(result.$1); // 민지9print(result.$2); // 201011final result3 = getNewJeansWithType();12for (final item in result3) {13print(item.$1);14print(item.$2);15}1617final result4 = getNewJeansWithType2();18for (final item in result4) {19print(item.$1);20print(item.$2);21}2223print('-------------------------------');2425final result5 = getNewJeansWithType3();26for (final item in result5) {27print(item.name);28print(item.age);29}3031final result6 = getMinji();32print(result6);33}3435// Record36(String, int) nameAndAge(Map<String, dynamic> json) {37return (38json['name'] as String,39json['age'] as int,40);41}4243List<Map<String, dynamic>> getNewJeans() {44return [45{'name': '민지', 'age': 20},46{'name': '해린', 'age': 18},47];48}4950List<(String, int)> getNewJeansWithType() {51return [52('민지', 20),53('해린', 18),54];55}5657List<(String name, int age)> getNewJeansWithType2() {58return [59('민지', 20),60('해린', 18),61];62}6364List<({String name, int age})> getNewJeansWithType3() {65return [66(name: '민지', age: 20),67(name: '해린', age: 18),68];69}7071(String name, String group, int age) getMinji() {72return ('민지', '뉴진스', 20);73}
2. 디스럭쳐링(Destructuring, 분해)
1void main() {2final (name, age) = ('민지', 20);3print(name);4print(age);56final newJeans = ['민지', '해린'];7final [String a, String b] = newJeans;8print(a);9print(b);1011final numbers = [1, 2, 3, 4, 5, 6, 7, 8];12final [x, y, ..., z] = numbers;13print(x);14print(y);15print(z);1617final [xx, yy, ...rest, zz] = numbers;18print(xx);19print(yy);20print(zz);21print(rest); // [3, 4, 5, 6, 7]2223// _ : 무시24final [xxx, _, yyy, ...rest2, zzz, _] = numbers;25print(xxx); // 126print(yyy); // 327print(zzz); // 828print(rest2); // [4, 5, 6, 7]2930final minJiMap = {31'name': '민지',32'age': 20,33};34final {'name': name3, 'age': age3} = minJiMap;35print(name3);36print(age3);3738print('-------------------');39final minJiIdol = Idol(name: '민지', age: 20);40final Idol(name: name4, age: age4) = minJiIdol;41print(name4);42print(age4);43}4445class Idol {46final String name;47final int age;4849Idol({required this.name, required this.age});50}
3. 패턴 매칭
1void main() {2// Validation(유효성 검사)3final minJi = ('민지', 20);45final (name as String, age as int) = minJi;67print(name);8print(age);910// switcher('aaa');11// switcher('bbb');12// switcher(['1', '2']);13// switcher([1, 2, 3]);14// switcher([4, 5, 6]);15// switcher([4, 5, 6, 7]);16// switcher([6, 9]);17// switcher([6, '9']);18switcher(7);19switcher(17);2021print(switcher2(5, true));22print(switcher2(7, true));23print(switcher2(7, false));2425forLooper();2627ifMatcher();28}2930void switcher(dynamic anything) {31switch (anything) {32case 'aaa':33print('match : aaa');34break;35case ['1', '2']:36print('match : 1, 2');37break;38case [_, _, _]:39print('match : [_, _, _]');40break;41case [int a, int b]:42print('match : [int $a, int $b]');43break;44case < 10 && > 5:45print('match : < 10 && > 5');46break;47default:48print('no match');49}50}5152String switcher2(dynamic val, bool condition) => switch(val) {535 => 'match: 5',547 when condition => 'match 7 and true',55_ => 'no match',56}5758void forLooper() {59final List<Map<String, dynamic>> members = [60{'name': '민지', 'age': 20},61{'name': '민호', 'age': 30},62];6364for(final member in members) {65print(member['name']);66print(member['age']);67}6869print('-------------------');7071for(var {'name': name, 'age': age} in members) {72print(name);73print(age);74}75}7677void ifMatcher() {78final minJi = {79'name': '민지',80'age': 20,81};8283print('-------------------');8485if(minJi case {'name': String name, 'age': int age }) {86print(name);87print(age);88}89}
4. 클래스
4.1 final class
1// final로 클래스를 선언하면,2// 다른 파일에서 extends, implements, mixin을 사용할 수 없다.3final class Person {4final String name;5final int age;67Person({8required this.name,9required this.age,10})11}
4.2 base class
1// base로 선언하면 extends는 가능하지만, implements는 불가능하다.2// base, sealed, final로 선언된 클래스만 extends가 가능하다.3base class Person {4final String name;5final int age;67Person({8required this.name,9required this.age,10})11}
4.3 interface class
1// interface로 선언하면 implements만 가능하다.2interface class Person {3final String name;4final int age;56Person({7required this.name,8required this.age,9})10}
4.4 sealed class
1// sealed 클래스는 abstract이면서, final이다.2// 그리고 패턴매칭을 사용할 수 있도록 해준다.3sealed class Person{}45class Idol extends Person {}67class Engineer extends Person {}89class Chef extends Person {}1011String whoIsHe(Person person) => switch(person) {12Idol i => '아이돌',13Engineer e => '엔지니어',14_ => '나머지',15};
4.5 mixing class
1// Minxin Class2// 1) mixin은 extends나 with을 사용할 수 없다.3// 그렇기 떄문에 mixin class도 마찬가지로 사용 불가능하다.4// 2) 클래스는 on 키워드를 사용할 수 없다.5// 그렇기 떄문에 mixin class도 on z키워드를 사용할 수 없다.6mixin class AnimalMixin {7String bark() {8return '멍멍';9}10}