생성자
void main() {
// 변수 타입을 Idol로 지정하고 Idol의 인스턴스를 생성할 수 있습니다.
Idol blackPink = Idol();
// 메서드 실행
blackPink.sayName();
}
class Idol {
// 생성자에서 입력받는 변수들은 일반적으로 final 키워드 사용
final String name;
// 생성자 선언
// 클래스와 같은 이름으로 지정해야 함
// 함수의 매개 변수를 선언하는 것처럼 매개변수를 지정
Idol(String name) : this.name = name;
void sayName() {
print('저는 ${this.name}입니다.');
}
}
해당 Idol 클래스로 인스턴스 생성
void main() {
// name에 '블랙핑크' 저장
Idol blackPink = Idol('블랙핑크');
// name에 'BTS' 저장
Idol bts = Idol('BTS');
bts.sayName();
}
네임드 생성자
class Idol {
final String name;
final int membersCount;
// 1. 생성자
Idol(String name, int membersCount)
// 1개 이상의 변수를 저장하고 싶을 때는 , 기호로 연결해 주면 됩니다.
: this.name = name,
this.membersCount = membersCount;
// 2. 네임드 생성자
// {클래스명.네임드 생성자명} 형식
Idol.fromMap(Map<String, dynamic> map)
: this.name = map['name'],
this.membersCount = map['membersCount;'];
void sayName() {
print('저는 ${this.name}입니다. ${this.name} 멤버는
${this.memebersCount}명입니다.');
}
}
void main() {
// 기본 생성자 사용
Idol blackPink = Idol('블랙핑크', 4);
blackPink.sayName();
// fromMap이라는 네임드 생성자 사용
Idol bts = Idol.fromMap({
'name': 'BTS',
'membersCount': 7,
});
bts.sayName();
}
프라이빗 변수
class Idol {
// 1. '_'으로 변수명을 시작하면 프라이빗 변수를 선언할 수 있습니다.
String _name;
Idol(this._name);
}
void main() {
Idol blackPink = Idol('블랙핑크');
// 같은 파일에서는 _name 변수에 접근할 수 있지만,
// 다른 파일에서는 _name 변수에 접근할 수 없습니다.
print(blackPink._name);
}
게터/세터
getter: 값을 가져올 때 사용
settier: 값을 지정할 때 사용
void main() {
Idol blackPink = Idol();
blackPink.name = '에이핑크'; // 1. 게터
print(blackPink.name); // 2. 세터
}
상속
extends 키워드를 사용해 상속할 수 있으며 상속은 어떤 클래스의 기능을 다른 클래스가 사용할 수 있게 하는 기법으로 기능을 물려 주는 클래스를 부모 클래스, 받는 클래스를 자식 클래스
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}명입니다.');
}
}
오버라이드
부모 클래스 또는 인터페이스에서 정의된 메서드를 재정의
class GirlGroup extends Idol {
// super 키워드를 사용해도 되고 다음처럼 생성자의 매개변수로 직접
// super 키워드르 사용해도 됩니다.
GirlGroup (
super.name,
super.membersCount,
);
void sayName() {
print('저는 여자 아이돌 ${this.name}입니다.');
}
}
void main() {
GirlGroup blackPink = GirlGroup('블랙핑크', 4);
blackPink.sayName(); // 1 자식 클래스의 오버라이드된 메서드 사용
// saymembersCount는 오버라이드하지 않았기 때문에
// 그대로 Idol 클래스의 메서드가 실행됩니다.
// 2 부모 클래스의 메서드 사용
blackPink.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.aname)')
}
}
믹스인
특정 클래스에 원하는 기능들만 골라넣을 수 있는 기능
특정 클래스를 지정해서 속성을 정의 가능하며 지정한 클래스를 상속하는 클래스에서도 사용 가능
mixin IdolSingMixin on Idol {
void sing() {
print('${this.name}이 노래를 부릅니다.');
}
}
class BoyGroup extends Idol with IdolSingMixin {
BoyGroup(
super.name,
super.membersCount,
);
void sayMale() {
print('저는 남자 아이돌입니다.');
}
}
void main() {
BoyGroup bts = BoyGroup('BTS', 7);
// 믹스인에 정의된 sing() 함수 사용 가능
bts.sing();
}
추상
상속, 인터페이스로 사용하는 데 필요한 속성만 정의 후 인스턴스화할 수 없도록 하는 기능
// 추상 클래스 지정
abstract class Idol {
final String name;
final int membersCount;
Idol(this.name, this.membersCount); // 생성자 선언
// 추상 메서드 선언
void sayName();
void sayMembersCount();
}
// 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}명입니다.');
}
}
void main() {
GirlGroup blackPink = GirlGroup('블랙핑크', 4);
blackPink.sayName();
blackPink.sayMembersCount();
}
제네릭
// 인스턴스화할 때 입력받을 타입을 T로 지정합니다.
class Cache<T> {
// data의 타입을 추후 입력될 T 타입으로 지정합니다.
final T data;
Cache({
required this.data,
});
}
void main() {
// T의 타입을 List<int>로 입력합니다.
final cache = Cache<List<int>> (
data: [1,2,3],
);
// 제네릭에 입력된 값을 통해 data 변수의 타입이 자동으로 유추됩니다.
print(cache.data.reduce((value, element => value + element));
}
스태틱
static 키워드 사용 시 클래스 자체에 귀속됩니다
class Counter {
// 1 static 키워드 사용 시 static 변수 선언
static int i = 0;
// 2 static 키워드 사용 시 static 변수 선언
Counter() {
i ++ ;
print(i++);
}
}
void main() {
Counter count1 = Counter();
Counter count2 = Counter();
Counter count3 = Counter();
}
캐스케이드 연산자
void main() {
// cascade operation (..)를 사용하면 선언한 변수의 메서드를 연속 실행 가능
Idol blackPink = Idol('블랙핑크, 4')
.. sayName()
.. sayMembersCount();
}