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"));
}
파라미터 리스트에 중괄호 포함시켜 파라미터가 순서에 상관없게 넘겨 받는 문법
파라미터를 줘서 순서에 맞춰 작성도 가능하지만, 사용자는 순서에 맞는지 헷갈릴 수 있음
=> 함수 파라미터에 {}
로 묶고, 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',
));
}
함수 인자가 필수 값이 아닐 때 사용하는 문법
[]
으로 감싸져 있는 파라미터를 포지셔널 파라미터 => 선택적으로 생략 가능 (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));
}
좌항이 null 이면 우항을 return
String capitalizeName(String? name) => name?.toUpperCase() ?? 'ANON';
void main() {
print(capitalizeName('dart'));
print(capitalizeName(null));
}
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'}));
}
final
로 선언 가능argument 로 player 의 이름과 xp 를 전달해 새로운 Player 생성할 수 있도록 해보자!
long ver
short ver
파라미터 이름, 순서 등 기억하기 쉽지 않다!!!
=> 생성자 파라미터를 {}
로 묶고, 객체 생성시 키-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();
}
생성자 함수를 여러 개 만들고자 할 때 사용
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,
);
}
반복되는 클래스명을 ..
키워드로 사용
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;
}
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;
}
클래스의 시그니처만 구현하고 안의 내용은 구현하지 않음
이 추상클래스를 상속받은 클래스가 기능 구현
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;
}
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();
}
생성자가 없는 클래스
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,
);
}