[ Dart ] Dart 시작하기 #3.0 ~ #4.10

·2023년 11월 1일
0

Mobile-Software

목록 보기
8/15
post-thumbnail

📍 FUNCTIONS

3.0 Defining a Function

void sayHello1(String name) {
  print("Hello $name nice to meet you!");
}

String sayHello2(String name) {
  return "Hello $name nice to meet you!";
}

String sayHello3(String name) => "Hello $name nice to meet you!";

void main() {
  sayHello1("dart1");
  print(sayHello2("dart2"));
  print(sayHello3("dart3"));
}

3.1 Named Prameters

파라미터 리스트에 중괄호 포함시켜 파라미터가 순서에 상관없게 넘겨 받는 문법

파라미터를 줘서 순서에 맞춰 작성도 가능하지만, 사용자는 순서에 맞는지 헷갈릴 수 있음
=> 함수 파라미터에 {} 로 묶고, main 함수에서 호출시 키값에 대응하는 value 값을 넣어주면 됨

dart 는 null safety 를 해주기 때문에
-> 파라미터의 값을 사용하는데 우리가 값을 주지 않으면 안됨
따라서,
1. 디폴트 매개변수로 선언
2. required 로 선언

String sayHello({String name = 'anon', int age = 10, String country = 'USA'}) {
  return "Hello $name nice to meet you! You're $age, and you come from $country.";
}

void main() {
  print(sayHello());
  print(sayHello(
    age: 12,
    country: 'korea',
    name: 'dart',
  ));
}


String sayHello({
  required String name,
  required int age,
  required String country,
}) {
  return "Hello $name nice to meet you! You're $age, and you come from $country.";
}

void main() {
  print(sayHello(
    age: 12,
    country: 'korea',
    name: 'dart',
  ));
}



3.3 Optional Positional Parameters

함수 인자가 필수 값이 아닐 때 사용하는 문법

[] 으로 감싸져 있는 파라미터를 포지셔널 파라미터 => 선택적으로 생략 가능 (null safety 적용)
파라미터 순서들을 맞춰주어야함

String sayHello(String name, int age, [String? country = "USA"]) =>
    "Hello $name nice to meet you! You're $age, and you come from $country.";

void main() {
  print(sayHello('dart', 12));
}



3.4 QQ Operator

좌항이 null 이면 우항을 return

String capitalizeName(String? name) => name?.toUpperCase() ?? 'ANON';

void main() {
  print(capitalizeName('dart'));
  print(capitalizeName(null));
}



3.5 Typedef

typedef 를 이용해 함수 타입을 미리 정의해 복잡한 구조의 타입을 미리 정의해 재사용성을 높임

typedef ListOfInts = List<int>;

List<int> reverseListOfNumbers(List<int> list) {
  var reversed = list.reversed;
  return reversed.toList();
}

void main() {
  reverseListOfNumbers([1, 2, 3]);
}
typedef UserInfo = Map<String, String>;

String sayHi(UserInfo userInfo) {
  return "Hi, ${userInfo['name']}";
}

void main() {
  print(sayHi({'name': 'dart'}));
}





📍 CLASSES

4.0 First Dart Class


  • Player 의 name 변경하지 못하도록 final 로 선언 가능



4.1 Constructors

argument 로 player 의 이름과 xp 를 전달해 새로운 Player 생성할 수 있도록 해보자!

  • long ver

  • short ver


4.2 Named Constructor Parameters

파라미터 이름, 순서 등 기억하기 쉽지 않다!!!
=> 생성자 파라미터를 {} 로 묶고, 객체 생성시 키-value 로 값 할당

class Player {
  final String name;
  int xp;
  String team;
  int age;

  void sayHello() {
    print("Hi my name is $name");
  }

  Player({
    required this.name,
    required this.xp,
    required this.team,
    required this.age,
  });
}

void main() {
  var player = Player(
    name: 'dart',
    xp: 1500,
    team: 'red',
    age: 10,
  );
  player.sayHello();
  var player2 = Player(
    name: 'flutter',
    xp: 1200,
    team: 'blue',
    age: 15,
  );
  player2.sayHello();
}


4.3 Named Constructors

생성자 함수를 여러 개 만들고자 할 때 사용

class Player {
  final String name;
  int xp, age;
  String team;

  void sayHello() {
    print("Hi my name is $name");
  }

  Player({
    required this.name,
    required this.xp,
    required this.team,
    required this.age,
  });

  Player.createBluePlayer({
    required String name,
    required int age,
  })  : this.age = age,
        this.name = name,
        this.team = 'blue',
        this.xp = 0;

  Player.createRedPlayer(String name, int age)
      : this.age = age,
        this.name = name,
        this.team = 'red',
        this.xp = 8;
}

void main() {
  var blueplayer = Player.createBluePlayer(
    name: 'dart',
    age: 10,
  );

  var redplayer = Player.createRedPlayer(
    'flutter',
    15,
  );
}



4.5 Cascase Notation

반복되는 클래스명을 .. 키워드로 사용

class Player {
  String name, team;
  int xp, age;

  void sayHello() {
    print("Hi my name is $name");
  }

  Player({
    required this.name,
    required this.xp,
    required this.team,
    required this.age,
  });
}

void main() {
  var player = Player(
    name: 'dart',
    xp: 12,
    team: 'red',
    age: 22,
  )
    ..name = 'flutter'
    ..xp = 9
    ..team = 'blue'
    ..age = 20;
}



4.6 Enums

enum Team { red, blue }
enum xpLevel { beginner, medium }

class Player {
  String name;
  xpLevel xp;
  int age;
  Team team;

  void sayHello() {
    print("Hi my name is $name");
  }

  Player({
    required this.name,
    required this.xp,
    required this.team,
    required this.age,
  });
}

void main() {
  var player = Player(
    name: 'dart',
    xp: xpLevel.medium,
    team: Team.blue,
    age: 22,
  )
    ..name = 'flutter'
    ..xp = xpLevel.beginner
    ..team = Team.red
    ..age = 20;
}



4.7 Abstract Classes

클래스의 시그니처만 구현하고 안의 내용은 구현하지 않음
이 추상클래스를 상속받은 클래스가 기능 구현

abstract class Human {
  void walk();
}

enum Team { red, blue }
enum xpLevel { beginner, medium }

class Player extends Human {
  String name;
  xpLevel xp;
  int age;
  Team team;

  void sayHello() {
    print("Hi my name is $name");
  }

  Player({
    required this.name,
    required this.xp,
    required this.team,
    required this.age,
  });

  void walk() {
    print("I'm walking..!");
  }
}

void main() {
  var player = Player(
    name: 'dart',
    xp: xpLevel.medium,
    team: Team.blue,
    age: 22,
  )
    ..name = 'flutter'
    ..xp = xpLevel.beginner
    ..team = Team.red
    ..age = 20;
}



4.8 Ingeritance

extends 키워드를 통해 자식은 부모로부터 상속받을 수 있음
super 키워드를 통해 자식은 부모의 프로퍼티에 접근 가능
override 로 부모의 메소드 재작성 가능

class Human {
  final String name;
  Human(this.name);
  void sayHello() {
    print("Hi my name is $name");
  }
}

enum Team { red, blue }

class Player extends Human {
  final Team team;

  Player({
    required this.team,
    required String name,
  }) : super(name);

  
  void sayHello() {
    super.sayHello();
    print('and I play for $team');
  }
}

void main() {
  var player = Player(
    team: Team.red,
    name: 'dart',
  );
  player.sayHello();
}



4.9 Mixins

생성자가 없는 클래스

Quick 과 Strong 크래스에 있는 프로퍼티와 메소드를 Player 에 담아주기 위해
-> with 키워드 사용

class Strong {
  final double strengthLevel = 1500.99;
}

class QuickRunner {
  void runQuick() {
    print('ruuuuuuuuuuuuuun');
  }
}

enum Team { red, blue }

class Player with Strong, QuickRunner {
  final Team team;

  Player({
    required this.team,
  });
}

void main() {
  var player = Player(
    team: Team.blue,
  );
}




📚 노마드 코더 < Dart 시작하기 >


0개의 댓글