본문 바로가기
Flutter 공부

Dart: class

by 두 그루 2023. 4. 6.

class

class Player {
	String name = 'hwido';
	int xp = 999;
	void sayHello() {
		print('hi my name is $name');
	}
}

void main() {
	var player1 = Player();
	print(player1.name);
	player1.sayHello();
}

위처럼 Player라는 클래스를 만들어 멤버 변수와 메소드를 설정했다. main에서는 객체를 만들어 값을 프린트하거나 메소드를 활용했다.
 
 
 

constructor

class Player {
	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 ($xp)');
	}
}

void main() {
	var player1 = Player('hwido', 99);
	print(player1.name);
	player1.sayHello();
}

생성자를 클래스명(매개변수) {}로 만들 수 있다. 
 
그리고 위 코드의 4 ~ 7번 째 줄은 아래로 줄여서 쓸 수 있다.

Player(this.name, this.xp);

 
 
 

class Player {
	final String name;
	int xp;
	String team;
	int grade;
	Player({required this.name, required this.xp, required this.team, required this.grade,});
	void sayHello() {
		print('$name, $xp, $team, $grade');
	}
}

void main() {
	var player1 = Player(
		name: 'hwido',
		xp: 99,
		team: 'Only one',
		grade: 100,
	);
  player1.sayHello();
}

생성자의 매개변수가 많아질 땐 함수를 정의할 때 작성한 방법과 동일하게 null의 포함 여부를 제거하고, 객체를 생성할 때도 인자를 작성해서 값을 전달할 수 있다.


named constructor

class Player {
	final String name, team;
	int xp, grade;

	Player({
		required this.name,
		required this.xp,
		required this.team,
		required this.grade,		
	});
	Player.createRedPlayer({required String name, required int grade }) :
		this.grade = grade,
		this.name = name,
		this.xp = 10,
		this.team = "Red";

	Player.createBluePlayer(String name, int grade) :
		this.grade = grade,
		this.name = name,
		this.xp = 0,
		this.team = "Blue";
  
   sayHello() {
      print("$name / $team / $xp / $grade");
   }
 }

void main() {
	var player1 = Player.createRedPlayer(
		name: "halo",
		grade: 4,
	);
   player1.sayHello();
	var player2 = Player.createBluePlayer("sky", 5);
   player2.sayHello();
}

이렇게 클래스명.생성자 이름(매개변수) : 를 작성하여 특정 생성자를 만들 수 있다. Red, Blue라는 특정 팀의 팀원을 생성하도록 설정했다.



+ cascade notation

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

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

	sayHello() {
    print("$name / $team / $xp / $grade");
  }
}

void main() {
	var player = Player(name: "halo", xp: 1, team: "Green", grade: 10)
	..name = "hello"
	..xp = 100
	..team = "Blue"
	..grade = 9
	..sayHello();
}

위처럼 객체 아래에서 객체 이름을 .로 변경한 후 데이터와 메소드를 활용할 수도 있다.

 

 

 

enum

enum Team { cat, dog }

코딩을 하다보면 철자를 다르게 쓸 때가 있다. 그럴 때를 대비하기 위해 enum을 사용하면 좋다. 위의 예시처럼 원소를 설정해두고,

class Player extends Creature {
	final String name;
	int xp;
    // here
	Team team;
	int grade;
	Player({required this.name, required this.xp, required this.team, required this.grade,});
	void sayHello() {
		print('$name, $xp, $team, $grade');
	}
}

void main() {
	var player1 = Player(
		name: 'halo',
		xp: 99,
        // here
		team: Team.cat,
		grade: 100,
	);
	player1.sayHello();
}

enum의 이름으로 설정한 Team을 데이터 자료형처럼 사용하면 된다. 그리고 값을 입력할 땐 Team.cat 혹은 Team.dog로 작성하면 된다.

 

 

 

abstract class

abstract class Creature {
	void live();
}

abstract class는 추상적인 클래스로 객체를 생성할 수 없다. 대신 추상 클래스에서 설정한 메소드(이름, 반환 타입 + 매개변수까지 설정)를 추상클래스를 상속받는 모든 클래스가 구현해야 한다.

 

예시로 Creature를 상속받은 Player class를 설정하고 객체를 만들었다.

enum Team { cat, dog }

class Player extends Creature {
	final String name;
	int xp;
	Team team;
	int grade;
	Player({required this.name, required this.xp, required this.team, required this.grade,});
	void sayHello() {
		print('$name, $xp, $team, $grade');
	}
	void live() {
		print("Creature is living");
	}
}

void main() {
	var player1 = Player(
		name: 'halo',
		xp: 99,
		team: Team.cat,
		grade: 100,
	);
	player1.sayHello();
	player1.live();
}

 

 

 

Inheritance

class Creature {
  final String name;
  Creature({required this.name});
	void printLive() {
    print("I'm alive and my name is $name");
  }
}

enum Group { cat, dog }

class Player extends Creature {
  Group group;
  Player({required name, required this.group,}) : super(name: name);
	
  @override
  void printLive() {
    super.printLive();
    print("And my group is $group");
  }
}

void main() {
  var player1 = Player(
    name: "hwido",
    group: Group.cat,
  );
  player1.printLive();
}

extends라는 키워드를 통해 다른 클래스를 상속받을 수 있다. 상속받은 클래스(sub class)는 상속된 클래스(super class)의 기능과 변수를 가진다.

 

상속받은 클래스가 상속된 클래스의 변수를 설정하거나 함수를 달리 정의할 수 있다. 생성자 옆에 ': super(변수명: 인수)'를 작성하여 상속된 클래스 변수 값을 설정할 수 있다. 그리고 @override통해 super class의 멤버 함수를 달리 정의할 수 있다.


https://nomadcoders.co/flutter-for-beginners/lobby

 

Flutter 로 웹툰 앱 만들기 – 노마드 코더 Nomad Coders

Flutter for Beginners

nomadcoders.co

 

'Flutter 공부' 카테고리의 다른 글

Dart: variables  (0) 2023.04.03

댓글