[Dart] class (1)

SSO·2023년 11월 28일
0

App-Develop-Study

목록 보기
4/6

다트에서의 클래스에 대한 개념은 매우 중요하다!!
다트의 거의 모든 것은 클래스로 이루어져 있어서 매우 큰 비중을 차지하기 때문에 잘 알아둬야 한다.

class 생성

먼저 클래스를 생성해보자.

class Player{
	final String name = 'sso'; // 초기값을 고정하고 싶다면 final 명시
	int xp = 1500;  // 클래스에서 속성들은 꼭 타입을 명시해서 선언
	
	void sayHello(){
		print('Hi, My name is $name'); // this를 사용하지 않음
	}
}

void main(){
	var player = Player();  // 인스턴스 생성 new를 사용하지 않음
	player.sayHello();    // Hi, My name is sso
}

위의 코드를 통해 다트의 클래스는 다른 언어의 클래스들과 어떤 점이 다른지 알아보자.

  • 클래스의 속성들을 정의할 때는 꼭 타입을 명시하고 초기화를 해준다.
  • 클래스 내에서는 this 를 사용하지 않는 것을 권고한다.
    • 클래스에 있는 메서드 내의 변수가 클래스 속성과 동일한 이름을 갖는 그런 상황이 아니라면 다트는 this를 사용하지 않는 것을 권고한다.
  • 인스턴스를 생성할 때 new 키워드를 사용하지 않아도 된다.

constructor

이번에는 생성자에 대해서 알아보자.
다트에서 생성자를 만드는 것은 매우 간단하다!

class Player{
	final String name; 
	int xp;  
	
	Player(this.name, this.xp); // constructor

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

void main(){
	var player = Player('sso', 1500);  
	player.sayHello();    // Hi, My name is sso
	var player2 = Player('ssoo', 2000);
	player2.sayHello(); // Hi, My name is ssoo
}

❗️주의❗️

  • 생성자의 이름은 클래스의 이름과 같아야 한다.
  • 클래스에 인자들을 전달해 줄 때 순서(positional arguments)를 지켜야 한다.

named constructor parameter

앞에 함수에서 배운 내용처럼 파라미터가 많아지면 이 파라미터들의 순서를 기억하는 것이 힘들다.

클래스에서도 마찬가지로 클래스가 커지고 속성들이 많아지면 이것들의 순서를 기억하는 것이 번거로울 수 있다.
이러한 불편함을 해소하기 위해 함수에서 처럼 클래스에서도 named constructor parameter를 사용할 수 있다!

사용 방법도 함수에서와 같다. (매우 쉽죵)

class Player{
	final String name; 
	int xp; 
	String team; 
	
	Player({
		required this.name,
		required this.xp,
		required this.team,
	});

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

void main(){
	var player = Player(
		name: 'sso',
		xp: 1500,
		team: 'red',
	);  
}

required 를 사용하고 싶지 않다면 초기값을 넣어주는 것도 방법이다.

이렇게 작성해주면 인스턴스를 생성할 때 인자들의 순서를 기억하지 못하더라도 클래스의 정의를 보고 쉽게 작성할 수 있다!


named constructor

우리가 위에서 예시로 다뤘던 생성자는 Player라는 클래스에서 자동으로 호출되는 생성자이다.

그런데 만약 특정 역할을 하는 생성자를 더 만들고 싶다면 어떻게 할까?
=> 그럴 경우에는 생성자.만들생성자이름() 이런식으로 더 만들 수 있다.

예를 들어 빨간팀의 팀원을 생성하는 createRed 생성자와 파란팀의 팀원을 생성하는 createBlue 생성자를 각각 만들어보자.

class Player {
  final String name;
  int age;
  String team;

  // named parameter 사용
  Player({
    required this.name,
    required this.team,
    required this.age,
  });

  // named parameter
  Player.createRed({
    required String name,
    required int age,
  })  : this.age = age,
        this.name = name,
        this.team = 'red';

  // positional parameter
  Player.createBlue(String name, int age)
      : this.age = age,
        this.name = name,
        this.team = 'blue';

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

void main() {
  var player = Player.createRed(name: 'sso', age: 23);
  var player2 = Player.createBlue('ssoo', 24);
}

위처럼 만들어진 두 개의 생성자들은 각각 team 변수의 값을 지정된 값으로 초기화 해준다.

named constructor 를 만들 때 주의해야 할 점은 : 을 사용하는 문법이다.

지금까지는 그냥 괄호 안에서 값들을 초기화 해줬지만 named parameter 를 사용할 경우에는 : 뒤로 초기화 할 내용들을 작성해줘야 한다.


cascade operator

지금까지는 생성자를 만드는 방법과 사용하는 기본적인 문법에 대해서 알아보았다.

그런데 우리가 인스턴스를 생성하고 이후에 값을 바꾸고 싶다면 어떻게 할까?

아마 우리는 아래와 같이 코드를 작성할 것이다.

class Player{
  String name; 
	int xp; 
	
	Player({
		required this.name,
		required this.xp,
	});

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

void main(){
	var player = Player(name: 'sso', xp: 1500);
	player.name = 'modify_name';
	player.xp = 120000;  
}

하지만 위의 코드에서는 player. 이 부분이 계속해서 반복된다는 단점이 있다.

이를 개선하기 위한 문법으로 cascade operator를 사용할 수 있다!
위의 코드를 이 연산자를 사용해 바꿔보자.

class Player{
  String name; 
	int xp; 
	
	Player({
		required this.name,
		required this.xp,
	});

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

void main(){
	var player = Player(name: 'sso', xp: 1500);
		..name = 'modify_name'
		..xp = 120000;  
}

훨씬 코드가 간단해진 것을 볼 수 있다.

맨 앞에 위치한 . 이 바로 player 를 대체하는 것이다.
그리고 모든 줄에 세미콜론을 넣어줄 필요 없이 값을 변경하는 마지막 줄에만 세미콜론을 넣어주면 된다!


enum (열거형)

enum은 타입스크립트에서 처음 배웠는데 다트에서도 enum을 지원한다.

enum은 열거형으로 이 타입에 선언된 것들만 사용할 수 있도록 선택의 폭을 좁혀준다고 생각하면 된다.

enum Team {red, blue}

class Player{
  String name; 
	int xp; 
	Team team;
	
	Player({
		required this.name,
		required this.xp,
		required this.team,
	});

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

void main(){
	var player = Player(name: 'sso', xp: 1500, team: Team.red);
		..name = 'modify_name'
		..xp = 120000
		..team = Team.blue;
}

이렇게 Team 이라는 enum 타입을 만들어주면 Team 이라는 타입을 가진 속성 team 의 값은 redblue밖에 될 수 없다.
이 외의 값을 넣어주려 하면 에러가 발생하게 된다.

이렇게 해주면 문자열을 직접 속성에 값을 넣어주는 것보다 타이핑 실수로 인한 에러를 방지하기에도 매우 좋기 때문에 열거형을 적극 활용하면 좋을 것 같다!!


클래스와 관련된 내용은 두 번에 나눠 포스팅을 작성할 예정이다:)
다음 포스팅도 곧 돌아올게용
-끝-

profile
👩🏻‍💻👊🏻⭐️

0개의 댓글