Dart의 함수와 클래스에 대해 알아봅니다.
👇👇 Dart 시리즈 👇👇
Functions
모든 함수들은 데이터 타입 Function 을 가집니다.
객체지향언어인 Dart에서 함수들은
- 변수 처리하여 사용이 가능하고
- 다른 변수에 인수로 전달
할 수 있습니다.
함수 내에서 동작하는 코드가 한줄이라면, shorthand 문법으로 사용할 수 있습니다.
String hello(String name, int time) {
return 'hi $name, its $time';
}
// equals to
String hello(String name, int time) => 'hi $name, its $time';
Positional Parameter
일반적으로 알고 있는 함수 파라미터 형식입니다.
- 파라미터를 순서대로 입력하여 호출합니다.
- 모든 파라미터는 필수값(required) 입니다.
void hello(String name, int num) {
// body
}
hello('Judy', 13);
마지막 파라미터는 optional 처리할 수 있으며, 값이 없을 경우 기본값(default value)을 설정할 수 있습니다.
void hello(String name, int num, bool? isAdmin = false) {
// body
}
hello('Judy', 20); // isAdmin = false
hello('Tom', 1000, true); // isAdmin = true
Named Parameter
함수의 파라미터를 key: value 형태로 입력할 수 있습니다.
String hello({
String name,
int num,
bool isAdmin,
}) {
// body
}
hello({
name: 'Judy',
num: 13,
isAdmin: false,
});
필수 파라미터는 required 키워드로 선언하며, optional 파라미터는 기본값(default value)을 설정할 수 있습니다.
String hello({
required String name,
required int num,
bool isAdmin = false,
}) {
// body
}
hello({
name: 'Judy',
num: 13,
});
Class
Dart는 JAVA 등과 같은 다른 객체지향언어와 마찬가지로 클래스를 지원합니다.
class Member {
final String name;
int number;
String team;
}
인스턴스 생성
Dart의 클래스는 클래스 인스턴스 생성시 new 키워드를 생략합니다.
var m1 = Member();
멤버 함수에서 멤버 변수에 접근할 때, this 키워드 없이 바로 사용할 수 있습니다.
class Member {
int name;
String getName() => `${name}님`;
}
Constructor 생성자
클래스의 인스턴스를 생성할때 호출합니다.
class Member {
String name;
String team;
Member(this.name, this.team);
}
final member = Member('Judy', 'Dev');
생성자를 따로 정의하지 않으면 파라미터가 없는 기본 생성자가 제공됩니다.
❗ 클래스 상속시 생성자는 상속되지 않습니다.
Named Constructor
클래스의 생성자도 하나의 함수이므로, Named Parameter 방식을 지원합니다.
생성자 프로토타입을 정의하고 콜론(:) 키워드를 작성하여 멤버변수를 초기화할 수 있습니다.
class Member {
String name;
String team;
Member({
required n,
required t,
}) :
this.name = n, // 초기화
this.team = t, // 초기화
;
}
기본 생성자를 정의하고, 커스텀 생성자에서 redirect도 가능합니다.
class Member {
String name;
String team;
/// 기본 생성자
Member(this.name, this.team);
/// team이 없는 생성자, 'com'으로 기본 생성자 호출
Member.withNoTeam(String name) : super(name, 'com');
}
List 또는 Map으로 멤버변수 초기화하기
사실 클래스 생성, 초기화시 변수들을 직접 할당하는 경우보다는 API fetch한 json 데이터로 DTO 클래스를 초기화하는 경우가 많겠죠.
클래스에 Map 타입을 파라미터로 받는 생성자를 정의하여 초기화작업을 해줍니다.
class Member {
String name;
String team;
/// map 데이터로 초기화
Member.fromJson(Map<String, dynamic> json)
:
this.name = json['nm'],
this.team = json['group']
;
}
Getter, Setter
Getter, Setter는 단순히 멤버변수의 값을 조회/할당하는 특별한 메소드입니다.
기본 제공되는 getter, setter가 있지만 커스텀 가능합니다.
class Product {
int price;
int tax;
/// tax 할당시 price 변경
set tax(int tax) => price += tax;
}
Abstract Class 추상클래스
클래스의 시그니처로, 인스턴스를 생성할 수 없습니다.
상속받을 클래스의 속성들을 미리 정의합니다.
추상클래스를 상속받은 자식 클래스에서 추상클래스에 정의된 모든 속성들을 정의해야 합니다.
/// 추상클래스
abstract class Player {
String name;
int salary;
void updateSalary(int value);
}
/// 실제 구현해야 하는 자식 클래스
class Striker extends Player {
void updateSalary(int value) {
salary += value * 1.02;
}
}
Mixin
클래스의 모든 속성들을 내 것처럼 사용합니다.
공통으로 정의해야 하는 속성들을 모아 재사용하기 위해 사용합니다.
with 키워드로 사용할 수 있으며, 2개 이상의 mixin을 콤마(,)로 동시에 사용 가능합니다.
mixin Person {
String name;
}
mixin Admin {
bool isAdmin = true;
}
/// mixin 상속
class Teacher with Person, Admin {
void checkAdmin() {
if (isAdmin) {
print('$name is admin');
}
}
}
Class vs. Mixin
class | mixin | |
사용 키워드 | extends | with |
생성자 여부 | O | X |
다중 상속 가능 | X | O |
관계 | 부모-자식 관계 super 호출 가능 |
단순 코드 재사용 |
Enum
변하지 않는 상수 값을 타입 형태로 정의합니다.
내가 필요한 새로운 타입을 만드는 것이라고 생각할 수 있습니다.
enum Color {
red,
blue,
green,
yello,
}
class Rect {
int x;
int y;
Color color; // enum
/// 값 비교
bool isRed() => color == Color.red;
}
'Framework > Flutter' 카테고리의 다른 글
[Dart] 데이터 타입(Data Types)과 연산자(Operators) (22) | 2024.03.15 |
---|---|
[Dart] 변수 선언 키워드 (0) | 2024.03.14 |
[Dart] 왜 Dart를 사용하나요? (16) | 2024.03.10 |