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

+ Recent posts