이번 스터디는 class에서 사용되는 super, this라는 키워드에 대해 알아보고자 한다.
아래 소스를 통해 super와 this의 범위, 또한 어떻게 사용하는지에 대해 알아보자.
이번 포스팅은 아래소스로만 쓰여지며, 보는 방법은 주석앞 숫자를 순서대로
따라가면서 보면 되겠다.
void main() {
//Dart언어공부-22.class의 super 와 this의 차이.
//언제 어떻게 사용하는것이 좋을지 알아보자.
//7. 엔지니어 클래스를 인스턴스화 하여 값을 호출해보자.
Engineer eng = new Engineer(
language: ['dart', 'java', 'javascript'], name: '개발자', building: '공유오피스');
print(eng.name);
print(eng.building);
print(eng.language);
//9. Engineer클래스의 함수를 호출해보자.
eng.sayInfo();
eng.sayName();
}
//1. 직원클래스 생성
class Employee {
//2. 필수로 입력 받을수 있도록 final키워드를 사용한다.
final String building;
final String name;
//3. 생성자를 만든다.
Employee(
String building,
String name,
) : this.building = building,
this.name = name;
}
//4. 엔지니어 클래스 생성
class Engineer extends Employee {
//5. 엔지니어가 사용하는 언어에 대해 List로 받기 위해서 선언
List<String> language;
//12. 자식클래스와 부모클래스와의 위치 확인을 위한 변수선언
String name;
//6. 상속받는 클래스이기 때문에, super키워드를 사용하여 부모클래스에 대한 파라미터도 할당한다.
Engineer({List<String> language, String name, String building})
: this.language = language,
super(
building = building,
name = name,
);
//8. 기능하나를 선언해 보자.
void sayInfo() {
//10. 호출해보면 정상적으로 모든값들이 누락없이 표현된다.
//여기서의 super는 부모클래스를 뜻하고, this는 자식클래스를 뜻하는데
//실제 자식클래스에는 없는 building가 나오는 이유는, 부모클래스의 모든것을
//상속받기 때문에 this에도 포함이 되어있기 때문이다.
print('저의 이름은 ${super.name}이고, 제가 근무하는 건물은 ${this.building}입니다.');
print('제가 사용할줄 아는 언어는 ${this.language.join(',')}입니다.');
}
//11. 만약 자식클래스에도 name변수가 있다고 가정해보자.
//13. 선언시작
void sayName() {
print('이것은 this의 이름인 ${this.name}이고, 이것은 super의name인 ${super.name}입니다.');
}
//14. 당연히 this인 자식클래스에 재정의를 해버리고 생성자에서 할당해주지도 않았기 때문에
//null값이 발생한다.
//15. 만약 해당클래스에서 name변수를 다시 지워버리고 13번을 호출하면 super의 값을 그대로 상속받기
//때문에 super의 name이 그대로 호출된다.
}
기본적으로 상속에 대한 개념을 잡고 있다면, 쉽게 이해가 가능하다.
상속을 받았다면, 부모가 가지고 있는 모든것들을 내가 가진채로 사용할 수 있으며,
새롭게 선언하여 사용하면 this라는 키워드를 사용하여 표현이 가능하다.
※상속받았다는 기준하에, super는 부모클래스를 뜻하고
this는 자기자신(자식클래스)을 지칭한다. 앞에 super를 지정하지 않으면 기본적으로 부모로 부터 상속
받은 값을 따라가지만, 자식클래스에 재정의 되어있다면 자식클래스의 값을 가지고 사용한다. (this영향)
super와 this의 범위 차이 스터디 끝.