💡 이 글은 노마드코더의 Dart 시작하기 강의 내용을 토대로 정리한 글입니다.
Dart만이 가진 최소한의 개념 및 문법을 정리하였으며, 저를 포함한 Dart 입문자에게 조금이나마 도움이 되었으면 합니다. (피드백도 언제나 환영입니다!🫰)
강의 후기: 필수 개념을 간단하고 쉽게 전달하는 무료 강의! 영어로 진행되기 때문에 언어 공부까지 일석이조!
(물론 난 한글 자막 켜놓고 봤지만..)
Keyword | 의미 | 메모 |
---|---|---|
var | 타입 미지정 및 타입 변경 불가 | 주로 함수 내 지역 변수로 사용 |
dynamic | 타입 미지정 및 타입 변경 가능 | 되도록 쓰지 않는 것을 권장 |
type + ? | nullable 변수로 선언 | "Nullable variable" 설명 참고 |
final | 데이터 변경 불가 | run-time에 값 지정 |
const | 데이터 변경 불가 | compile-time에 값 지정 |
late | 늦은 초기화 선언 | final이나 var 앞에 사용 |
💡 Nullable variable ?
Dart의 모든 변수는 기본적으로 null값을 가질 수 없는 "non-nullable"이다.
이는 null값 참조로 인한 런타임 에러가 발생하지 않도록 하는 안전 장치가 된다.
하지만 경우에 따라 개발 시에 필요한 순간이 있을 것!
이 때 변수를 nullable하도록 선언하는 것이 “?” 키워드이다.
예시 코드
String? name = "developer"; name = null; // null 대입 가능 name.length; // null 참조 위험으로 error 발생 name?.length; // name이 null이 아니면 length 반환!
Keyword | 의미 | 메모 |
---|---|---|
num | int or double | |
List< type > | 데이터 컬렉션 | [ ]형태, 중복 가능 |
Set< type > | 데이터 컬렉션 | { }형태, 중복 불가능 |
Map< type, type > | {key:val}쌍의 데이터 컬렉션 | value의 type을 다양하게 사용 가능 (int, string, etc..) |
한 줄 짜리 함수라면 "=>"를 통해 간결히 작성 가능하다.
// 아래 두 함수는 동일한 의미
int add(int a + int b) { return a + b; }
int add(int a + int b) => a + b;
함수 param을 선언한 이름에 따라 기입하는 방식이다.
(💡 required: 함수 호출 시, 반드시 기입해야하는 매개변수로 지정하는 modifier)
void sayHello({required String name, required int age})
{
print("Hello, my name is $name and I'm $age.");
}
void main()
{
sayHello(
name: "kim",
age: 97
);
}
>> Hello, my name is kim and I'm 97.
// 1. ??
// name이 null이면 "anonymous"를,
// 아니면 대문자로 변환된 값을 반환
String capitalizeName(String? name) => name?.toUpperCase() ?? "anonymous"
// 2. ??=
void main()
{
String? name;
name ??= 'kim';
name ??= 'another'; // null이 아니므로 대입 불가
print(name);
}
>> kim
class Player
{
final String name;
int hp;
Player(this.name, this.hp); // 생성자를 해당 형식으로 간단히 작성 가능
}
void main()
{
Player player = Player('kim', 100);
}
class Player
{
final String name;
int hp;
String team;
int age;
// named parameter 적용
Player({
required this.name,
required this.hp,
required this.team,
required this.age
});
// team, hp는 기본값 지정
Player.createBluePlayer({required String name, required int age})
: this.name = name, this.age = age, this.team = 'blue', this.hp = 0;
}
void main()
{
Player player = Player(name: 'kim', hp: 100, team: 'red', age: 97);
Player bluePlayer = Player.createBluePlayer(
name: 'park',
age: 98
);
}
// class Player는 상단에 작성한 것으로 가정.
void main()
{
Player player = Player(name: 'kim', hp: 100, team: 'one', age: 97)
..name = 'new' // player.name과 동일
..hp = 120000 // player.hp와 동일
..team = 'two'; // player.team과 동일. ;은 맨 마지막 라인에만 작성
}
enum Team
{
red,
blue
}
class Player
{
final String name;
int hp;
Team team; // String대신 enum 적용
int age;
...
}
void main()
{
Player player = Player(
name: 'kim',
hp: 100,
team: Team.red, // 'red'대신 enum 적용
age: 97
);
}
abstract class Human
{
void walk(); // * C++의 순수 가상 함수 느낌
}
class Player extends Human
{
void walk() { print("player is walking"); } // * 추상 클래스의 함수를 반드시 정의
}
abstract class Human
{
final String name;
Human({required this.name});
void sayHello() { print('Hello my name is $name'); }
}
class Player extends Human // "extends" 키워드로 상속
{
final Team team;
...
Player({required this.team, this.name})
: super(name: name); // * super(~)로 부모 클래스 생성자에 param 전달
void sayHello()
{
super.sayHello(); // * super.으로 함수 접근 가능
print("and I play for $team");
}
}
Mixin은 생성자가 없는 클래스로, 다른 클래스에서 Mixin의 프로퍼티나 메소드를 가져와 사용할 수 있다. (상속은 ❌)
class Strong
{
const double strength = 96.129;
}
class Fast
{
const double speed = 99.828;
}
class Player with Strong, Fast // "with" 키워드로 선언
{
...
}