링크
21. Class Static Keyword
void main() {
Employee seulgi = new Employee('슬기');
Employee chorong = new Employee('초롱');
seulgi.printNameAndBuilding();
chorong.printNameAndBuilding();
Employee.building = '여의도 위워크';
seulgi.printNameAndBuilding();
chorong.printNameAndBuilding();
Employee.building = '을지로 위워크';
seulgi.printNameAndBuilding();
chorong.printNameAndBuilding();
}
class Employee {
static String? building;
String name;
Employee(String name) : this.name = name;
void printNameAndBuilding() {
print('제 이름은 ${this.name}입니다. $building 건물에서 근무하고 있습니다.');
}
}
22. Class super와 this의 차이
void main() {
Engineer codeFactory = Engineer(
languages: ['Dart', 'Java', 'JavaScript'],
name: '코드팩토리',
building: '여의도 위워크',
);
print(codeFactory.name);
print(codeFactory.building);
print(codeFactory.languages);
codeFactory.sayInfo();
}
class Employee {
final String building;
final String name;
Employee(
String building,
String name,
) : this.building = building,
this.name = name;
}
class Engineer extends Employee {
List<String> languages;
Engineer({
required List<String> languages,
required String name,
required String building,
}) : this.languages = languages,
super(
building,
name,
);
void sayInfo() {
print(
'저의 이름은 ${super.name} 입니다. 제가 근무하는 건물은 ${this.building} 입니다. 제가 사용할 수 있는 언어들은 ${this.languages.join(', ')} 입니다.');
}
}
자식 클래스에서 부모 클래스의 변수를 덮어씌울 수도 있다.
void main() {
Engineer codeFactory = Engineer(
languages: ['Dart', 'Java', 'JavaScript'],
name: '코드팩토리',
building: '여의도 위워크',
);
print(codeFactory.name);
print(codeFactory.building);
print(codeFactory.languages);
codeFactory.sayInfo();
codeFactory.sayName();
}
class Employee {
final String? building;
final String? name;
Employee(
String? building,
String? name,
) : this.building = building,
this.name = name;
}
class Engineer extends Employee {
List<String>? languages;
String? name;
Engineer({
required List<String>? languages,
required String? name,
required String? building,
}) : this.languages = languages,
super(
building,
name,
);
void sayInfo() {
print(
'저의 이름은 ${super.name} 입니다. 제가 근무하는 건물은 ${this.building} 입니다. 제가 사용할 수 있는 언어들은 ${this.languages?.join(', ')} 입니다.');
}
void sayName() {
print('this.name은 ${this.name}, super.name은 ${super.name}');
}
}
23. Class interface
Interface
- class가 꼭 선언해야하는 메서드와 변수들을 지정하게 해준다.
- Dart에서는
Interface
를 선언하는 경우가 다른 언어들과 비교해서 없는 편이다.
언제 Interface를 사용할까?
- class를 선언할 때, 비슷한 성격을 가지고 있는 class들은 어떤 특정한 변수와 함수를 가지고 있으면 좋겠다!라는 가정이 있을 때, Interface를 사용한다.
void main() {
BoyGroup bts = new BoyGroup('BTS');
bts.sayName();
GirlGroup redVelvet = new GirlGroup('레드벨벳');
redVelvet.sayName();
}
class IdolInterface {
String? name;
void sayName() {}
}
class BoyGroup implements IdolInterface {
String? name;
BoyGroup(String name) : this.name = name;
void sayName() {
print('제 이름은 ${this.name} 입니다.');
}
}
class GirlGroup implements IdolInterface {
String? name;
GirlGroup(String name) : this.name = name;
void sayName() {
print('제 이름은 ${this.name} 입니다.');
}
}
Q. Interface 말고, 상속으로 해결하면 되는 거 아닌가?
A. 맞는 말입니다.
void main() {
BoyGroup bts = new BoyGroup('BTS');
bts.sayName();
GirlGroup redVelvet = new GirlGroup('레드벨벳');
redVelvet.sayName();
}
class IdolInterface {
String? name;
void sayName() {}
}
class Idol {
final String? name;
Idol(String name) : this.name = name;
void sayName() {}
}
class BoyGroup extends Idol {
BoyGroup(String name) : super(name);
@override
void sayName() {
print('제 이름은 ${this.name} 입니다.');
}
}
class GirlGroup implements IdolInterface {
String? name;
GirlGroup(String name) : this.name = name;
void sayName() {
print('제 이름은 ${this.name} 입니다.');
}
}
24. Class Cascade Operator
void main() {
Idol idol = Idol('슬기', '레드벨벳');
idol.sayName();
idol.sayGroup();
idol
..sayName()
..sayGroup();
Idol('슬기', '레드벨벳')
..sayName()
..sayGroup();
}
class Idol {
String name;
String group;
Idol(String name, String group)
: this.name = name,
this.group = group;
void sayName() {
print('제 이름은 ${this.name} 입니다.');
}
void sayGroup() {
print('저는 ${this.group} 소속입니다.');
}
}