Study/Development
[개발일지] Dart 입문 2: Object Oriented Programming
titann
2022. 8. 18. 01:05
<인프런 코드팩토리 강의 수강일지>
1. class 선언
void main() {
Idol blackPink = Idol('블랙핑크', ['지수', '제니', '리사', '로제']);
Idol bts = Idol.fromList([
['RM', '진', '슈가', '제이홉', '지민', '뷔', '정국'],
'BTS',
]); // 리스트로 값을 줄 수 있다.
print(blackPink.name); // 블랙핑크
print(blackPink.members); // [지수, 제니, 리사, 로제]
blackPink.sayHello(); // 안녕하세요 블랙핑크입니다.
blackPink.introduce(); // 저희 멤버는 [지수, 제니, 리사, 로제]가 있습니다.
print(bts.name); // BTS
print(bts.members); // [RM, 진, 슈가, 제이홉, 지민, 뷔, 정국]
bts.sayHello(); // 안녕하세요 BTS입니다.
bts.introduce(); // 저희 멤버는 [RM, 진, 슈가, 제이홉, 지민, 뷔, 정국]가 있습니다.
}
// Idol class
class Idol {
String name;
List<String> members;
Idol(this.name, this.members);
Idol.fromList(List values)
: this.members = values[0],
this.name = values[1];
void sayHello() {
print('안녕하세요 ${this.name}입니다.');
}
void introduce() {
print('저희 멤버는 ${this.members}가 있습니다.');
}
}
2. getter / setter
void main() {
Idol blackPink = Idol('블랙핑크', ['지수', '제니', '리사', '로제']);
Idol bts = Idol.fromList([
['RM', '진', '슈가', '제이홉', '지민', '뷔', '정국'],
'BTS',
]);
print(blackPink.firstMember); // 지수
print(bts.firstMember); // RM
blackPink.firstMember = '최불암';
bts.firstMember = '윤여정';
print(blackPink.firstMember); // 최불암
print(bts.firstMember); // 윤여정
}
// getter / setter
// 값을 가져오고 변경할 때
class Idol {
String name;
List<String> members;
Idol(this.name, this.members);
Idol.fromList(List values)
: this.members = values[0],
this.name = values[1];
void sayHello() {
print('안녕하세요 ${this.name}입니다.');
}
void introduce() {
print('저희 멤버는 ${this.members}가 있습니다.');
}
// getter
String get firstMember {
return this.members[0];
}
// setter
set firstMember(String name) {
this.members[0] = name;
}
}
3. Private 속성
// _ 언더바를 붙이면, 한 파일 내에서만 사용할 수 있다.
class _Idol {...}; // 클래스
this._members = values[0]; // 변수
_sayhello(){...} // 함수
4. 상속: 자식 / 부모 Class
void main() {
print('---- Idol ----');
Idol apink = Idol(name: '에이핑크', membersCount: 5);
apink.sayName();
apink.sayMembersCount();
print('----- BoyGroup ----');
BoyGroup bts = BoyGroup('BTS', 7);
bts.sayName();
bts.sayMembersCount();
bts.sayMale(); // 부모클래스에서는 사용 불가
print('----- GirlGroup ----');
GirlGroup redVelvet = GirlGroup('Red Velvet', 5);
redVelvet.sayName();
redVelvet.sayMembersCount();
redVelvet.sayFemale(); // 부모클래스에서는 사용 불가
print('----- Type Comparison -----');
print(apink is Idol);
print(apink is BoyGroup);
print(apink is GirlGroup);
print('----- Type Comparison2 -----');
print(bts is Idol);
print(bts is BoyGroup);
print(bts is GirlGroup);
print('----- Type Comparison3 -----');
print(redVelvet is Idol);
print(redVelvet is BoyGroup);
print(redVelvet is GirlGroup);
}
// 상속 - inheritance
//
// 상속을 받으면 부모 클래스의 모든 속성을
// 자식 클래스가 부여받는다.
class Idol {
//이름
String name;
//멤버 수
int membersCount;
Idol({
required this.name,
required this.membersCount,
});
void sayName() {
print('저는 ${this.name}입니다.');
}
void sayMembersCount() {
print('${this.name}은 ${this.membersCount}명의 멤버가 있습니다.');
}
}
class BoyGroup extends Idol {
BoyGroup(
String name,
int membersCount,
) : super(
name: name,
membersCount: membersCount,
);
void sayMale() {
print('저는 남자 아이돌입니다.');
} // 자식 클래스에서 선언한 값은 부모 클래스에서 사용 불가하다.
}
class GirlGroup extends Idol {
GirlGroup(
String name,
int membersCount,
) : super(
name: name,
membersCount: membersCount,
);
void sayFemale() {
print('저는 여자 아이돌입니다.');
} // 자식 클래스에서 선언한 값은 부모 클래스에서 사용 불가하다.
}
5. override: 덮어쓰기
- 부모로부터 상속받은 값, 함수를 덮어쓸 수 있다.
void main() {
TimesTwo tt = TimesTwo(2);
print(tt.calculate());
TimesFour tf = TimesFour(2);
print(tf.calculate());
}
// method - function (class 내부에 있는 함수)
// override - 덮어쓰다 (우선시하다)
class TimesTwo {
final int number;
TimesTwo(this.number);
// method
int calculate() {
return number * 2;
}
}
class TimesFour extends TimesTwo {
TimesFour(
int number,
) : super(number);
@override
int calculate() {
// return super.number * 4;
return super.calculate() * 2; // super 키워드 사용하여 변수나 함수 가져올 수 있다.
}
}
6. static
- static은 instance에 귀속되지 않고 class에 귀속된다. (전체에 해당)
void main() {
Employee seulgi = Employee('슬기');
Employee chorong = Employee('초롱');
seulgi.name = '최불암';
seulgi.printNameAndBuilding();
chorong.printNameAndBuilding();
Employee.building = '육삼빌딩';
seulgi.printNameAndBuilding();
chorong.printNameAndBuilding();
Employee.printBuilding();
}
class Employee {
//static은 instance에 귀속되지 않고 class에 귀속된다.
//알바생이 일하는 건물
static String? building; // class 전체에 귀속
//알바생 이름
String name; // 각 instance 값
Employee(
this.name,
);
void printNameAndBuilding() {
print('제 이름은 $name입니다. $building 건물에서 근무하고 있습니다.');
}
static void printBuilding() {
print('저는 $building 건물에서 근무중입니다.');
}
}
7. Interface
- 기본적인 포맷을 제시
void main() {
BoyGroup bts = BoyGroup('BTS');
GirlGroup redVelvet = GirlGroup('레드벨벳');
bts.sayName(); // 제 이름은 BTS입니다.
redVelvet.sayName(); // 제 이름은 레드벨벳입니다.
print(bts is IdolInterface); // true
print(bts is BoyGroup); // true
print(bts is GirlGroup); // false
print(redVelvet is IdolInterface); // true
print(redVelvet is BoyGroup); // false
print(redVelvet is GirlGroup); // true
}
// interface
// abstract 키워드 사용하여
// instance로 사용 불가하도록 할 수 있다.
abstract class IdolInterface {
String name;
IdolInterface(this.name);
void sayName(){}
}
class BoyGroup implements IdolInterface{
String name;
BoyGroup(this.name);
void sayName(){
print('제 이름은 $name입니다.');
}
}
class GirlGroup implements IdolInterface{
String name;
GirlGroup(this.name);
void sayName(){
print('제 이름은 $name입니다.');
}
}
8. generic
- 타입을 외부에서 받을 때 사용
void main() {
Lecture<String, String> lecture1 = Lecture('123', 'lecture1');
lecture1.printIdType(); // String
Lecture<int, String> lecture2 = Lecture(123, 'lecture2');
lecture2.printIdType(); // int
}
// generic = 타입을 외부에서 받을 때 사용
class Lecture<T, X> {
final T id;
final X name;
Lecture(this.id, this.name);
void printIdType() {
print(id.runtimeType);
}
}
10. OOP
- 객체 지향 프로그래밍
void main() {
Test test = Test();
// 모든 클래스는 Object라는 클래스를 상속받기 때문에
// 아래 4개 값을 기본으로 가진다
test.hashCode;
test.runtimeType;
test.toString();
test.noSuchMethod();
}
// OOP: Object Oriented Programming
// 객체 지향 프로그래밍
class Test{}
반응형