Dart class

Cheki·2023년 9월 11일
0

etc

목록 보기
19/22
post-thumbnail

Dart는 객체 지향 프로그래밍으로 class가 다양하다고 한다.

구조

class Player {
  late final String name;
  late int level;

  Player(String name, int level){
    this.name = name;
    this.level = level;
  }

  void Hello(){
    print("Hi my name is $name");
  }
 }

일단 값을 주지 않고 변수명만 지정해서 class를 만들었다.
기본구조는 아래와 같은듯?

class 클래스명 {...}
void main() {...}

name이 한번정해지면 변화할수 없도록 final를 사용했다. player는 name과 level이라는 변수를 가지고 있다.

클래스 내에 새로운 생성자 함수를 만들어서 (클래스명과 같아야 한다!) name과 level을 받아오도록 한다. 그리고 late 라는 선언이 굉장히 중요❗ late는 나중에 값이 주어진다는 것으로 변수에 default 값이 없어도 오류가 나지 않도록 해준다.

void main() {
  var player = Player('bunny',100);
  player.Hello();
  var player2 = Player('doggy', 150);
  player2.Hello();
}

그리고 player와 player2를 만들어서 출력 가능하다.

Hi my name is bunny
Hi my name is doggy

Exited.

이 코드를 더 짧게 축약해서 작성가능하다.

class Player {
  final String name;
  int level;

  Player(this.name, this.level);

  void Hello(){
    print("Hi my name is $name");
  }
}

last라는 선언을 삭제하고 생성자 함수에 인자로 this.~를 주는 것이다. 첫번째 인자로 this.name이 올것이고 두번째 인자로 this.level이 온다는 것을 알았으니 밑에는 쓸필요가 없다ㅎㅎ

그리고 실행하면 위와 똑같은 결과가 나온다.


Named Constructor Parameters

위와 같은 형식을 positional이라고 한다. 각자의 위치가 정해져 있다는 것

Player(this.name, this.level);

이 부분을 보면 첫번째는 이름, 두번째는 level의 위치로 정해져 있다. 만약 인자가 더 늘어나면 다음과 같아진다.

class Player {
  final String name;
  int level;
  String world;
  int age;

  Player(this.name, this.level, this.world, this.age);

  void Hello(){
    print("Hi my name is $name");
  }
}

void main() {
  var player = Player('bunny', 100, 'korea', 18);
  player.Hello();
  var player2 = Player('doggy', 150, 'brazil', 23);
  player2.Hello();
}

main에서 값을 줄때 순서를 지켜야 하는데 헷갈릴수도 있다는 것
function에서 배웠던것처럼 named parameter를 이용하자!

class Player {
  final String name;
  int level;
  String world;
  int age;

  Player({
    required this.name,
    required this.level,
    required this.world,
    required this.age,
  });

  void Hello() {
    print("Hi my name is $name");
  }
}

인자에 중괄호를 잊지말고 해주고 값이 null이 될수도 있으니 required를 붙여주자~

void main() {
  var player = Player(
    name: 'bunny',
    level: 100,
    world: 'korea',
    age: 18,
  );
  player.Hello();

  var player2 = Player(
    name: 'doggy',
    level: 150,
    world: 'brazil',
    age: 23,
  );
  player2.Hello();
}

구분하기 쉽게 key값과 value를 주면 끝!!


Named Constructors

새롭게 작동하는 constructors를 만들고자 할때 이 방법을 사용한다.

만약에 player의 팀이 정해져 있고 level은 0으로 초기화해서 player를 새롭게 생성하고자 할때

void main() {
  var KoreanPlayer = Player.createKoreaPlayer(
    name: 'bunny',
    age: 18,
  );
  KoreanPlayer.Hello();
 }

main에서 createKoreaPlayer라는 이름을 가진 consturtors를 호출한다. 그리고 이름과 나이만 준 후, 위에서 createKoreaPlayer의 constructors를 만들어준다.

class Player {
  final String name;
  int level;
  String world;
  int age;
  
  Player.createKoreaPlayer({required String name, required int age,}) : 
  this.age = age,
  this.name = name,
  this.world = 'korea',
  this.level = 0;

void Hello() {
    print("Hi my name is $name, and the country I belong to is $world");
  }
}

Player.createKoreaPlayer를 선언하고 이름과 나이만 받도록 한다. 그리고 중요한 문법!!!! 뒤에 : 콜론을 붙여준다.

Player.createKoreaPlayer({required String name, required int age,}) : 👈 이거
그리고 property를 초기화 시켜준다 this.age ~ this.level=0
name와 age는 받는거고 world는 기본값으로 korea를 준다. 그리고 level은 0으로 초기화 시켜준다.

⭐콜론이 하는일은 콜론뒤에 오는 property들을 초기화 시켜준다는 것

createBrazilPlayer도 똑같이 만든후 출력해보았다.

Hi my name is bunny, and the country I belong to is korea
Hi my name is bunny, and the country I belong to is Brazil

Exited.

좋아!


Cascade Notation

class Player {
  String name, world;
  int level, age;

  Player({
    required this.name,
    required this.level,
    required this.world,
    required this.age,
  });

  void Hello() {
    print("Hi my name is $name, and the country I belong to is $world");
  }
}

이렇게 해주고

void main() {
  var bunny = Player(name: 'bunny', level: 120, world: 'korea', age: 12);
}

bunny라는 변수의 name, level, world, age값을 준다. 근데 만약에 이름과 level등을 변경하고 싶다! 그러면

  bunny.name = 'doggy';
  bunny.level = 127;

이런식으로 변수명.변수명 으로 일일이 변경을 해줘야 변경이 될것이다.

하지만 cascade notation을 이용하면 더욱 간편해진다. 어떻게 사용하냐면...

void main() {
  var bunny = Player(name: 'bunny', level: 120, world: 'korea', age: 12)
  ..name = 'doggy'
  ..level = 127;
}

이렇게 변수를 정의할때 세미콜론을 지워주고 변수명 앞에 ..을 해주면 된다! 변경 변수명 뒤에 세미콜론은 마지막에만 존재하면 된다.
맨 앞의 .이 bunny와 같은 역할을 해주기 때문에 굳이 쓰지 않아도 되는 것이다. 일종의 줄임말이라고 할까?


Inheritance

Dart에서 상속을 사용하는 방법에 대해 알아보잣

class Animal {
  String name;
  int age;

  Animal(this.name, this.age);

  void speak() {
    print("$name가 소리를 내고 있습니다");
  }
}

Animal이라는 부모 클래스를 만들어주었다. 이름과 나이를 가지고 speak라는 메서드를 가지고 있다.

class dog extends Animal {
  dog(
    String name,
    int age,
    String color,
  ) : super(name, age);

  void bark(){
    print("$name say 멍멍!");
  }
}

Animal을 상속하는 dog라는 자식 클래스이다. 자식 클래스에서 생성자 함수를 만든다. 클래스와 동일한 이름을 가져야 하며 객체를 초기화한다. 새롭게 color라는 변수를 추가할수도 있다!

여기서 중요한것은 : super 를 통해서 부모 클래스의 생성자를 호출할수 있다는 것이다. 부모 클래스의 생성자를 호출해서 실행하고 초기화 해주는 역할을 한다.

그리고 강아지가 짖는것을 나타내기 위해서 새롭게 bark라는 메서드도 추가했다.

void main() {
  var doggy = dog('기름이', 2, "brown");
  doggy.speak();
  doggy.bark();
}

main에서 dog클래스를 호출해서 객체를 생성하고 doggy라는 변수에 객체를 할당한다.

기름이가 소리를 내고 있습니다
기름이 say 멍멍!

Exited.

speak를 호출하면 부모 클래스에서 생성한 것이 나타나고 bark를 호출하면 자식에서 생성한것이 나타난다.

profile
초보 웹공부러입니다

0개의 댓글