Flutter를 위한 Dart 기초 - 3️⃣ 클래스

sxxng_ju·2023년 2월 1일
0

Flutter

목록 보기
3/5

Classes

클래스를 생성할 때는 반드시 타입을 지정해주어야 합니다. 클래스로 생성한 인스턴스를 만들 때는 new 키워드를 사용할 필요는 없습니다. 즉 생략이 가능합니다. 인스턴스의 속성은 수정이 가능하지만 final 키워드를 통해 초기화한 속성은 변경이 불가능합니다. 또한 클래스 내부에서 this를 굳이 사용하지 않아도 class method 내에서 접근이 가능합니다.

class Player {
	final String name = 'sj';
    int age = 28;
    
    void sayHello() {
    	print("Hello my name is $name")
    }
}

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

}

Constructors

인자를 받아서 클래스를 생성하고 싶다면 다음과 같이 순서에 맞게 같은 이름으로 작성하면 됩니다.

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

void main() {
	var player = Player("sj", 28);
    var player2 = Player("sj2", 26);
}

Named Constructor Parameter

클래스를 생성하는데 인자가 많은 경우 함수에서 적용했던 것과 똑같이 할 수 있습니다.

void main() {
	var player = Player(
      name: "sj",
      age: 28,
    );
 
}

Named Constructor

인스턴스를 생성할 때 필요에 따라 다른 인자를 받게 할 수도 있습니다. 메서드 뒤에 : 기호를 사용함으로써 인자로 받은 값들로 객체를 초기화 할 수 있습니다. 여기서 또한 positional parameter(인자의 위치로 값을 파악, 기본적으로 모든 parameter가 required)하는 것과 named parameter(이름을 지정해주는 것)을 사용할 수 있습니다. 저는 개인적으로 인자가 두개 이상이라면 named parameter로 작성하여 확실하게 인자를 전해줄 것 같습니다.

json 객체를 받아와서 클래스를 생성하고 싶다면 같은 방식으로 작성할 수 있습니다. 자주 사용되는 패턴으로 Player.fromJson(Map<String, dynamic> playerJson) : ~~ 가 있습니다.

class Player {
	...
    
    Player.createSjPlayer({
    	required String name, required int age
    }) : this.age = age, this.name = name;
    
    Player.createSj2Player({
    	required String name, required int age
    }) : this.age = age, this.name = name;
}

void main() {
	var sjPlayer = Player.createSjPlayer(
      name: "sj",
      age: 28,
    );
    var sj2Player = Player.createSj2Player(
      name: "sj2",
      age: 26,
	);
 
}

Cascade Notation

클래스로 인스턴스를 생성하고 속성을 변경하고싶다면 Cascade Notation을 이용하면 됩니다. 세미콜론을 지우고 변경하고싶은 속성 앞에 ..을 붙이면 됩니다.

void main() {
	var player = Player(name: 'sj', age: 28)
    ..name = 'sj2'
    ..age = 26;
}

Enums

enum을 통해 옵션을 정해 조금 더 안전하게 타입을 사용할 수 있습니다.

enum Team = { red, blue }

Abstract Classes

추상화 클래스는 다른 클래스 들이 사용할 것을 정의해주기 때문에 유용합니다. 미리 정의를 하고 그것을 상속 받는 클래스에서 메소드를 구현해야 합니다.

abstract class Human {
void walk();
}

class Player extends Human{
	...
    void walk() {
    	print("walking");
    }
}

Inheritance

상속 기능을 사용할 때 super 키워드를 통해 확장을 한 부모 클래스와 상호작용을 할 수 있습니다. 부모 클래스에서 정의된 메소드를 오버라이딩 하기 위해서는 @override 키워드를 사용하면 됩니다.

enum Team = { red, blue }

class Human {
	final String name;
	Human(required this.name);
    void sayHello() {
    	print("Hi $name");
    }
}

class Player extends Human {
	final Team team;
    Player({
    	required this.team,
        required String name,
    }) : super(name: name); 
    
    
    void sayHello(){
    	super.sayHello();
        print("and nice to meet you");
    }
}

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

Mixins

Mixins는 생성자가 없는 클래스입니다. Mixins는 단순히 내부의 프로퍼티와 메소드들을 가져와서 사용할 수 있게 하는 것이므로 상속과는 다릅니다.

class Strong {
	final double level = 100;
}

class Runner {
	void run() {
    	print("run");
    }
}

class Player with Strong, Runner {
}

출처

노마드코더 Dart 강의
Dart 공식문서
Flutter 공식문서

0개의 댓글