1. #4.0 Your First Dart Class (04:42)
클래스(객체)에 대해 배워보자...
Dart의 Class는 메인디쉬라고 볼 수 있다.
많은 클래스를 만들고 사용하게 될 것이다.
타 언어 클래스들과의 타이점도 알아보자.
프로퍼티(property)는 일부 객체 지향 프로그래밍 언어에서 필드(데이터 멤버)와 메소드 간 기능의 중간인 클래스 멤버의 특수한 유형이다. 프로퍼티의 읽기와 쓰기는 일반적으로 게터(getter)와 세터(setter) 메소드 호출로 변환된다.
기본 클래스 생성 틀
<cpp />
class Player {
String name = 'nico';
int xp = 1500;
}
void main() {
var player = Player();
var player1 = new Player(); // 이렇게 new를 붙여서 생성하는것도 가능하긴 하지만 안해도 됨
print(player.name); //nico
player.name = 'lalala';
print(player.name); //lalala
}
final과 class 내 함수
지역변수, this
<cpp />
class Player {
final String name = 'nico';
int xp = 1500;
void sayHello() {
//지역변수로 동일한 변수명이 있다면, 선언 전이라도 객체의 변수가 동작하도록 컴파일되지 않음
//print("name : $name");
var name = '니코';
print("Hi my name is $name");
print("again, my name is $this.name"); //동작은 함. this만 $로 인식
print("sorry. my name is ${this.name}"); //중괄호({})로 잘 묶어주어야 함.
//하지만, 변수명이 겹치는 등의 특수한 경우를 제외하면 Class method 내의 this는 권장 x.
}
}
void main() {
var player = Player();
var player1 = new Player(); // 이렇게 new를 붙여서 생성하는것도 가능하긴 하지만 안해도 됨
print(player.name); //nico
//player.name = 'lalala'; //final을 통해 값을 변경할 수 없도록 했기때문에 불가능한 코드가 됨
player.sayHello(); //똑같은 name을 통해 출력해도 this 여부에 따라 다르게 출력함을 알 수 있음.
/*
Hi my name is 니코
again, my name is Instance of 'Player'.name
sorry. my name is nico
*/
}
다음시간에는 생성자
2. #4.1 Constructors (03:58)
생성자
argument(인수)로 값을 전달해 그걸 받아 생성한다.
<cpp />
class Player {
//변수 선언은 했지만, 생성자를 통해 값을 지정해야 하기 때문에 late로 나중에 값을 지정함을 알린다.
late final String name;
late int xp;
Player(String name, int xp){
this.name = name;
this.xp = xp;
}
void sayHello() {
print("Hi my name is $name, and xp is $xp");
}
}
class Player2 {
//생성자를 통해 변수가 생성된다고 보는건가봄. late는 필요 없어짐.
final String name;
int xp;
Player2(this.name, this.xp); //인자의 위치, 변수명과 변수타입이 정해져 있으므로...
void sayHello() {
print("Hi my name is $name, and xp is $xp");
}
}
void main() {
var player = Player("nico", 1500);
player.sayHello(); //Hi my name is nico, and xp is 1500
var player1 = Player("lynn", 2000);
player1.sayHello(); //Hi my name is lynn, and xp is 2000
var player2 = Player2("tester", 2500);
player2.sayHello(); //Hi my name is tester, and xp is 2500
//Player클래스와 Player2 클래스는 생성자, late만 다를 뿐 완전 동일하게 동작한다 볼 수 있다.
}
3. #4.2 Named Constructor Parameters (04:12)
함수 사용할때처럼 순서(위치)가 아닌 이름을 통해 생성자 활용이 가능하다.
너무 많은 인수들이 붙어있으면 어지러워지고 헷갈린다.
다만 함수때처럼 nullable에 대한 처리를 해줄 필요가 있다.
<cpp />
class Player {
//생성자를 통해 변수가 생성된다고 보는건가봄. late는 필요 없어짐.
final String name;
int xp;
String team;
int age;
// Player(this.name, this.xp, this.team, this.age); //순서 방식
Player({
required this.name,
required this.xp,
required this.team,
required this.age,
}); //name 방식, 중괄호 추가
//nullable이 아니기 때문에 required를 해 주었음.
void sayHello() {
print("Hi my name is $name, and xp is $xp");
}
}
void main() {
// var player = Player("nico", 1500, "red", 15); //기존 방식, 뭐가 뭘 의미하는지 알 수 없음
var player = Player(
name: "nico",
xp: 1500,
team: "red",
age: 15,
);
player.sayHello(); //Hi my name is nico, and xp is 1500
var player1 = Player(
name: "lynn",
xp: 2000,
team: "blue",
age: 21,
);
player1.sayHello(); //Hi my name is lynn, and xp is 2000
}
4. #4.3 Named Constructors (07:28)
이름붙여진 생성자...
이전까지 한건 기본 생성자(기본 constructor)
하나의 클래스에 여러개의 생성자를 만들어주고 싶다면 어떻게 할까?
<cpp />
class Player {
final String name;
int xp;
String team;
int age;
Player({
required this.name,
required this.xp,
required this.team,
required this.age,
});
//콜론으로 1:1 생성자를 만들 수 있다(?)
Player.createBluePlayer({
required String name,
required int age,
}) : this.age = age,
this.name = name,
this.team = 'blue',
this.xp = 0;
//기본적으로 모든 positional은 required 이다.
Player.createRedPlayer(String name, int age)
: this.age = age,
this.name = name,
this.team = 'Red',
this.xp = 1;
void sayHello() {
print("Hi my name is $name, and xp is $xp");
}
}
void main() {
var player = Player.createBluePlayer(
name: "nico",
age: 15,
);
player.sayHello(); //Hi my name is nico, and xp is 0
var player1 = Player.createRedPlayer(
"lynn",
21,
);
player1.sayHello(); //Hi my name is lynn, and xp is 1
}
5. #4.4 Recap (04:45)
Dart의 constructor? class? 복습
<cpp />
class Player {
final String name;
int xp;
String team;
//Json을 받아오는 생성자 만들었음
Player.fromJson(Map<String, dynamic> playerJson)
: name = playerJson['name'],
xp = playerJson['xp'],
team = playerJson['team'];
void sayHello() {
print("Hi my name is $name, and xp is $xp");
}
}
void main() {
var apiData = [
{
"name": "nico",
"team": "red",
"xp": 0,
},
{
"name": "lynn",
"team": "red",
"xp": 0,
},
{
"name": "dal",
"team": "red",
"xp": 0,
},
];
//api데이타의 배열 하나하나 값을 forEach로 playerJson에 넣어 동작
apiData.forEach((playerJson){
var player = Player.fromJson(playerJson);
player.sayHello();
});
/*
Hi my name is nico, and xp is 0
Hi my name is lynn, and xp is 0
Hi my name is dal, and xp is 0
*/
}
6. #4.5 Cascade Notation (03:13)
Cascade Notation?
문법에 멋진 syntax suger(문법 사탕)을 추가하는게 우리 삶을 편하게 한다.
객체 내의 property를 빠르게 제어.
함수도 사용 가능
<cpp />
class Player {
String name;
int xp;
String team;
Player({required this.name, required this.xp, required this.team});
void sayHello() {
print("Hi my name is $name, and xp is $xp");
}
}
void main() {
var player = Player(name: 'cho', xp: 20, team: 'blue');
player.sayHello(); //Hi my name is cho, and xp is 20
//값을 중간에 변경하게 된다면 어떻게 될까?
var player1 = Player(name: 'kay', xp: 20, team: 'blue')
// 아래 ..에서 앞의 점은 player1을 가리킴
..name = 'las'
..xp = 12000
..team = 'green';
player1.sayHello(); //Hi my name is las, and xp is 12000
//클래스 생성 직후가 아니여도 사용할 수 있다.
var potato = player1
..name = 'jay'
..xp += 100
..team = 'red'
..sayHello(); //Hi my name is jay, and xp is 12100
}
7. #4.6 Enums (03:12)
Enums...실수방지?
enum Team { red, blue } 처럼 선언한다.
"red", "blue"처럼 감싸지 않는다.
선언할일보다는 쓸 일이 많을 것...
어떤 값이든 만들 수 있다...
<cpp />
enum Team { red, blue }
enum XPLevel { begginer, medium, pro }
class Player {
String name;
XPLevel xp;
Team team;
Player({required this.name, required this.xp, required this.team});
void sayHello() {
print("Hi my name is $name, and xp is ${xp.name}. Team is $team");
}
}
void main() {
var player = Player(name: 'cho', xp: XPLevel.begginer, team: Team.blue);
player.sayHello(); //Hi my name is cho, and xp is begginer. Team is Team.blue
var player1 = Player(name: 'kay', xp: XPLevel.begginer, team: Team.blue)
// 아래 ..에서 앞의 점은 player1을 가리킴
..name = 'las'
..xp = XPLevel.medium
..team = Team.red;
player1.sayHello(); //Hi my name is las, and xp is medium. Team is Team.red
//클래스 생성 직후가 아니여도 사용할 수 있다.
var potato = player1
..name = 'jay'
//..xp += 100
..xp = XPLevel.pro
..team = Team.red
..sayHello(); //Hi my name is jay, and xp is pro. Team is Team.red
}
8. #4.7 Abstract Classes (03:53)
Abstract Classes
추상메소드와 추상클래스
추상클래스는 일종의 청사진
자주 쓸 일은 없겠지만 유용하다.
이건 @override와같은 에노테이션은 없는것으로 보인다...는 아닌가
어쨋든 상속받으면 부모가상클래스에 있는 함수를 구현해야 한다는 것
<cpp />
abstract class Human {
//이 추상화 클래스는 어떤 메소드를 가지고
//어떤걸 리턴하고 어떤걸 받는지
void walk();
}
enum Team { red, blue }
enum XPLevel { begginer, medium, pro }
class Player extends Human{ //추상클래스를 상속받을때는 extends
String name;
XPLevel xp;
Team team;
Player({required this.name, required this.xp, required this.team});
void walk(){
print('im walking');
}
void sayHello() {
print("Hi my name is $name, and xp is ${xp.name}. Team is $team");
}
}
class Coach extends Human {
void walk(){
print('Make player walk');
}
}
void main() {
var player = Player(name: 'cho', xp: XPLevel.begginer, team: Team.blue);
player.sayHello(); //Hi my name is cho, and xp is begginer. Team is Team.blue
var player1 = Player(name: 'kay', xp: XPLevel.begginer, team: Team.blue)
// 아래 ..에서 앞의 점은 player1을 가리킴
..name = 'las'
..xp = XPLevel.medium
..team = Team.red;
player1.sayHello(); //Hi my name is las, and xp is medium. Team is Team.red
//클래스 생성 직후가 아니여도 사용할 수 있다.
var potato = player1
..name = 'jay'
//..xp += 100
..xp = XPLevel.pro
..team = Team.red
..sayHello(); //Hi my name is jay, and xp is pro. Team is Team.red
}
9. #4.8 Inheritance (08:34)
상속
다중상속은 안되는듯?
<cpp />
class Human {
final String name;
Human({required this.name});
// Human(this.name);
void sayHello() {
print("Hi, my name is $name");
}
}
enum Team { blue, red }
class Player extends Human {
final Team team;
Player({
required this.team,
required String name,
}) : super(name: name); //super을 통해 확장한 부모클래스와 상호작용 가능
// : super(name); //주석버전으로도 사용 가능.(name으로 생성 안하고 required 없이)
@override
void sayHello() {
super.sayHello();
print("name : $name, team : ${team}");
}
}
void main() {
var player = Player(
team: Team.red,
name: 'nico',
);
player.sayHello();
/*
Hi, my name is nico
name : nico, team : Team.red
*/
}
10. #4.9 Mixins (04:16)
Mixins : 생성자가 없는 클래스
mixins는 여러 클래스에서 사용될 수 있고, 또 많이 반복된다.
Mixin의 조건은 생성자가 없는 클래스여야 한다.
<cpp />
class Strong {
final double strengthLevel = 1500.99;
}
class QuickRunner {
void runQuick() {
print("ruuuuuuuuuuun!!!!");
}
}
class Tall {
final double height = 1.99;
}
class Player with Strong, QuickRunner, Tall {
final Team team;
Player({
required this.team,
});
}
enum Team { blue, red }
class Horse with Strong, QuickRunner {}
class Kid with QuickRunner {}
void main() {
var player = Player(
team: Team.red,
);
print(player.height); //1.99
print(player.strengthLevel); //1500.99
}
11. #4.10 Conclusions (02:45)
결말
중요한것들만 골라 배운것일뿐, Dart의 모든것이 아니다.
다음은 flutter-for-begginers로 넘어가보자.
Dart에서 배운것들 활용...
'공부 > Dart' 카테고리의 다른 글
Dart 시작하기 #3 FUNCTIONS (0) | 2023.01.31 |
---|---|
Dart 시작하기 #2 DATA TYPES (0) | 2023.01.31 |
Dart 시작하기 #1 VARIABLES (0) | 2023.01.20 |
Dart 시작하기 #0 INTRODUTION (0) | 2023.01.20 |