모든 객체지향 프로그래밍 꽃 상속 (Inheritance) 이걸 잘하냐 못하냐에 따라 OOP 코드를 작성하는 퀄리티가 달라짐
아래는 기본 Idol 클레스인데 (기본코드) 이 클레스를 활용하여 상속이 어떤건지 살펴 볼거임
모든 OOP 언어에 상속 기능이 있고 사실상 이 클레스 상속을 사용하기 위해 고안되었다 봐도 무방함
상속을 받으면 부모 클래스의 모든 속성을 자식 클래스가 부여 받음
void main()
{
print('--------Idol---------');
Idol apink = Idol(name: "에이핑크", membersCount: 5);
apink.sayname();
apink.sayMembersCount();
}
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}명의 멤버가 있습니다');
}
}
상속 받아사용해보자.
부모에 생성자가 있으면 자식은 부모와 똑같은 형태에 생성자를 만든후 부모 생성자로 값을 전달해줘야함
super는 부모 클래스를 지칭하는데 super를 부모 이름이랑 같다고 보면
Idol(name : name, membersCount : membersCount) 사실상 부모 생성자임
class BoyGroup extends Idol{ // extends 부모클레스 : 상속 받겠다
BoyGroup(// 생성자에서 아래와 같은 맴버 변수를 받고
String name,
int membersCount,
) : super(name : name, // super 키워드로 Idol 클래스에 생성자로 전송함 그냥 그대로 받은거 부모로 전달임
membersCount : membersCount,
// 그러면 부모클래스는 자동으로 생김 그럼 부모는 자동으로 BTS 7 값을 가지고 생성됨
);
}
그렇기에 부모 클레스 기능을 다 사용 가능함 (자식 생성자에 값 넣으면 자동으로 부모쪽으로 전송 되니까 + 상속 받는거라 부모 기능 다 사용 가능)
void main()
{
print('--------Boy Grouo---------');
BoyGroup bts = BoyGroup("bts", 7);
bts.sayMembersCount(); // 자동으로 부모 생성자로 가서 Idol 클래스에서 값이 저장 되니까 자식이 부모에 있는 기능 사용가능함
bts.sayname();
}
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{ // extends 부모클레스 : 상속 받겠다
BoyGroup(// 생성자에서 아래와 같은 맴버 변수를 받고
String name,
int membersCount,
) : super(name : name, // super 키워드로 Idol 클래스에 생성자로 전송함 그냥 그대로 받은거 부모로 전달임
membersCount : membersCount, // 그러면 부모클래스는 자동으로 생김 그럼 부모는 자동으로 BTS 7 값을 가지고 생성됨
);
}
부모에서 자식 기능 이용 못함 ( 부모는 자식에게 다 주지만 자식은 부모를 막음 ㅠㅠ ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ현실반영)
void main()
{
print('--------Idol---------');
Idol apink = Idol(name: "에이핑크", membersCount: 5);
apink.sayname();
apink.sayMembersCount();
//apink.sayMale(); 불가능 부모에서 자식거는 사용 못함
print('--------Boy Grouo---------');
BoyGroup bts =BoyGroup("bts", 7);
bts.sayMembersCount();
bts.sayname();
bts.sayMale();
}
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{ // extends 부모클레스 : 상속 받겠다
BoyGroup(// 생성자에서 아래와 같은 맴버 변수를 받고
String name,
int membersCount,
) : super(name : name, // super 키워드로 Idol 클래스에 생성자로 전송함 그냥 그대로 받은거 부모로 전달임
membersCount : membersCount, // 그러면 부모클래스는 자동으로 생김 그럼 부모는 자동으로 BTS 7 값을 가지고 생성됨
);
void sayMale()
{
print("저희는 남자 아이돌입니다.");
}
}
자식들 간에도 서로 기능들 터치 못함 부모가 같을 뿐임 (ex 형이 구매한 아이폰 형꺼고 내가 구매한 맥북 내꺼임 맘대로 쓴다? 전쟁임)
void main()
{
print('--------Idol---------');
Idol apink = Idol(name: "에이핑크", membersCount: 5);
apink.sayname();
apink.sayMembersCount();
//apink.sayMale(); 불가능 부모에서 자식거는 사용 못함
print('--------Boy Grouo---------');
BoyGroup bts =BoyGroup("bts", 7);
bts.sayMembersCount();
bts.sayname();
bts.sayMale();
//bts..sayFemale(); 사용못함 걸그룹에만 있고 그냥 공통점은 Idol 클래스를 상속 받는거 뿐 관계가 없음
print('--------Girl Group---------');
GirlGroup redvelvet = GirlGroup("Red velvet", 5);
redvelvet.sayMembersCount();
redvelvet.sayname();
redvelvet.sayFemale();
}
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{ // extends 부모클레스 : 상속 받겠다
BoyGroup(// 생성자에서 아래와 같은 맴버 변수를 받고
String name,
int membersCount,
) : super(name : name, // super 키워드로 Idol 클래스에 생성자로 전송함 그냥 그대로 받은거 부모로 전달임
membersCount : membersCount, // 그러면 부모클래스는 자동으로 생김 그럼 부모는 자동으로 BTS 7 값을 가지고 생성됨
);
void sayMale()
{
print("저희는 남자 아이돌입니다.");
}
}
class GirlGroup extends Idol{ // extends 부모클레스 : 상속 받겠다
GirlGroup(// 생성자에서 아래와 같은 맴버 변수를 받고
String name,
int membersCount,
) : super(name : name, // super 키워드로 Idol 클래스에 생성자로 전송함 그냥 그대로 받은거 부모로 전달임
membersCount : membersCount, // 그러면 부모클래스는 자동으로 생김 그럼 부모는 자동으로 BTS 7 값을 가지고 생성됨
);
void sayFemale()
{
print("저희는 여자 아이돌입니다.");
}
}
print('---------Type Comperison------------');
print(apink is Idol);
print(apink is BoyGroup);
print(apink is GirlGroup);
print('---------Type Comperison------------');
print(bts is Idol);
print(bts is BoyGroup); // 상속시 자식클레스는 자식 클레스 뿐만아니하 부모 클레스도 될수 있음
print(bts is GirlGroup);
print('---------Type Comperison------------');
print(redvelvet is Idol); // 상속시 자식클레스는 자식 클레스 뿐만아니하 부모 클레스도 될수 있음
print(redvelvet is BoyGroup);
print(redvelvet is GirlGroup);
// 부모 클레스는 자식 클레스가 되지 못하지만 부모 클레스의 인스턴스인 bts ,redvelvet 부모클레스, 자식 클레스 (자기자신)타입이 됨
전체 코드
void main()
{
print('--------Idol---------');
Idol apink = Idol(name: "에이핑크", membersCount: 5);
apink.sayname();
apink.sayMembersCount();
//apink.sayMale(); 불가능 부모에서 자식거는 사용 못함
print('--------Boy Grouo---------');
BoyGroup bts =BoyGroup("bts", 7);
bts.sayMembersCount();
bts.sayname();
bts.sayMale();
//bts..sayFemale(); 사용못함 걸그룹에만 있고 그냥 공통점은 Idol 클래스를 상속 받는거 뿐 관계가 없음
print('--------Girl Group---------');
GirlGroup redvelvet = GirlGroup("Red velvet", 5);
redvelvet.sayMembersCount();
redvelvet.sayname();
redvelvet.sayFemale();
print('---------Type Comperison------------');
print(apink is Idol);
print(apink is BoyGroup);
print(apink is GirlGroup);
print('---------Type Comperison------------');
print(bts is Idol);
print(bts is BoyGroup); // 상속시 자식클레스는 자식 클레스 뿐만아니하 부모 클레스도 될수 있음
print(bts is GirlGroup);
print('---------Type Comperison------------');
print(redvelvet is Idol);
print(redvelvet is BoyGroup); // 상속시 자식클레스는 자식 클레스 뿐만아니하 부모 클레스도 될수 있음
print(redvelvet is GirlGroup);
// 부모 클레슨 자식 클레스가 되지 못하지만 부모 클레스의 인스턴스인 bts ,redvelvet 부모클레스, 자식 클레스 (자기자신)됨
}
/*
정리 : 상속을 하면 부모클레스와 자식클래스가 생기고 부모클레스의 속성들이 자식클레스로 다 넘어간다
자식 클레스 속성들은 부모클레스 넘어가지 않는다 그리고 같은 자식 클레스 끼리도 속성공유를 하지 않는다.
*/
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{ // extends 부모클레스 : 상속 받겠다
BoyGroup(// 생성자에서 아래와 같은 맴버 변수를 받고
String name,
int membersCount,
) : super(name : name, // super 키워드로 Idol 클래스에 생성자로 전송함 그냥 그대로 받은거 부모로 전달임
membersCount : membersCount, // 그러면 부모클래스는 자동으로 생김 그럼 부모는 자동으로 BTS 7 값을 가지고 생성됨
);
void sayMale()
{
print("저희는 남자 아이돌입니다.");
}
}
class GirlGroup extends Idol{ // extends 부모클레스 : 상속 받겠다
GirlGroup(// 생성자에서 아래와 같은 맴버 변수를 받고
String name,
int membersCount,
) : super(name : name, // super 키워드로 Idol 클래스에 생성자로 전송함 그냥 그대로 받은거 부모로 전달임
membersCount : membersCount, // 그러면 부모클래스는 자동으로 생김 그럼 부모는 자동으로 BTS 7 값을 가지고 생성됨
);
void sayFemale()
{
print("저희는 여자 아이돌입니다.");
}
}
이용해 보세요
https://github.com/jeonguk29/flutter_study/tree/main/dart_study/Code_Factory
'APP > Dart' 카테고리의 다른 글
dart 객체지향프로그래밍 static 키워드란?, 인스턴스에 귀속, 클레스에 귀속된다는 건 무슨 말인가? (0) | 2022.08.16 |
---|---|
dart 객체지향 프로그래밍 Override란? (0) | 2022.08.16 |
dart 객체지향 프로그래밍 Private 속성 (0) | 2022.08.16 |
dart 객체지향 프로그래밍 Getter and Setter (0) | 2022.08.16 |
dart 문법 총 정리 OOP (객체지향 프로그래밍) immutable 프로그래밍 이란? , 생성자 앞에 const 키워드를 붙이면 어떻게 되는가 (0) | 2022.08.04 |