Dart 나머지 내용을 notion에만 정리하고 한동안 velog에 옮기지 못했었다. 노마드코더 강의의 나머지 내용이다. 이 강의는 총 2시간 반정도로 짧기 때문에 얼른 듣고 Flutter 강의로 넘어갔다.
FUNCTION
C언어와 비슷하게 만들 수 있다. main함수에서 만든 함수를 호출한다.
하지만 자바스크립트처럼 화살표를 사용할 수 있다. fat arrow syntex라고 하는데 이는 곧바로 return하는 것과 같은 의미이다.
String sayHello(String potato) {
return "helo $potato";
}
//같은 의미이다.
String sayHello(String potato) ⇒ “hello $potato”;
Named parameters
named argument를 사용하면 더 명시적으로 parameter들을 전달할 수 있다.
named argument는 이렇게 사용한다.
sayHello (
name : 'lee',
age : 10,
country: 'cuba'
)
Function에서 파라미터들의 괄호 안에 중괄호를 더해주면 named argument를 사용할 수 있게 된다. Formatting을 위해 ‘,’도 중괄호 안에 붙여준다. 그리고 이때 값을 못 받을 경우를 대비해 default value값을 지정해줄 수 있다. 그냥 중괄호 안에 ‘parameter이름 = 디폴트’ 값 해주면 된다.
아니면 required modifier를 이용할 수 있다. 모든 parameter들의 자료형 앞에 required라고 적으면 그 값이 필수가 되서 compile이 안되게 한다.
positional parameter → 파라미터들의 순서 중요 , named parameter → 순서는 중요하지 않다.
Optional positional parameters
순서에 맞춰서 써야한다. 원래 다 required.
한개만 required하지 않기 위해서는 그 부분만 대괄호로 감싸주고 그 자료형 뒤에 ‘?’를 붙여서 없을 수도 있다는 것을 표시하고 default value를 더해준다. 이것보다는 그냥 named parameter 쓰는 것이 나을 듯.
QQ Operation
‘?’를 넣어서 null을 받을 수 있게 해주는데, null일지도 모르는 값에 쓸 수 없는 함수를 써주기 위해서는
ex)
name != null ? name.toUpperCase() : ‘ANON’
라고 쓸 수 있다. 이건 다른 언어에서 사용하는 것과 동일하다.
그런데 이 것을 ‘??’를 쓰면 더 짧게 할 수 있다.
name.toUpperCase() ?? ‘ANON’이면 같은 의미이다.
null이 아니면 right아니면 left를 return하면 된다.
name ??= ‘lee’ 이렇게도 사용 가능. 이건 name이 null이면 ‘lee’를 name에 넣으라는 의미이다.
Typedef
자료형이 헷갈릴 때 alias를 붙일 수 있게 만드는 것 . 자료형의 이름을 지정할 수 있다.
Dart Class
다트에서는 class의 object를 만들 때 앞에 new를 붙이지 않아도 instance가 생성된다. dart에서는 this를 사용하지 않는 것을 권고한다.
Constructors
contructor method(class명과 동일)를 만들어서 class의 변수값을 받아올 수 있다. 이때 late을 변수의 변수형 앞에 적어서 오류를 막는다. 나중에 받아올 것을 명시. 이 때 late를 지우고 바로 파라미터에 적으면 더 짧게 나은 코드를 작성할 수 있다.
//기존 코드
class Player{
late final String name;
late int xp;
}
Player(String name, int xp){
**this.name = name,
this.xp = xp;
}**
//바꾼 코드
class Player{
final String name;
int xp;
}
****Player(this.name, this.xp);
required named parameter
Player({
required this.name,
required this.xp,
required this.team,
required this.age,
});
named constructors
//':' dart의 고유 문법, class의 property들을 초기화해준다.
Player.createBluePlayer({
required String name,
required int age
}) : this.age = age,
this.name = name,
this.team = "blue",
this.age = 0;
fromJson
flutter 앱이 사용하는 패턴
Player.fromJson(Map<String, dynamic> playerJson)
: name = playerJson[’name’],
xp = playerJson[’xp’],
team = playerJson[’team’];
//api값을 player class로 만들기
apiData.forEach((playerJson) {
var player = Player.fromJson(playerJson);
})
Cascade Notation
문법에 더해주는 것(syntax sugar)
x.name = ‘y’
이런식의 코드를 계속 반복하는 대신 cascade operator를 사용할 수 있다.
var nico = Player(name: 'nico', xp: 1200, team: 'red') //;세미클론 제거
..name = 'las'
.. xp = 1200000
..team = 'blue'; //여기에 세미클론
}
이렇게 더 적은 코드로 쓸 수 있다. 바로 이어서 쓸 필요 없다. 제거했던 세미클론을 적고 아래에 다른 코드를적은 후에도 가능하다.
Enums
선택의 폭을 좁혀준다. C언어와 똑같이 사용 가능하다. 선택할 것이 정해져 있으니 실수를 줄일 수 있다.
Abstract classes
추상화 클래스로는 객체를 생성할 수 없다. 추상화 클래스를 이용해 이를 상속받아서 구현 가능. Flutter에서는 많이 사용하지 않는다.
Inheritance
Flutter에서는 가끔씩만 사용된다. 원래 알던 다른 언어에서의 개념이랑 동일하다.
class Player extends Human {
final Team team;
Player({
Required this.team,
Required String name
}) : super(name) //name은 슈퍼클래스인 human의 변수이기 때문에 superclass로 전달한다.
//슈퍼클래스의 함수를 오버라이딩
void sayHello(){
super.sayHello(); //superclass의 함수를 그대로 사용할 수도 있다.
print('and I play for ${team}');
}
}
Mixins
Flutter에서 자주 사용한다. 생성자가 없는 클래스를 의미한다. 클래스에 property들을 추가할 때 사용한다. 이런 property들을 추가하기 위해 생성된 mixin들은 extends를 이용해서 상속받는 것이 아니라 with를 사용해 다른 클래스의 프로퍼티와 메소드를 긁어온다. 여기서 중요한 점은 mixin을 여러 클래스에서 재사용하는 것이다. 한번만 사용하는 것은 의미가 없다. 상속과는 전혀 다르다.