02. 다트 객체지향 프로그래밍

다트는 객체 지향 프로그래밍을 지원함

플러터 또한 객체지향 프로그래밍 중심으로 설계된 프레임워크

'클래스'를 기반으로 '인스턴스화'를 진행하여 '인스턴스를' 생성한다.

클래스

// 1. 기초 클래스 선언
class Idol {
  String name = '블랙핑크';

  void sayName() {
    print('저는 ${this.name} 입니다.');
    print('저는 $name입니다.'); // 속성 이름이 하나라면 다음과 같은 형태도 가능
  }
}



// 2. 클래스 생성
void main() {
  Idol blackPink = Idol();
  blackPink.sayName();
}


// 3. 생성자 활용
class Idol {
  final String name;

  // 방법1
  Idol(String name : this.name = name);
  // 방법 2
  Idol(this.name);


  void sayName() {
    print('저는 ${this.name} 입니다.');
  }
}

void main() {
    Idol blackPink = Idol('블랙핑크');
  blackPink.sayName();
}


// 4. 네임드 생성자 - 클래스를 생성하는 여러 방법을 명시하고 싶을 때 사용
class Iodl {
  final String name;
  final int membersCount;

  //생성자
  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'];

  }
}


// 5. 프라이빗 변수 : '_'로 변수명 시작
class Idol {
  String _name; // Idol.name의 형태로 접근 불가

  Idol(this.name);
}


// 6. 게터/세터
class Idol {
  String get name {
    return this._name;
  }

  set name(String name) {
    this._name = name;
  }
}

void main() {
  Idol blackPink = Idol();
  blackPink.name = '블랙핑크'; //세터
  print(blackPink.name); //게터
}

상속 (extends)

class Idol {
  final String name;
  final int membersCount;

  Idol(this.name, this.memberCount);

  void sayName() {
    print('저는 ${this.name}입니다.');
  }

  void sayMembersCount() {
    print('${this.name} 멤버는 ${this.membersCount}명 입니다.');
  }
}

class BoyGroup extends Idol {
  BoyGroup(String name, int membersCount) : super(name, membersCount);

  // 상속받지 않은 메소드
  void sayMale() {
    print('저희는 남자아이돌 입니다.');
  }
}

오버라이드

class GirlGroup extends Idol {
  GirlGroup(this.name, this.membersCount);

  @override
  void sayName() {
    print('저는 여자아이돌 ${this.name}입니다.');
  }
}

인터페이스 (implements)

상속과 다른 점은, 모든 기능을 재정의 해야한다는 점이다.

class GirlGroup implements Idol {
  final String name;
  final int membersCount;

  GirlGroup(this.name, this.membersCount);

  void sayName() {
    print('저는 여자아이돌 ${this.name}입니다.');
  }

  void sayMembersCount() {
    print('${this.name} 멤버는 ${this.membersCount}명 입니다.');
  }

}

믹스인

특정 클래스에 원하는 기능들만 골라 넣을 수 있는 기능

mixin IdolSingMixin on Idol {
  void sing() {
    print('${this.name}이 노래를 부릅니다.');
  }
}

//with 키워드와 함께 사용
class BoyGroup extends Idol with IdolSingMixin {
  BoyGroup(super.name, super.memberCount);

  void sayMale() {
    print('저는 남자아이돌 입니다.');
  }
}

추상(abstract)

abstract class Idol {
  final String name;
  final int membersCount;

  Idol(this.name, this.membersCount);

  void sayName(); // 추상 메소드 선언
  void sayMembersCount(); // 추상 메소드 선언
}


class GirlGroup implements Idol {
  final String name;
  final int membersCount;

  GirlGroup(this.name, this.membersCount);

  void sayName() {
    print('저는 여자아이돌 ${this.name}입니다.');
  }

  void sayMembersCount() {
    print('${this.name} 멤버는 ${this.membersCount}명 입니다.');
  }  
}

제네릭

T : 변수타입

E : 리스트 내부 요소들의 타입

K : 키 값

V : 밸류 값

class Cache<T> {
  final T data;

  Cache({required this.data,});
}

void main() {
  final cache = Cache<List<int>>(data: [1,2,3],);

  print(cache.data.reduce((value, element) => value + element));
}

스태틱

class Counter {
  static int i = 0; // 클래스 자체에 값 귀속

  Counter() {
    i++;
    print(i++);
  }
}

void main() {
  Counter count1 =Counter(); // i = 1
  Counter count2 =Counter(); // i = 2
  Counter count3 =Counter(); // i = 3
}

캐스케이드

void main() {
  Idol blackpink = Idol('블랙핑크', 4)
    ..sayName()
    ..sayMembersCount(); // 선언과 동시에 사용 가능
}

+ Recent posts