class
객체지향 프로그래밍의 기본은 클래스로부터 시작한다. 클래스를 정의하는 예제 코드를 살펴보면서 분석하자
class Idol{
final String name;
final int membersCount;
//Idol(String name) : this.name = name; 속성 설정을 이렇게도 가능
// Idol(this.name);
// 생성자 : 클래스의 인스턴스를 생성하는 메서드.
Idol(String name, int membersCount)
:this.name = name,
this.membersCount = membersCount;
// 네임드 생성자
Idol.fromMap(Map<String, dynamic> map)
:this.name = map['name'],
this.membersCount = map['membersCount'];
//클래스에 종속되는 함수를 지정할 수 있고, 메서드라 부른다.
//this : 클래스에 종속되어 있는 값을 지칭할 때 사용
void sayName(){
print('저는 ${this.name} 입니다. 맴버의 수는 ${this.membersCount} 명입니다.');
}
}
Optional parameter (positional, named)
포지셔널 파라미터 : 스퀘어 브라켓 [] 으로 감싸져 있는 파라미터를 포지셔널 파라미터라고한다.
말 그대로 position(위치)가 중요한 파라미터라고 이해하면 기억하기 쉽다.
void add(int a, int b, [int? c = 9]){
print('$a, $b, $c');
}
void main(){
add(1,2,3); // 1,2,3
add(1,2,5); //1,2,5
add(1,2); // 1,2,9
}
네임드 파라미터 : 컬리브라켓 {} 으로 감싸져 있다, 컬리 브라켓 안에 있는 파라미터의 순서는 상관이 없다.
void add(int a, int b, {int? c, int? d}){
print('$a, $b, $c $d');
}
void main(){
add(1,2, c: 10, d: 50); //1,2,10,50
add(1,2, d: 100, c: 70); //1,2,70,100
}
private, getter,setter
private : 다른 언어와달리 다트 언어에서는 같은 파일에서만 접근이 가능
getter/setter : 말 그대로 값을 가져올 때 사용되고 값을 지정할 때 사용
class Idol{
// _ : private 설정
String _name = '블핑';
// getter/setter
String get name{
return this._name;
}
set name(String name){
this._name = name;
}
}
void main(){
Idol idol = Idol();
idol.name = '트와이스';
print(idol.name);
}
상속, 인터페이스
상속 : 어떤 클래스의 기능을 다른 클래스가 사용할 수 있게 하는 기법
인터페이스 : 상속은 공유되는 기능을 이어받는 개념이지만 인터페이스는 공통으로 필요한 기능을 정의하는 역할
//mixin : 특정 클래스에 원하는 기능들만 골라 넣는 기능
mixin IdolSingMixin on Idol{
void sing(){
print('${this.name}이 노래를 부른다.');
}
}
class Idol{
final String name;
final int membersCount;
Idol(this.name, this.membersCount);
void sayName(){
print('저는 ${this.name} 입니다.');
}
void sayMembersCount(){
print('${this.name}의 멤버는 수는 ${this.membersCount}명입니다.');
}
}
// 상속은 extends 키워드로 한다, mixin을 적용시 with를 사용
class BoyGroup extends Idol with IdolSingMixin{
//부모 클래스에 기본 생성자가 있으면 자식 클래스에서 생성자를 실행해줘야 한다.
BoyGroup(
String name,
int membersCount,
) : super(name, membersCount);
void sayMale(){
print('보이 그룹');
}
}
class GirlGruop extends Idol{
GirlGruop(super.name, super.membersCount);
void sayName(){
print('여자 아이돌 : ${this.name}입니다.');
}
}
//인터페이스 설정시 반드시 모든 기능을 설정을 해줘야한다.
class Others implements Idol{
final String name;
final int membersCount;
Others(this.name, this.membersCount);
void sayName(){
print('저는 아무그룹 ${this.name} 입니다.');
}
void sayMembersCount(){
print('멤버수는 : ${this.membersCount}');
}
}
void main(){
BoyGroup bts = BoyGroup('bts', 7);
bts.sayName();
bts.sayMembersCount();
bts.sayMale();
bts.sing();
GirlGruop girl = GirlGruop('트와이스', 8);
girl.sayName();
print(girl..name);
girl.sayMembersCount();
Others others = Others('소시', 9);
others.sayName();
others.sayMembersCount();
}
제네릭
제네릭 : 클래스나 함수의 정의를 선언할 때가 아니라 인스턴스화하거나 실행할 때 설정한다, 특정 변수의 타입을 하나의 타입으로 제한하고 싶지 않을 때 자주 사용한다.
class Cache<T>{
final T data;
Cache({
required this.data,
});
}
class Counter{
static int cnt = 1;
Counter(){
cnt++;
}
}
void main(){
final cache = Cache<List<int>>(
data: [1,2,3],
);
print(cache.data.reduce((first, item) => first + item));
Counter c = Counter();
Counter c2 = Counter();
Counter c3 = Counter();
print(Counter.cnt);
}
'Mobile > Dart' 카테고리의 다른 글
(Dart) 동기/비동기 (0) | 2024.02.13 |
---|---|
(Dart) Dart 기본 문법 (0) | 2024.02.13 |
크로스 플랫폼/네이티브 앱 (0) | 2024.02.13 |