[ Dart ] Class 문법

duck-ach·2024년 10월 27일
0

Dart

목록 보기
8/8

Class

Class란?

Dart는 객체지향 언어이다. 모든 객체는 Class의 Instance이다.

Class는 Member를 가진다. Member 안에는 Member Method(멤버 함수)과 Member Variable(멤버 변수, 인스턴스 변수)를 가진다.

🔥 참고 :

  • 클래스 밖에서 하나의 기능을 하는 것은 Function 이라고 하고, 클래스 내부에 있는 함수는 Method 라고 한다.
  • 멤버 변수는 객체가 생성되면 인스턴스 변수라고한다.

Class의 기본형태

class 클래스명 {
	멤버변수
    멤버함수
}

예시

class Player {
	// 멤버변수
  	final String name; // final은 수정할 수 없음
  	int xp, age;
  	String team;
    
    // 멤버함수
    void sayHello() {
    	print("hi my name is $name $age $team $xp"); 
  	}
}

생성자

Class 객체를 생성하여 인스턴스를 생성할 때 사용하는 것이다.
선언된 멤버변수에 어떻게 값을 대입할지에 대해 선언하는 함수이다.
생성자 Method의 이름은 Class의 이름과 같아야한다.

basic Constructor

기본적인 Dart의 생성자를 살펴보자.

class Player {
	// 멤버변수
  	late String name; // final은 수정할 수 없음
  	late xp,;
  	
    // 생성자(Constructor)
  	Player(String name, int xp) {
    	this.name = name;
    	this.xp = xp;
  	};
}

void main () {
	print player = Player("hee", 15000);
}
  • late 선언을 통해 객체가 생성되면서 값을 할당 할 수 있도록 한다.
  • 객체를 생성할 때 C++ 이나 Java의 경우 new를 통해 생성하지만, dart는 그냥 해당 클래스를 호출하면서 생성자에 값을 담아주면 된다.

Positioning Constructor

Positioning Constructor는 생성자를 호출할 때 선언해 놓은 순서대로 변수를 할당하는 생성자이다.

class Player {
  	final String name; // final은 수정할 수 없음
  	int xp, age;
  	String team;
  
  	// positioning parameter
 	Player.createRedPlayer(String name, int age) : 
    	this.age = age,
    	this.name = name,
    	this.team = 'grey',
    	this.xp = 0;
}

void main () {
	print player = Player("hee", 26);
}

Named Constructor Parameters

생성자를 key값인 변수 이름을 가지고 해당 멤버변수에 값을 대입하는 방법이다.
멤버 변수가 많아질 경우 생성자에 값을 하나 하나 담아서 호출해야 하므로 dart 언어는 named constructor를 지원한다.

class Player {
  	final String name; // final은 수정할 수 없음
  	int xp, age;
  	String team;
  
  	// named parameter
  	Player.createBluePlayer({
    	required String name, 
    	required int age,
  	}) :  this.age = age,
        this.name = name,
        this.xp = 0,
        this.team = 'grey';
}

void main () {
	print player = Player("hee", 26);
}

required 를 사용하여 값이 비어있다면 호출하지 못하도록 막고, 필수값이 아니어도 되는 변수의 경우 :(콜론)을 사용하여 값을 할당받지 못했을 때 default 값을 설정할 수 있다.

API(Json) 읽어와서 Class에 할당하기

Map타입의 생성자를 만들어서 Json 파일에 담긴 데이터를 멤버변수에 담으면 된다.

class Player {
  final String name; // final은 수정할 수 없음
  int xp, age;
  String team;

  Player.formJson(Map<String, dynamic> playerJson)
    : name = playerJson['name'],
      age = playerJson['age'],
      xp = playerJson['xp'],
      team = playerJson['team'];

  void sayHello() {
    print("hi my name is $name $age $team $xp"); // $name = ${this.name}
  }
}

main() {

  /* API */
  var apiData = [
    {
      'name' : 'heera',
      'team' : 'red',
      'xp' : 12000,
      'age' : 15,
    },
    {
      'name' : 'amily',
      'team' : 'red',
      'xp' : 15000,
      'age' : 20,
    },
    {
      'name' : 'juno',
      'team' : 'red',
      'xp' : 16000,
      'age' : 18,
    },
  ];

  apiData.forEach((playerJson){
    var player = Player.formJson(playerJson);
    player.sayHello();
  });
}

Cascade Notation(객체 생성 문법)

객체를 생성할 때 basic 하게는 아래와 같은 방식으로 호출한다.

var duck = Member(name: 'duck', age: 26);

하지만 Cascade Notation[..]을 사용하면 하나의 오브젝트에 함수호출, 필드접근을 순차적으로 할 수 있다. 자바의 build()와 유사하다.

var duck = Member
  ..name = 'duck_ach'
  ..age = 26
  ..phoneNum = '010-0000-0000'
  ..getUserInfo();

Abstract Class(추상 클래스)

Abstract Class(추상클래스)는 이를 상속받는 모든 클래스가 가지고 있어야 할 메소드를 정의한 클래스이다. (구현 X)

abstract class Human {
  void walk();
}

class Duck extends Human {
  
  void walk() {
    print('Duck is walk');
  }
}

Inheritance(상속)

상속은 super 라는 선언을 통해 부모클래스의 생성자를 호출할 수 있다.

Human 클래스를 부모클래스로 선언하고, Player 클래스에서 extends를 사용하여 상속받는 코드이다.

필요한 개별부분들은 자식클래스에서 선언하고, 공통적인 요소나 메소드는 부모클래스에서 상속받아 코드를 좀 더 통일성 있게 짤 수 있다.

class Human {
  final String 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);

  // 부모클래스가 정의한 메소드말고 커스텀하고싶을 때
  
  void sayHello() {
    //print('Hi. my name is $name 1111');
    super.sayHello();
    print('and I play for ${team}');
  }

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

Mixin(생성자가 없는 클래스)

Mixin는 생성자가 없는 클래스를 의미한다.
클래스에 필터나 메소드를 뺏어올 때 사용한다.

Inheritance(상속) 이랑은 개념이 다른게, 상속은 super 를 통해 접근해서 부모가 가진것을 자식이 물려받아 사용한다는 개념이지만, mixin은 그저 with 으로 class를 생성할 때 선언을 함께 해주며, 그 안에 있는 필드값이나 메소드를 공유하며 사용한다.

생성자가 없는 것이 가장 큰 특징이다.

mixin을 생성할 땐 mixin 을 사용한다. (원래는 class 의 한 형태여서 class를 사용하여 만들었지만 최근에 업데이트가 된 모양이다.)

// mixin타입으로 선언해줌 필드 가지고 있고, 생성자 안가지고 있음
mixin Strong {
  final double strengthLevel = 1500.99;
}

// 클래스고, 메소드 가지고 있고, 생성자 안가지고 있음
mixin PlayBaseball {
  void runQuick() {
    print("homer!!");
  }
}

mixin Tall {
  final double height = 162.49;
}
enum Team {blue, red}

class Player with Strong, PlayBaseball, Tall {
  final Team team;
  Player({
    required this.team,
    required String name
  });
}
void main() {
  var player = Player(
    team: Team.red,
    name : 'heera',
    );

  player.runQuick();

}
profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글