마저 정리해보자!
[무료 프로그래밍 강의] 1시간만에 끝내는 객체지향 프로그래밍 - YouTube
6. Override
메서드 오버라이드 개념을 배워보자!
void main(){
TimesTwo tt = TimesTwo(2);
print(tt.calculate());
}
// method - class 내부에 있는 함수를 지칭한다.
// override - 덮어쓰다.( 우선시 하다.)
class TimesTwo{
final int number;
TimesTwo(
this.number,
);
// method
int calculate(){
return number *2;
}
}
숫자를 넣으면 2배 곱 값을 주는 메서드(class 내부에 있는 함수)를 만들자
4를 리턴한다.
class TimesFour extends TimesTwo{
TimesFour(int number)
:super(number);
}
TimesTwo 를 extends 해서 TimesFour를 만든다.
void main(){
TimesTwo tt = TimesTwo(2);
print(tt.calculate());
TimesFour tf = TimesFour(2);
print(tf.calculate());
}
똑같이 4가 출력된다.
calculate를 부모 클래스의 메서드라서 당연히 사용가능
만약 TimesFour에서 calculate 메서드를 다르게 정의하고 싶다면?
@override 키워드를 사용한다
class TimesFour extends TimesTwo{
TimesFour(int number)
:super(number);
@override
int calculate(){
return super.number*4;
}
}
TimesFour 생성자에 int number를 넣으면 부모,본인 클래스에 number 가 있다.
super를 통해서 number를 가져오고 곱하기 4 연산을 하고 넘겨주면 이제 4배 곱이 넘겨진다.
super에도 number 가 있고
TimesFour 본인에게도 number 있으니까 this.number 로 할 수도 있고 number로된 다른 변수가 없으니까 그냥 number 이렇게 해도 된다.
부모 클래스의 calculate 값을 사용하는 방식으로 override를 해보자!
class TimesFour extends TimesTwo{
TimesFour(int number)
:super(number);
@override
int calculate(){
return super.calculate()*2;
}
}
super의 calculate를 가져와서 또 곱하기 2해서 보내 줄 수도 있다.
7. Static 키워드
Static은 인스턴스에 귀속되는 것이 아닌 class 에 귀속된다.
void main(){
Employee seulgi = Employee('슬기');
Employee chorong = Employee('초롱');
}
class Employee {
// Static은 인스턴스에 귀속되는 것이 아닌 class에 귀속된다.
static String? building;
// 알바생 이름
final String? name;
Employee(
this.name,
);
void printNameAndBuilding(){
print('제 이름은 $name 입니다. $building 건물에서 근무하고 있습니다.');
}
static void printBuilding(){
print('저는 $building 건물에서 근무중입니다.');
}
}
이렇게 Employee 클래스를 만든다.
name을 final 로 선언했기 때문에
이름을 변경할 수 없다.
이런 경우 name은 인스턴스에 귀속되어있다.' 라고 표현한다.
printNameAndBuilding을 한다면
building 이름은 아직 안정했기 때문에 Null 이뜬다. 이런 경우도 인스턴스에 귀속되어있다고 표현.
Employee에서 building 을 초기화해보자
class에서 building 이름을 선언했는데 인스턴스에서도 값을 공유한다.
static은 class에 귀속된다.
8. Interface
다른 언어에서는 interface 키워드가 있지만 dart에서는 class 이름으로 구현할 수 있다.
void main(){
}
class IdolInterface{
String name;
IdolInterface(this.name);
void sayName(){
}
}
class BoyGroup implements IdolInterface{
String name;
BoyGroup(this.name);
void sayName(){}
}
IdolInterface 라는 이름으로 Interface를 만들었다. IdolInterface를 사용하는 BoyGroup.
인터페이스를 사용할때는 implements 라는 키워드를 사용한다. 안에 아무것도 선언 안하면 오류가 생긴다.
Missing concrete implementations of 'IdolInterface.sayName', 'getter IdolInterface.name', and 'setter IdolInterface.name'.
IdolInterface에 있는 변수와 메서드를 가져와라는 뜻이다.
interface는 실제로 값을 상속하는 것이 아닌 메서드, 맴버 틀?을 제공한다고 생각하면 된다.
abstract 키워드
만약 interface를 누가 인스턴스화하고 사용한다면? 문제는 없지만 방지하는 것이 좋다.
그럴 땐 abstract 키워드를 이용하여 interface의 instance 화를 막을 수 있다.
abstract class IdolInterface{
String name;
IdolInterface(this.name);
void sayName();
}
instance 화 할 수 없기 때문에 메서드의 바디도 지워주자
상속받은 interface 인스턴스의 타입은 부모 인터페이스와 같은 타입이라고 뜬다.
9. Generic
타입을 외부에서 받을때 사용한다?
이때까지 생성자의 특징은 메서드나 맴버나 타입이 미리 선언되었다는 점이다. 만약 id의 타입을 외부에서 받아서 변경하고 싶다면?
class Lecture<T> {
final T id;
final String name;
Lecture(this.id, this.name);
void printIdType(){
print(id.runtimeType);
}
}
<> 꺽쇠괄호를 열고 안에 타입을 정의한다. T는 임의로 정한 타입이름이다. 타입을 받으면 id의 타입은 T 가 된다.
void main(){
Lecture<String> lecture1 = Lecture('123','lecture1');
lecture1.printIdType();
}
타입을 출력하는 printIdType 메서드를 사용하면
String 이라고 출력된다.
10. 모든 class는 object의 extends 이다 .
모든 class는 4개의 메서드르 기본으로 갖고 있다.
object의 extends 이다.
'플러터' 카테고리의 다른 글
flutter 공부 | 1시간만에 끝내는 객체지향 프로그래밍 (1) (0) | 2022.04.07 |
---|---|
플러터 타이핑 애니메이션 효과 적용하기 flutter animated_text_kit (0) | 2022.04.07 |
flutter web 브라우저별 다르게 출력될때- MediaQuery (0) | 2022.04.06 |
Firebase web hosting 하기 (0) | 2022.04.06 |