๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Lang
Dart
02-OOP

1. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP)

1.1 ํด๋ž˜์Šค์™€ ์ธ์Šคํ„ด์Šค

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Object Oriented Programming; OOP)

  • ํด๋ž˜์Šค(class) : ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„
  • ์ธ์Šคํ„ด์Šค(instance) : ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด
    • e.g. ํด๋ž˜์Šค - ์ถ•๊ตฌํŒ€(์„ ์ˆ˜, ๊ฐ๋…, ํŒ€๋ช…)
    • e.g. ์ธ์Šคํ„ด์Šค - ์†ํฅ๋ฏผ, ๋ฌด๋ฆฌ๋‰ด, ํ† ํŠธ๋„˜ ํ™‹์Šคํผ
1
void main() {
2
Team barca = Team(
3
'๋ฐ”๋ฅด์ƒค',
4
['๋ฉ”์‹œ', '์ˆ˜์•„๋ ˆ์ฆˆ', '๋„ค์ด๋งˆ๋ฅด']
5
);
6
7
print(barca.name);
8
print(barca.members);
9
barca.sayHello();
10
barca.introduce();
11
12
Team real = Team(
13
'๋ ˆ์•Œ',
14
['ํ˜ธ๋‚ ๋‘', '์นด์‹œ์•ผ์Šค', '๋ผ๋ชจ์Šค']
15
);
16
print(real.name);
17
print(real.members);
18
real.sayHello();
19
real.introduce();
20
}
21
22
class Team {
23
String name;
24
List<String> members;
25
26
// ์ƒ์„ฑ์ž(constructor) : ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
27
Team(String name, List<String> members) :
28
this.name = name,
29
this.members = members;
30
31
32
void sayHello( ) {
33
print('์•ˆ๋…•ํ•˜์„ธ์š”, ${this.name}์ž…๋‹ˆ๋‹ค.');
34
}
35
36
void introduce( ) {
37
print('์šฐ๋ฆฌ ํŒ€์˜ ์„ ์ˆ˜๋“ค์€ ${this.members}์ž…๋‹ˆ๋‹ค.');
38
}
39
}

1.2 ์ƒ์„ฑ์ž(constructor) ์ถ•์•ฝํ˜•

์ƒ์„ฑ์ž๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

1
// ์ƒ์„ฑ์ž(constructor) : ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
2
Team(String name, List<String> members) :
3
this.name = name,
4
this.members = members;
5
6
Team(this.name, this.members); // ์œ„์™€ ๋™์ผํ•œ ์ฝ”๋“œ (์ƒ์„ฑ์ž ์ถ•์•ฝํ˜•)

1.3 named constructor

์ƒ์„ฑ์ž๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

1
void main() {
2
Team barca = Team('๋ฐ”๋ฅด์ƒค', ['๋ฉ”์‹œ', '์ˆ˜์•„๋ ˆ์ฆˆ', '๋„ค์ด๋งˆ๋ฅด']);
3
4
print(barca.name);
5
print(barca.members);
6
barca.sayHello();
7
barca.introduce();
8
9
Team real = Team.fromList([
10
['ํ˜ธ๋‚ ๋‘', '์นด์‹œ์•ผ์Šค', '๋ผ๋ชจ์Šค'],
11
'๋ ˆ์•Œ',
12
]);
13
print(real.name);
14
print(real.members);
15
real.sayHello();
16
real.introduce();
17
}
18
19
class Team {
20
String name;
21
List<String> members;
22
23
// ์ƒ์„ฑ์ž(constructor) : ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
24
Team(this.name, this.members);
25
26
// ๐Ÿ“Œ ์ด๋ฆ„์žˆ๋Š” ์ƒ์„ฑ์ž(named constructor) : ์ƒ์„ฑ์ž๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
27
Team.fromList(List values)
28
: this.members = values[0],
29
this.name = values[1];
30
31
void sayHello() {
32
print('์•ˆ๋…•ํ•˜์„ธ์š”, ${this.name}์ž…๋‹ˆ๋‹ค.');
33
}
34
35
void introduce() {
36
print('์šฐ๋ฆฌ ํŒ€์˜ ์„ ์ˆ˜๋“ค์€ ${this.members}์ž…๋‹ˆ๋‹ค.');
37
}
38
}
39

1.4 final๊ณผ const

final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. โ€˜constโ€™ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ƒ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

1
void main() {
2
// ๐Ÿ“Œ const๋กœ ์„ ์–ธ๋œ ๊ฐ์ฒด๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด
3
Team barca = const Team('๋ฐ”๋ฅด์ƒค', ['๋ฉ”์‹œ', '์ˆ˜์•„๋ ˆ์ฆˆ', '๋„ค์ด๋งˆ๋ฅด']);
4
5
print(barca.name);
6
print(barca.members);
7
barca.sayHello();
8
barca.introduce();
9
10
Team real = Team.fromList([
11
['ํ˜ธ๋‚ ๋‘', '์นด์‹œ์•ผ์Šค', '๋ผ๋ชจ์Šค'],
12
'๋ ˆ์•Œ',
13
]);
14
print(real.name);
15
print(real.members);
16
real.sayHello();
17
real.introduce();
18
}
19
20
class Team {
21
// ๐Ÿ“Œ final : ํ•œ๋ฒˆ ์„ค์ •๋˜๋ฉด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ
22
final String name;
23
final List<String> members;
24
25
// ์ƒ์„ฑ์ž(constructor) : ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
26
// ๐Ÿ“Œ const : ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ณ€ ์ƒ์„ฑ์ž๋กœ ๋งŒ๋“ค์–ด์คŒ
27
const Team(this.name, this.members);
28
29
// ๐Ÿ“Œ ์ด๋ฆ„์žˆ๋Š” ์ƒ์„ฑ์ž(named constructor) : ์ƒ์„ฑ์ž๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
30
Team.fromList(List values)
31
: this.members = values[0],
32
this.name = values[1];
33
34
void sayHello() {
35
print('์•ˆ๋…•ํ•˜์„ธ์š”, ${this.name}์ž…๋‹ˆ๋‹ค.');
36
}
37
38
void introduce() {
39
print('์šฐ๋ฆฌ ํŒ€์˜ ์„ ์ˆ˜๋“ค์€ ${this.members}์ž…๋‹ˆ๋‹ค.');
40
}
41
}

1.5 ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค ๋น„๊ต (feat. const)

์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์ธ์Šคํ„ด์Šค๊ฐ€ ์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€๋Š”๋ฐ, ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ„๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ฌด๋ฆฌ ๊ฐ’์ด ๋˜‘๊ฐ™๋”๋ผ๋„, ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€๋Š” ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋ฉด false๊ฐ€ ๋‚˜์˜จ๋‹ค.

1
void main() {
2
Team barca = Team('๋ฐ”๋ฅด์ƒค', ['๋ฉ”์‹œ', '์ˆ˜์•„๋ ˆ์ฆˆ', '๋„ค์ด๋งˆ๋ฅด']);
3
Team barca2 = Team('๋ฐ”๋ฅด์ƒค', ['๋ฉ”์‹œ', '์ˆ˜์•„๋ ˆ์ฆˆ', '๋„ค์ด๋งˆ๋ฅด']);
4
5
print(barca == barca2); // false
6
}
7
8
class Team {
9
final String name;
10
final List<String> members;
11
12
// ์ƒ์„ฑ์ž(constructor) : ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
13
const Team(this.name, this.members);
14
}

๋‹ค๋งŒ, ๋‘˜ ๋‹ค const๋กœ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด, ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋กœ ์ธ์‹ํ•œ๋‹ค.

1
void main() {
2
Team barca = const Team('๋ฐ”๋ฅด์ƒค', ['๋ฉ”์‹œ', '์ˆ˜์•„๋ ˆ์ฆˆ', '๋„ค์ด๋งˆ๋ฅด']);
3
Team barca2 = const Team('๋ฐ”๋ฅด์ƒค', ['๋ฉ”์‹œ', '์ˆ˜์•„๋ ˆ์ฆˆ', '๋„ค์ด๋งˆ๋ฅด']);
4
5
print(barca == barca2); // true
6
}
7
8
class Team {
9
final String name;
10
final List<String> members;
11
12
// ์ƒ์„ฑ์ž(constructor) : ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
13
const Team(this.name, this.members);
14
}

2. getter์™€ setter

  • getter : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋–„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜
  • setter : ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜
1
void main() {
2
Team barca = Team('๋ฐ”๋ฅด์ƒค', ['๋ฉ”์‹œ', '์ˆ˜์•„๋ ˆ์ฆˆ', '๋„ค์ด๋งˆ๋ฅด']);
3
4
Team real = Team.fromList([
5
['ํ˜ธ๋‚ ๋‘', '์นด์‹œ์•ผ์Šค', '๋ผ๋ชจ์Šค'],
6
'๋ ˆ์•Œ',
7
]);
8
9
print(barca.firstMember); // ๋ฉ”์‹œ
10
print(real.firstMember); // ํ˜ธ๋‚ ๋‘
11
12
barca.firstMember = 'ํ”ผ์ผ€';
13
real.firstMember = '๋ฒ ์ผ';
14
15
print(barca.firstMember); // ํ”ผ์ผ€
16
print(real.firstMember); // ๋ฒ ์ผ
17
}
18
19
class Team {
20
String name;
21
List<String> members;
22
23
// ์ƒ์„ฑ์ž(constructor) : ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
24
Team(this.name, this.members);
25
26
Team.fromList(List values)
27
: this.members = values[0],
28
this.name = values[1];
29
30
// getter
31
String get firstMember {
32
return this.members[0];
33
}
34
35
// setter : ๋ฌด์กฐ๊ฑด 1๊ฐœ์˜ ์ธ์ž๋งŒ ๋ฐ›์•„์•ผ ํ•จ
36
set firstMember(String name) {
37
this.members[0] = name;
38
}
39
}

2.1 ์™œ getter์™€ setter๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜?

  • getter์™€ setter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด,
  • ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋ฅผ ์™ธ๋ถ€์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ , ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • final ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ๋„ setter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋งŒ, ํ˜„๋Œ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ setter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • _๋ฅผ ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช… ์•ž์— ๋ถ™์ด๋ฉด, private์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
1
void main() {
2
_Team barca = _Team('๋ฐ”๋ฅด์ƒค', ['๋ฉ”์‹œ', '์ˆ˜์•„๋ ˆ์ฆˆ', '๋„ค์ด๋งˆ๋ฅด']);
3
4
_Team real = _Team.fromList([
5
['ํ˜ธ๋‚ ๋‘', '์นด์‹œ์•ผ์Šค', '๋ผ๋ชจ์Šค'],
6
'๋ ˆ์•Œ',
7
]);
8
9
print(barca.firstMember); // ๋ฉ”์‹œ
10
print(real.firstMember); // ํ˜ธ๋‚ ๋‘
11
12
barca.firstMember = 'ํ”ผ์ผ€';
13
real.firstMember = '๋ฒ ์ผ';
14
15
print(barca.firstMember); // ํ”ผ์ผ€
16
print(real.firstMember); // ๋ฒ ์ผ
17
}
18
19
class _Team {
20
final String name;
21
final List<String> members;
22
23
// ์ƒ์„ฑ์ž(constructor) : ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
24
_Team(this.name, this.members);
25
26
_Team.fromList(List values)
27
: this.members = values[0],
28
this.name = values[1];
29
30
// getter : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ€๊ณตํ•ด์„œ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ
31
String get firstMember {
32
return this.members[0];
33
}
34
35
// setter : ๋ฌด์กฐ๊ฑด 1๊ฐœ์˜ ์ธ์ž๋งŒ ๋ฐ›์•„์•ผ ํ•จ
36
set firstMember(String name) {
37
this.members[0] = name;
38
}
39
}

3. ์ƒ์† (Inheritance)

  • ์ƒ์† : ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ฒƒ
  • extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์†์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
1
void main() {
2
print('--------------ํŒ€----------------');
3
Team barca = Team(name: '๋ฐ”๋ฅด์ƒค', membersCount: 25);
4
barca.sayName();
5
barca.sayMembersCount();
6
7
print('--------------์•ผ๊ตฌํŒ€------------');
8
BaseballTeam samsung = BaseballTeam(name: '์‚ผ์„ฑ๋ผ์ด์˜จ์ฆˆ', membersCount: 30);
9
samsung.sayName();
10
samsung.sayMembersCount();
11
samsung.sayBaseballTeamName();
12
13
print('--------------๋†๊ตฌํŒ€------------');
14
BasketballTeam bulls = BasketballTeam(name: '์‹œ์นด๊ณ  ๋ถˆ์Šค', membersCount: 15);
15
bulls.sayName();
16
bulls.sayMembersCount();
17
bulls.sayBasketballTeamName();
18
19
print('--------------ํƒ€์ž… ๋น„๊ต------------');
20
print(barca is Team); // true
21
print(barca is BaseballTeam); // false
22
print(barca is BasketballTeam); // false
23
24
print('--------------ํƒ€์ž… ๋น„๊ต2------------');
25
print(samsung is Team); // true
26
print(samsung is BaseballTeam); // true
27
print(samsung is BasketballTeam); // false
28
}
29
30
class Team {
31
String name;
32
int membersCount;
33
34
Team({
35
required this.name,
36
required this.membersCount,
37
});
38
39
void sayName() {
40
print('ํŒ€๋ช… : $name');
41
}
42
43
void sayMembersCount() {
44
print('ํŒ€์› ์ˆ˜ : $membersCount');
45
}
46
}
47
48
class BaseballTeam extends Team {
49
// super() : ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
50
BaseballTeam({
51
required String name,
52
required int membersCount,
53
}) : super(name: name, membersCount: membersCount);
54
55
sayBaseballTeamName() {
56
print('์•ผ๊ตฌํŒ€์—์„œ๋งŒ ์“ฐ๋Š” ๋ฉ˜ํŠธ');
57
}
58
}
59
60
class BasketballTeam extends Team {
61
BasketballTeam({
62
required String name,
63
required int membersCount,
64
}) : super(name: name, membersCount: membersCount);
65
66
sayBasketballTeamName() {
67
print('๋†๊ตฌํŒ€์—์„œ๋งŒ ์“ฐ๋Š” ๋ฉ˜ํŠธ');
68
}
69
}

4. ๋ฉ”์†Œ๋“œ(method)

  • ๋ฉ”์†Œ๋“œ(method) : ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์žˆ๋Š” ํ•จ์ˆ˜
  • ์˜ค๋ฒ„๋ผ์ด๋“œ(override, ๋ฎ์–ด์“ฐ๊ธฐ) : ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ
1
void main() {
2
TimesTwo timesTwo = TimesTwo(2);
3
print(timesTwo.calculate()); // 4
4
5
TimesFour timesFour = TimesFour(2);
6
print(timesFour.calculate()); // 8
7
}
8
9
class TimesTwo {
10
final int number;
11
12
TimesTwo(
13
this.number
14
);
15
16
// method
17
int calculate() {
18
return number * 2;
19
}
20
}
21
22
class TimesFour extends TimesTwo {
23
TimesFour(int number) : super(number);
24
25
@override // ์˜ค๋ฒ„๋ผ์ด๋”ฉ annotation(์ฃผ์„)
26
int calculate() {
27
return super.number * 4;
28
// return super.calculate() * 2; // ์œ„ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ
29
}
30
}

4.1 static ํ‚ค์›Œ๋“œ

1
void main() {
2
Employee seulgi = Employee('์Šฌ๊ธฐ');
3
Employee chorong = Employee('์ดˆ๋กฑ');
4
5
seulgi.name = '๋ญ์‹œ๊ธฐ';
6
seulgi.printNameAndBuilding();
7
chorong.printNameAndBuilding();
8
9
// ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ class์— ๊ท€์†๋˜์–ด์„œ,
10
// ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์—์„œ, ํด๋ž˜์Šค์˜ ๊ฑด๋ฌผ ์ด๋ฆ„์„ ๊ณต์œ ํ•œ๋‹ค.
11
Employee.building = '์˜คํˆฌํƒ€์›Œ';
12
seulgi.printNameAndBuilding();
13
chorong.printNameAndBuilding();
14
}
15
16
class Employee {
17
// static๋ฅผ ๋ถ™์ด๋ฉด, instance์— ๊ท€์†๋˜์ง€ ์•Š๊ณ , class์— ๊ท€์†๋œ๋‹ค.
18
static String? building; // ์•Œ๋ฐ”์ƒ์ด ์ผํ•˜๊ณ  ์žˆ๋Š” ๊ฑด๋ฌผ
19
String name; // ์•Œ๋ฐ”์ƒ ์ด๋ฆ„
20
21
Employee(this.name);
22
23
void printNameAndBuilding() {
24
print('์ด๋ฆ„: $name, ๊ฑด๋ฌผ: $building');
25
}
26
27
static void printBuilding() {
28
print('๊ฑด๋ฌผ: $building');
29
}
30
}

4.2 interface ํ‚ค์›Œ๋“œ (feat. implements)

  • interface : ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ณ€์ˆ˜, ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ
1
void main() {
2
BoyGroup bts = BoyGroup('BTS');
3
GirlGroup twice = GirlGroup('TWICE');
4
5
bts.sayName();
6
twice.sayName();
7
}
8
9
class IdolInterface {
10
String name;
11
12
IdolInterface(this.name);
13
14
void sayName() {}
15
}
16
17
class BoyGroup implements IdolInterface {
18
String name;
19
20
BoyGroup(this.name);
21
22
void sayName() {
23
print('๊ทธ๋ฃน๋ช…์€ $name');
24
}
25
}
26
27
class GirlGroup implements IdolInterface {
28
String name;
29
30
GirlGroup(this.name);
31
32
void sayName() {
33
print('๊ทธ๋ฃน๋ช…์€ $name');
34
}
35
}

4.3 abstract ํ‚ค์›Œ๋“œ (feat. interface)

  • ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
  • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ฃผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•˜๋ฉฐ,
  • ์ด๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค
  • ์ฆ‰, abstract๊ฐ€ ์จ์ ธ ์žˆ์œผ๋ฉด ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค ๋•Œ, ํ•ด๋‹น ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ๋งŒ ์“ฐ๋ผ๋Š” ๋œป
1
void main() {
2
BoyGroup bts = BoyGroup('BTS');
3
GirlGroup twice = GirlGroup('TWICE');
4
5
bts.sayName();
6
twice.sayName();
7
8
print(bts is IdolInterface); // true
9
print(bts is BodyGroup); // true
10
print(bts is GirlGroup); // false
11
12
print(twice is IdolInterface); // true
13
print(twice is BodyGroup); // false
14
print(twice is GirlGroup); // true
15
}
16
17
abstract class IdolInterface {
18
String name;
19
20
IdolInterface(this.name);
21
22
// ์ถ”์ƒ์ (abstract)์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ์˜ body๋ฅผ ์ง€์›Œ๋„ ๋จ
23
void sayName()
24
}
25
26
class BoyGroup implements IdolInterface {
27
String name;
28
29
BoyGroup(this.name);
30
31
void sayName() {
32
print('๊ทธ๋ฃน๋ช…์€ $name');
33
}
34
}
35
36
class GirlGroup implements IdolInterface {
37
String name;
38
39
GirlGroup(this.name);
40
41
void sayName() {
42
print('๊ทธ๋ฃน๋ช…์€ $name');
43
}
44
}

5. generic

  • ์ œ๋„ค๋ฆญ(generic) : ํด๋ž˜์Šค๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ, ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
  • ์ฆ‰, ํƒ€์ž…์„ ์™ธ๋ถ€์—์„œ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ๋–„, ์‚ฌ์šฉ
1
void main() {
2
Lecture<String, String> lec1 = Lecture('123', '๊ฐ•์˜1');
3
lec1.printIdType(); // id์˜ ํƒ€์ž…์€ String์ž…๋‹ˆ๋‹ค.
4
5
Lecture<int, String> lec2 = Lecture(123, '๊ฐ•์˜2');
6
lec2.printIdType(); // id์˜ ํƒ€์ž…์€ int์ž…๋‹ˆ๋‹ค.
7
}
8
9
// generic : ํƒ€์ž…์„ ์™ธ๋ถ€์—์„œ ๋ฐ›์„ ๋–„ ์‚ฌ์šฉ
10
class Lecture<T, X> {
11
final T id;
12
final X name;
13
14
Lecture(this.id, this.name);
15
16
void printIdType() {
17
print('id์˜ ํƒ€์ž…์€ ${T}์ž…๋‹ˆ๋‹ค.');
18
}
19
}

6. OOP๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ 

1
void main() {
2
Test t = Test();
3
}
4
5
class Test {}
6
// class Test extends Object {}
7
// ์œ„ ์ฝ”๋“œ๊ฐ€ ์—†์–ด๋„, ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ Object๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.
  • ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ๋Š” Object ํด๋ž˜์Šค์ด๋‹ค.
  • ์ฆ‰, ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ Object๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ์—, ๊ฐ์ฒด(Obejct) ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด๋‹ค.