티스토리 뷰

코딩/Dart

dart - class 정리

김기지 2024. 8. 22. 14:25

Class

Dart는 class와 mixin 기반 상속을 지원하는 객체지향언어

모든 객체는 class의 인스턴스이고 null을 제외한 class는 모두 Object에서 비롯한다.

 

🐾 property 선언

class에서 property를 선언할 때 타입을 사용한다.

class 메소드 안에서는 this를 쓰지 않는 것을 권장하기 때문에 변수를 바로 사용한다.

class Player {
  final String name = 'kiji'; // final을 붙이면 변수 수정 불가능
  int xp = 1500;

  void sayHello() {
    // print('Hi my name is ${this.name}'); 권장하지❌
    print('Hi my name is $name');
  }
}

void main() {
  var player = Player(); // new 연산자 없이 인스턴스 생성 가능
  // player.name = 'jiwon'; -> 수정 불가능
  print(player.name);
  player.sayHello();
}

 

 


🐾 Constructor

dart에서 생성자 함수는 클래스 이름과 같아야 한다.

 

방법 1. 파라미터를 받아와 할당하기

class Player {
  // 변수 선언은 했지만 값은 나중에 받아오기
  late final String name;
  late int xp;

  // dart에서 생성자 함수는 클래스 이름과 같아야함
  Player(String name, int xp) {
    this.name = name;
    this.xp = xp;
  }

  void sayHello() {
    print('Hi my name is $name');
  }
}

void main() {
// Player의 name과 xp를 전달해 새로운 player를 생성
  var player = Player('kiji', 1500);
  player.sayHello();
  var player2 = Player('tom', 2000);
  player2.sayHello();
}

 

 

방법 2. 받아온 파라미터를 각각 this로 바로 받기

class Player {
	final String name;
	int xp;

	Player(this.name, this.xp);
}

 

+ named constructor parameter 적용하기

함수의 매개변수를 중괄호로 묶어주면 함수를 호출할 때 매개변수의 이름과 값을 함께 요소들의 순서는 지키지 않아도 된다.

class Player {
	final String name;
	int xp, age; // 동일한 타입의 변수는 묶어서 선언 가능
	String team;
}

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

void main() {
// Player의 name과 xp를 전달해 새로운 player를 생성
  var player = Player('kiji', 1500);
  var player = Player(
    name: 'kiji',
    xp: 1500,
    team: 'red',
    age: 12,
  );
  player.sayHello();
  var player2 = Player('tom', 2000);
  var player2 = Player(
    name: 'tom',
    xp: 2000,
    team: 'blue',
    age: 12,
  );
  player2.sayHello();
}

 

파라미터의 수가 많아질수록 순서를 외우기 힘들고 직관적으로 알기 어렵기 때문에 named parameter를 사용하는 것이 좋다!

 

 

 


🐾 Named Constructor

하나의 클래스에서 여러개의 생성자를 정의할 수 있게 하는 생성자

:를 사용하면 특별한 생성자 함수를 만들 수 있다.

→ 콜론을 넣음으로써 dart에 여기서 객체를 초기화하라고 명령할 수 있음

 

1. named parameter

Player.createRedPlayer({
  required String name,
  required int age,
})  : this.age = age, // 전달된 인자로 할당
      this.name = name, // 전달된 인자로 할당
      this.team = 'red', // 기본값
      this.xp = 0; // 기본값

void main(){
	var redPlayer = Player.createRedPlayer(
		name: 'kiji',
		age: 20,
	);
}

 

 

2. positional parameter

Player.createBluePlayer(String name, int age)
    : this.age = age,
      this.name = name,
      this.team = 'blue',
      this.xp = 0;

void main(){
	var bluePlayer = Player.createBluePlayer(
		name: 'jiwon',
		age: 10,
	);
}

 

 

 


🐾 Cascade notation

...을 사용해 변수 또는 class를 가르킨다.

void main(){
  var kiji = Player(name: 'kiji', xp: 1200, team: 'red', age: 20)
  ..name = 'jiwon'
  ..age = 25; // .. -> kiji
}

 

 

 

 


🐾 Abstract class

추상화 클래스

다른 클래스들이 직접 구현해야하는 메소드들을 모아놓은 일종의 청사진으로 추상화 클래스에서는 기능을 구현하지 않는다.

단, 특정 메소드를 구현하도록 강제한다.

abstract class Human {
  // 메소드의 시그니쳐가 무엇인지 정의 -> 메소드의 이름과 반환 타입
  void walk();
}

class Player extends Human { // Human class를 확장
	void walk(){
		print('Im walking');
	}
}

 

 

 

 


🐾 inheritance

extends를 사용해 상속을 구현한다.

super를 통해 부모 클래스와의 상호작용을 할 수 있다.

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); // super를 사용해 부모 클래스의 생성자를 호출한 후 name을 전달
}

 

+ enum

더보기

열거형 타입

서로 연관된 상수를 모아 놓은 집합으로 개발 중 실수를 하지 않도록 도와줌

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

class Player {
	XPLevel xp;
	int age;
	Team team;
}

Player.createRedPlayer({
  required String name,
  required int age,
})  : this.age = age, // 전달된 인자로 할당
      this.name = name, // 전달된 인자로 할당
      this.team = Team.red, // 기본값
      this.xp = XPLevel.medium; // 기본값
      
      
Player.createBluePlayer(String name, int age)
    : this.age = age,
      this.name = name,
      this.team = Team.blue,
      this.xp = XPLevel.beginner;
    
    
void main(){
  var kiji = Player(name: 'kiji', xp: XPLevel.medium, team: Team.red, age: 20)
}

 

 

또는 @override를 사용해 부모 클래스의 객체를 받아올 수 있다.
class Player extends Human {
  final Team team;

  Player({
    required this.team,
    required String name,
  }) : super(name: name); 
  
  // @override를 사용해 부모 클래스의 객체를 받아올 수 있음
  @override
  void sayHello() {
    // super로 부모 클래스에 접근
    super.sayHello();
    // 직접 만든 메소드 추가하기
    print('and I play for $team');
  }
}

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

 

 

 

 


🐾 Mixin

생성자가 없는 클래스

 

💜 mixin vs extends 💜

더보기
  • extends -> 확장한 클래스는 부모 클래스가 됨
  • mixin -> 부모의 인스턴스 관계가 됨. 내부의 프로퍼티를 갖고 오는 것!

mixin 클래스는 상속을 할 때 extends를 하지 않고 with를 사용한다.

mixin의 핵심은 여러 클래스에 재사용이 가능하다는 점!

mixin class Strong {
  final double strengthLevel = 1500.99;
}

mixin class QuickRunner {
  void runQuick() {
    print('ruuuuuuuuun!');
  }
}

mixin class Tall {
  final double height = 1.99;
}


class Player with Strong, QuickRunner, Tall {}

class Horse with Strong, QuickRunner, Tall {}

class Kid with QuickRunner {}
728x90

'코딩 > Dart' 카테고리의 다른 글

dart - 자료형 정리  (0) 2024.08.20
dart - 변수 선언 정리  (0) 2024.08.19