newChobo
Published 2023. 2. 1. 18:39
Dart 시작하기 #4 CLASSES 공부/Dart

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
profile

newChobo

@새로운뉴비

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!