오늘은 늦게 와서 블로그를 못 쓸줄 알았다 하지만 이 시간을 그냥 보내는 것이 너무 싫어서 조금 공부했던 내용을 정리 할까 한다.
1편은 이전 글을 참고하면 된다.
1.inheritance
상속을 받으면 부모 클래스의 모든 속성을 자식 클래스가 부여 받는다.
void main () {
Idol bts = Idol(name: 'bts', membersCount: 3);
print(bts.name); // bts
print(bts.membersCount); // 3
bts.sayName(); // 저는 bts입니다.
print('------- 상속받은 나 -------');
BoyGroup boy = BoyGroup('나',1);
print(boy.name); // 나
boy.sayName(); // 저는 나입니다. ?
boy.sayMail(); // 저는 남자 아이돌 입니다.
}
------------------IDOL 클래스 생성---------------
class Idol {
String name;
int membersCount;
Idol({
required this.name,
required this.membersCount,
});
void sayName() {
print('저는 ${this.name}입니다.');
}
}
-------------상속 받기------------------------
class BoyGroup extends Idol {
BoyGroup(
String name,
int membersCount,
) : super(
name: name,
membersCount: membersCount,
);
-----추가한 함수-------
void sayMail() {
print('저는 남자 아이돌 입니다.');
}
}
결론 부모의 컨스트럭트 까지 받아야 한다. 상속은 무조건 부모에서 자식, 자식 간에도 안된다. super 는 부모를 뜻한다, sayName 같은 경우 부모의 함수인데 자식이 사용할수 있다.
2.override
오버라이드는 심플하게 덮어쓰다 - 우선시 하다 라고 생각하면 좋다. 코드예시를 작성해보자!
void main() {
// method overiding
TimesTwo tt = TimesTwo(2);
print(tt.calculate()); // 4
TimesFour tf = TimesFour(4);
print(tf.calculate()); // 16
}
class TimesTwo {
final int number;
TimesTwo(
this.number,
);
int calculate() {
return number * 2;
}
}
// override는 상속한 값들에 한해 오버라이드 하는거다
class TimesFour extends TimesTwo {
TimesFour(
int number,
): super(number);
@override
int calculate() {
return super.calculate() * 2;
}
// 이렇게도 가능하다 부모의 값을 가져와서
}
상속을 배워 부모를 상속 받고 super를 이용하여 받은 값을 넣어줌으로 그 값의 반환값으로 override를 통해 값을 산출 할수도 있다.
3.static
void main (){
Employee me = Employee('나');
Employee you = Employee('너');
me.printNameAndBuilding();
you.printNameAndBuilding();
// 제 이름은 나 입니다. null 회사에 있다
// 제 이름은 너 입니다. null 회사에 있다
Employee.building = '멋진 건물';
me.printNameAndBuilding();
you.printNameAndBuilding();
// 제 이름은 나 입니다. 멋진 건물 에 있다
// 제 이름은 너 입니다. 멋진 건물 에 있다
}
class Employee {
* static 은 instance에 귀속되지 않고 class에 귀속된다 *
static String? building;
final String name;
Employee(
this.name,
);
void printNameAndBuilding () {
print('제 이름은 $name 입니다. $building 에 있다');
}
static void printBuilding() {
print('저는 $building 입니다.');
}
}
클래스 자체에 귀속이 되기때문에 static 값으로 귀속시킬수가 있다.
인스턴스에 귀속 한다는 거는 인스턴스를 만들고 값을 바꿀수 있다는 거고
클래스에 귀속 된다는것은 다이렉트 하게 점으로 실행하거나 값을 바꿀수 있다는것이다.
여기서 중요한 것은 Direct 다 Employee.building = '멋진 건물' 라고 넣어줌 으로 다시 호출 했을 경우 자식 인스턴스 두값에 building 값이 들어간 것을 확인할 수있다.
4.interface
extends 키워드를 쓰면 상속이고, implements 를 쓰면 interface 다 간단한 예시 코드로 학습해보자
// interface
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 입니다.');
}
}
아래 interface를 쓴 두개의 class가 있다 interface 를 interface 클래스랑 같은 모습을 만들어줘야 한다.
-> 강제하는 역할을 한다.
만약 interface를 인스턴스화 하려고 만든게 아닌데 인스턴스화 하는것을 막는것은 바로 추상적 단어인 abstract를 붙여준다.
여기서 좋은 기능은. IdolInterface 함수의 body를 지워도 된다.
abstract class IdolInterface {
String name;
IdolInterface(this.name);
void sayName() {}
}
이런 느낌이다.
5.Generic
간단하다 외부에서 타입을 변수처럼 외부에서 받는것이다.
void main () {
Lecture<String> lecture1 = Lecture('123','lecture1');
lecture1.printType(); // String
}
// generic - 타입을 외부에서 받을때 사용
// 클래스 이름 옆에다가 꺽새로 열고닫고 한다.
class Lecture<T>{
final T id;
final T name;
Lecture(this.id, this.name);
void printType () {
print(id.runtimeType);
}
}
// 간단하게 Generic은 타입을 변수처럼 외부에서 받아서 쓸수 있도록 해주는
// 제네릭이라고 생각하면 된다.
클래스는 뭔가.. 재밌는거 같다. 흐흣 오늘은 여기까지~