[Dart] 4. Class 클래스 #2

yunulog·2023년 1월 3일
0

Dart

목록 보기
5/5

전편 [Dart] 4. Class 클래스 #1 보기

5. Cascade Notation

우선 간단한 class 생성자를 만들어보도록 한다.

class Player {
  String name;
  int xp;
  String team;

  Player({required this.name, required this.xp, required this.team});

  void sayHello () {
    print("안녕 내 이름은 $name");
  }
}

void main() {
  var nico = Player(name: 'nico', xp: 1200, team: 'red')
  nico.name = 'las';
  nico.xp = 1200000;
  nico.team = 'blue'
	..sayHello();
	// 안녕 내 이름은 las
}

‘nico’라는 Player를 만들고 데이터를 재할당했다.

이 코드를 더 간단하게 만들 수 있다.

main 함수 안에서 nico. 이라는 코드를 점 두개 ( .. )로 바꾸고
마지막 세미콜론을 제외한 세미콜론을 지워주면 된다.

class Player {
  String name;
  int xp;
  String team;

  Player({required this.name, required this.xp, required this.team});

  void sayHello () {
    print("안녕 내 이름은 $name");
  }
}

void main() {
  var nico = Player(name: 'nico', xp: 1200, team: 'red')
  ..name = 'las'
  ..xp = 1200000
  ..team = 'blue'
	..sayHello();
	// 안녕 내 이름은 las
}

..은 바로 앞에 생성된 클래스를 가리키는 역할을 해준다.

6. Enums

Enum은 사용자가 코드를 작성할때 선택지를 좁혀주는 역할을 해준다.
즉, 코드의 선택지를 미리 정해둠으로써 사용자가 오타를 치거나 가능한 선택지 이외의 데이터를 입력해서 오류가 생기는 것을 방지해준다.

enum을 만드는 방법은 간단하다.

  1. enum enum이름 { 데이터1, 데이터2, …} 의 형태로 만들어준다.
    중괄호 안에는 따옴표로 데이터를 묶어줄 필요가 없다.
  2. class에서 데이터를 참조할땐, 데이터 타입 대신 enum을 만들때 설정한 enum 이름 으로 바꿔준다.
  3. class 생성자를 사용할 때, 참조 데이터에 enum이름.데이터를 넣어주면 된다.
enum Team {red, blue}
enum XPLevel {beginner, medium, pro}

class Player {
  String name;
  XPLevel xp; //이제 xp에는 beginner, medium, pro 세가지 데이터만 넣을 수 있다
  Team team; //이제 team에는 red, blue 두가지 데이터만 넣을 수 있다

  Player({required this.name, required this.xp, required this.team});

  void sayHello () {
    print("안녕 내 이름은 $name");
  }
}

void main() {
  var nico = Player(name: 'nico', xp: XPLevel.beginner, team: Team.blue)
  ..name = 'las'
  ..xp = XPLevel.medium
  ..team = Team.red
  ..sayHello(); 
}

**7. Abstract Classes**

추상화 클래스란 다른 클래스들이 직접 구현해야하는 메소드들을 모아놓은 일종의 청사진이다.

abstract class class이름 { } 안에 메소드들을 넣어주면 된다.

다른 클래스들은 이 추상화 클래스를 상속받아서 정의된 메소드들을 실행해줄 수 있다.

abstract class Human {
  void walk();
}

enum Team {red, blue}
enum XPLevel {beginner, medium, pro}

class Player extends Human{
  String name;
  XPLevel xp;
  Team team;

  Player({required this.name, required this.xp, required this.team});

  void walk() {
    print('Im working');
  }
  void sayHello () {
    print("안녕 내 이름은 $name");
  }
}

class Coach extends Human {
  void walk() {
    print('the coach is walking');
  }
}

void main() {
  var nico = Player(name: 'nico', xp: XPLevel.beginner, team: Team.blue)
  ..name = 'las'
  ..xp = XPLevel.medium
  ..team = Team.red
  ..sayHello();
}

(솔직히 언제 어디서 써야 편리한건지 아직은 모르겠다…😰)

8. **Inheritance**

상속은 다른 클래스의 속성들을 그래도 받아와 사용할 때 편리하다.

우선 Human이라는 클래스를 만들어주었다.

class Human {
  final String name;
  Human(this.name);
  
  void sayHello () {
    print("Hi my name is $name");
  }
}

void main() {
}

그 다음 Player 라는 클래스를 만들건데 Human 클래스의 모든 속성을 가져와서 사용하려 한다.
이 때, Human 클래스의 코드를 복붙하는 대신, extends를 이용해서 상속받아올 수 있다.

class Human {
  final String name;
  Human({required 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);
  
  
  void sayHello(){
    super.sayHello();
    print('and I play for $team');
  }
}

void main() {
  var player = Player(team: Team.red, name:'AAA');
  player.sayHello();
}

super를 이용해서 부모 클래스의 요소들을 상속받을 수 있으며
@override를 통해 부모 클래스의 메소드를 상속받을 수 있다.

상속을 하는 순간 부모 클래스와 자식 클래스의 관계가 정해지고
자식 클래스는 부모 클래스의 인스턴스가 된다.

9. Mixins

mixin은 생성자가 없는 클래스를 의미한다.

with를 이용해서 다른 클래스의 property들을 가져와 사용할 수 있다.

상속과 달리 부모 클래스의 인스턴스가 되지 않으며 단지 요소들만 가져와서 사용할 뿐이다.

// mixin 클래스들
class Strong {
  final double strengthLevel = 1500.99;
}
class QuickRunner {
  void runQuick() {
    print('runnnnn!!');
  }
}
class Tall {
  final double height = 1.99;
}

enum Team {blue, red}

// with로 클래스들의 요소들을 가져올 수 있다
class Player with Strong, QuickRunner, Tall {
  final Team team;
  
  Player({
    required this.team,
  });
  
	//@override로 다른 클래스의 메소드를 가져올 수 있다
  
  void sayHello(){
    print('and I play for $team');
  }
}

class Horse with Strong, QuickRunner {}

class Kid with Strong {}

void main() {
  var player = Player(team: Team.red);
  player.runQuick();
}

<참고>
[노마드코더] Dart 강좌

0개의 댓글