다트에서의 클래스에 대한 개념은 매우 중요하다!!
다트의 거의 모든 것은 클래스로 이루어져 있어서 매우 큰 비중을 차지하기 때문에 잘 알아둬야 한다.
먼저 클래스를 생성해보자.
class Player{
final String name = 'sso'; // 초기값을 고정하고 싶다면 final 명시
int xp = 1500; // 클래스에서 속성들은 꼭 타입을 명시해서 선언
void sayHello(){
print('Hi, My name is $name'); // this를 사용하지 않음
}
}
void main(){
var player = Player(); // 인스턴스 생성 new를 사용하지 않음
player.sayHello(); // Hi, My name is sso
}
위의 코드를 통해 다트의 클래스는 다른 언어의 클래스들과 어떤 점이 다른지 알아보자.
this
를 사용하지 않는 것을 권고한다.this
를 사용하지 않는 것을 권고한다.new
키워드를 사용하지 않아도 된다.이번에는 생성자에 대해서 알아보자.
다트에서 생성자를 만드는 것은 매우 간단하다!
class Player{
final String name;
int xp;
Player(this.name, this.xp); // constructor
void sayHello(){
print('Hi, My name is $name');
}
}
void main(){
var player = Player('sso', 1500);
player.sayHello(); // Hi, My name is sso
var player2 = Player('ssoo', 2000);
player2.sayHello(); // Hi, My name is ssoo
}
❗️주의❗️
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 클래스에 인자들을 전달해 줄 때 순서(positional arguments)를 지켜야 한다.
앞에 함수에서 배운 내용처럼 파라미터가 많아지면 이 파라미터들의 순서를 기억하는 것이 힘들다.
클래스에서도 마찬가지로 클래스가 커지고 속성들이 많아지면 이것들의 순서를 기억하는 것이 번거로울 수 있다.
이러한 불편함을 해소하기 위해 함수에서 처럼 클래스에서도 named constructor parameter를 사용할 수 있다!
사용 방법도 함수에서와 같다. (매우 쉽죵)
class Player{
final String name;
int xp;
String team;
Player({
required this.name,
required this.xp,
required this.team,
});
void sayHello(){
print('Hi, My name is $name');
}
}
void main(){
var player = Player(
name: 'sso',
xp: 1500,
team: 'red',
);
}
required
를 사용하고 싶지 않다면 초기값을 넣어주는 것도 방법이다.
이렇게 작성해주면 인스턴스를 생성할 때 인자들의 순서를 기억하지 못하더라도 클래스의 정의를 보고 쉽게 작성할 수 있다!
우리가 위에서 예시로 다뤘던 생성자는 Player
라는 클래스에서 자동으로 호출되는 생성자이다.
그런데 만약 특정 역할을 하는 생성자를 더 만들고 싶다면 어떻게 할까?
=> 그럴 경우에는생성자.만들생성자이름()
이런식으로 더 만들 수 있다.
예를 들어 빨간팀의 팀원을 생성하는 createRed
생성자와 파란팀의 팀원을 생성하는 createBlue
생성자를 각각 만들어보자.
class Player {
final String name;
int age;
String team;
// named parameter 사용
Player({
required this.name,
required this.team,
required this.age,
});
// named parameter
Player.createRed({
required String name,
required int age,
}) : this.age = age,
this.name = name,
this.team = 'red';
// positional parameter
Player.createBlue(String name, int age)
: this.age = age,
this.name = name,
this.team = 'blue';
void sayHello() {
print('Hi, My name is $name');
}
}
void main() {
var player = Player.createRed(name: 'sso', age: 23);
var player2 = Player.createBlue('ssoo', 24);
}
위처럼 만들어진 두 개의 생성자들은 각각 team
변수의 값을 지정된 값으로 초기화 해준다.
named constructor
를 만들 때 주의해야 할 점은 :
을 사용하는 문법이다.
지금까지는 그냥 괄호 안에서 값들을 초기화 해줬지만 named parameter
를 사용할 경우에는 :
뒤로 초기화 할 내용들을 작성해줘야 한다.
지금까지는 생성자를 만드는 방법과 사용하는 기본적인 문법에 대해서 알아보았다.
그런데 우리가 인스턴스를 생성하고 이후에 값을 바꾸고 싶다면 어떻게 할까?
아마 우리는 아래와 같이 코드를 작성할 것이다.
class Player{
String name;
int xp;
Player({
required this.name,
required this.xp,
});
void sayHello(){
print('Hi, My name is $name');
}
}
void main(){
var player = Player(name: 'sso', xp: 1500);
player.name = 'modify_name';
player.xp = 120000;
}
하지만 위의 코드에서는 player.
이 부분이 계속해서 반복된다는 단점이 있다.
이를 개선하기 위한 문법으로 cascade operator를 사용할 수 있다!
위의 코드를 이 연산자를 사용해 바꿔보자.
class Player{
String name;
int xp;
Player({
required this.name,
required this.xp,
});
void sayHello(){
print('Hi, My name is $name');
}
}
void main(){
var player = Player(name: 'sso', xp: 1500);
..name = 'modify_name'
..xp = 120000;
}
훨씬 코드가 간단해진 것을 볼 수 있다.
맨 앞에 위치한 .
이 바로 player
를 대체하는 것이다.
그리고 모든 줄에 세미콜론을 넣어줄 필요 없이 값을 변경하는 마지막 줄에만 세미콜론을 넣어주면 된다!
enum
은 타입스크립트에서 처음 배웠는데 다트에서도 enum
을 지원한다.
enum은 열거형으로 이 타입에 선언된 것들만 사용할 수 있도록 선택의 폭을 좁혀준다고 생각하면 된다.
enum Team {red, blue}
class Player{
String name;
int xp;
Team team;
Player({
required this.name,
required this.xp,
required this.team,
});
void sayHello(){
print('Hi, My name is $name');
}
}
void main(){
var player = Player(name: 'sso', xp: 1500, team: Team.red);
..name = 'modify_name'
..xp = 120000
..team = Team.blue;
}
이렇게 Team
이라는 enum 타입을 만들어주면 Team
이라는 타입을 가진 속성 team
의 값은 red
와 blue
밖에 될 수 없다.
이 외의 값을 넣어주려 하면 에러가 발생하게 된다.
이렇게 해주면 문자열을 직접 속성에 값을 넣어주는 것보다 타이핑 실수로 인한 에러를 방지하기에도 매우 좋기 때문에 열거형을 적극 활용하면 좋을 것 같다!!
클래스와 관련된 내용은 두 번에 나눠 포스팅을 작성할 예정이다:)
다음 포스팅도 곧 돌아올게용
-끝-