본문 바로가기

FE개발 공부

5. Dart의 클래스

이번 시간에는 dart의 클래스에 대해 학습하고 기록했다.

 

  • 클래스 작성

Flutter개발에서 클래스는 아주 중요한 부분이다. 거의 모든 컴포넌트들이 클래스로 이루어져 있다.

 

전에 배웠던 변수 선언에서 클래스 내부에서는 

직접 타입을 명시하여 변수를 사용한다.

 

다른 언어들과 다르게 dart에서는 this를 사용하지 않는 것이 권고되고 있다.

 

class Player{
  final String name = 'nico'; //클래스 프로퍼티라고 부른다. 필드 같은 개념인 듯
  int xp = 1500;
  
  void sayHello(){
    print("Hi my name is $name"); //this.name 이 아니라 $name으로 작성한다
    //메소드 내부에 같은 이름이 있다면 this 키워드 사용하기
  }
}

void main(){
  var player = Player();
  player.sayHello();
}

 

 

  • 생성자

비교적 간단하게 작성 가능하다.

arguments의 인자들 자리만 잘 알고 맞추면 된다.

 

일종의 positional arguments이다.

 

class Player{
  final String name = 'nico'; //클래스 프로퍼티라고 부른다. 필드 같은 개념인 듯
  int xp = 1500;
  
  Player(this.name, this.xp); //괄호 안에 넣어서 바로 값을 할당할 수 있다.
  
  void sayHello(){
    print("Hi my name is $name"); //this.name 이 아니라 $name으로 작성한다
    //메소드 내부에 같은 이름이 있다면 this 키워드 사용하기
  }
}

void main(){
  var player = Player('nico', 2500); //클래스를 동적으로 사용 가능해졌다.
  player.sayHello();
  var player2 = Player('lynn', 2000);
}

 

전에 배웠던 named parameter를 적용하여 생성자를 작성할 수도 있다.

 

 

class Player{
  final String name = 'nico'; //클래스 프로퍼티라고 부른다. 필드 같은 개념인 듯
  int xp = 1500;
  String team = '';
  int age;
  
  Player({requierd this.name,  //required키워드로 오류 막음
  		  required this.xp, 
          required this.team, 
          required this.age}); //괄호 안에 넣어서 바로 값을 할당할 수 있다.
  //named parameter사용!! 중괄호로 묶어주었음
  
  void sayHello(){
    print("Hi my name is $name"); //this.name 이 아니라 $name으로 작성한다
    //메소드 내부에 같은 이름이 있다면 this 키워드 사용하기
  }
}

void main(){
  var player = Player(
  	name: "nico",
    xp: 1200,
    team: 'blue',
    age: 23,
  );
  player.sayHello();
  var player2 = Player('lynn', 2000);
}

 

 

  • named constructors (중요!)

flutter에서 생성자를 작성할 때 많이 사용하는 패턴이다.

class Player{
  final String name;
  int xp, age;
  String team;
  
  Player({required this.name,  //required키워드로 오류 막음
  		  required this.xp, 
          required this.team, 
          required this.age}); //괄호 안에 넣어서 바로 값을 할당할 수 있다.
  //named parameter사용!! 중괄호로 묶어주었음
  
  Player.createBluePlayer({required String name, required int age})//named parameter 사용
    : this.age = age, // : 을 사용하여 값을 지정해줄 수 있다.
      this.name = name,
      this.team = 'blue',
      this.xp = 0;
  
  Player.createRedPlayer(String name, int age) : //: 을 사용하여 값 지정, positional parameter사용
    this.age = age,
  this.name = name,
  this.team='red',
  this.xp = 0;
  
  void sayHello(){
    print("Hi my name is $name"); //this.name 이 아니라 $name으로 작성한다
    //메소드 내부에 같은 이름이 있다면 this 키워드 사용하기
  }
}

void main(){
  var player = Player.createBluePlayer{
    name:"nico", //named로 사용
    age: 21,
  };
  
  var redPlayer = Player.createRedPlayer{
     'nico',
      21,
  };
}

 

 

  • Flutter에서 자주 사용하는 패턴
class Player{
	final String name;
    int xp;
    String team;
    
    player.fromJson(Map<String, dynamic> playerJson)
    	: name = playerJson['name'],
          xp = playerJson['xp'],
          team = playerJson['team'];
          
    
    void sayHello(){
    	print("my name is $name");
    }
}

void main(){
	var apiData = [
    	{
        	"name" : "nico",
            "team" : "red",
            "xp" : 0,
        },
        {
        	"name" : "lynn",
            "team" : "red",
            "xp" : 0,
        },
        {
        	"name" : "dal",
            "team" : "red",
            "xp" : 0,
        },
    ];
    
    apiData.forEach((playerJson) {
    	var player = Player.fromJson(playerJson); //playerJson이 iterator역할로
        //fromJson에 각각의 데이터를 보낸다.
        player.sayHello();
        }
    ); 
}

 

자신만의 fromJson을 작성해야 하는 경우가 많다.

 

  • cascade notation

 

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

  Player({required this.name, required this.xp, required this.team});
  
  void sayHello(){
    print("my name is $name");
  }
}

void main() {
  var nico = Player(name: 'nico', xp: 1200, team: 'blue')
  var potato = nico // 세미콜론 ; 이 없음
    ..name = 'las' //이 문법은 바로 앞에 있는 클래스를 가리킨다. 
    ..xp = 120000
    ..team = 'blue'
    ..sayHello(); //potato.sayHello()
}

 

멤버함수 호출 시 일일이 작성하지 않아도 된다는 간편함이 있다.

 

  • Enum 타입

원래 알고 있던 enum클래스와 유사하다.

enum Team{red, blue}  //team red, team blue 라는 의미
enum XPLevel{begninner, medium, pro}


class Player {
  String name;
  XPLevel xp;
  Team team; //필드 수정

  Player({required this.name, required this.xp, required this.team});
  
  void sayHello(){
    print("my name is $name");
  }
}

void main() {
  var nico = Player(name: 'nico', xp: XPLevel.medium, team: Team.red); //.연산자로 사용한다
  var potato = nico
    ..name = 'las'
    ..xp = XPLevel.pro //.연산자로 사용한다
    ..team = Team.blue //위와 같은 방법
    ..sayHello();
}

//색상이나 마진 같이 종합되어 있는 데이터들 사용에 유리하다

 

 

  • 추상 메소드

추상 클래스로는 객체를 생성할 수 없다.

다른 클래스들이 직접 구현해야 하는 메소드들을 종합해놓은 것이라고 보면 된다.

abstract class Human{
  void walk(); //함수 시그니처만 작성, 반환 타입이나 파라미터 설정 가능
}

enum Team{red, blue}  //team red, team blue 라는 의미
enum XPLevel{begninner, medium, pro}


class Player extends Human{ //추상 클래스 상속받기
  String name;
  XPLevel xp;
  Team team;

  Player({required this.name, required this.xp, required this.team});
  
  void walk(){ //walk메소드를 구현하지 않으면 오류가 뜬다.
    print('im walking');
  }
  
  void sayHello(){
    print("my name is $name");
  }
}

class Coach extends Human{  //walk메소드를 구현하지 않으면 오류가 뜬다.
  void walk(){
    print('the coach is walking');
  }
}

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

 

 

추상 클래스는 상속 받은 클래스가 특정 메소드를 구현하도록 강제한다.

 

  • 상속

다른 클래스의 프로퍼티와 메소드들을 가져오게 된다.

 

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, //위에 있는 human으로 전달해준다.
  }) : super(name); //이런 식으로 전달!, 부모 클래스의 생성자를 호출해줘야 한다!
  //super키워드를 통해 부모 클래스와 상호작용할 수 있게 해준다.

  @override //Human에서 온 sayHello 메소드를 우리가 만든 메소드로 대체한다.
  void sayHello() {
    super.sayHello(); //Human에서 실행하는 sayHello를 가져올 수 있다.
    print("and I play for ${team}"); //내가 만든 거 추가!
  }
}

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

 

super키워드를 통해 프로퍼티나 생성자, 메소드 들과 상호작용할 수 있다.

 

  • mixins

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

클래스에 프로퍼티들을 추가할 때 사용한다.

 

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

 mixin클래스 내부의 프로퍼티나 메소드를 긁어온다고 생각하면 된다.

 

class Strong {
  final double strengthLevel = 1500.99;
}

class QuickRunner {
  void runQuick() {
    print("Runnnnnnn!");
  }
}

class Tall {
  final double height = 1.99;
}

enum Team { blue, red }

class Player with Strong, QuickRunner, Tall { //with키워드로 사용한다!
  final Team team;

  Player({required this.team});
}

class Horse with Strong, QuickRunner {} //mixin클래스들 여러번 사용

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

 

 


 

지금까지 Dart의 필요 개념들만 학습했다.

얼른 다음 진도인 flutter로 넘어가서 기본적인 학습을 마치고

일부 개발 기능에 적용해보고 싶다.

'FE개발 공부' 카테고리의 다른 글

RN 개발해보기!  (0) 2025.11.11
6. Flutter 소개  (0) 2025.10.02
4. Dart의 함수  (0) 2025.09.26
3. Dart의 데이터  (0) 2025.09.25
2. Dart의 다양한 변수들  (0) 2025.09.24