1. 클래스란?
- 서로 다른 타입이 특정 개념에 의해서 하나의 데이터 구조로 동작해야 하는 경우 주로 사용한다.
- OOP 프로그래밍에 핵심( 객체로 사용 )이며 c 에서는 구조체로 사용되었다.
- 클래스는 멤버변수(속성)와 멤버함수(행동)으로 구성되어 있다.
- 프로그램을 서로 다른 사람이 함께 개발할 경우나 자신이 개발할 때, 변수로만 사용한다면 가독성이 및 유지보수 효율성이 떨어진다. 또한 데이터가 섞여 런타임 오류를 발생 시킬 수 있기 때문에 이를 방지 하는 용도로도 사용할 수 있다. ( OOP의 필요성으로도 볼 수 있다.)
2. 클래스 선언
- class 클래스 이름 { 멤버변수, 멤버함수 }
- 클래스의 이름은 첫 글자 대문자로 표기한다. ( clean code ; 변수의 이름만 보고도 클래스인지 알 수 있기 때문 )
class Person {
// 기본적으로 getter setter 내장
String name = '이름';
late int age;
// 생성자 사용자의 혼동을 방지하기 위해 map으로 구현
Person({required this.name, required this.age});
void printPerson() {
print(name);
print(age);
}
}
* 클래스 내부에서 멤버번수에 접근 할 때, 명시가 필요한 경우 this 를 사용한다.
- 생성자를 따로 정의하지 않으면 default 생성자로 빈 껍데기만 생성할 수 있다.
3. 클래스 인스턴스 생성 및 내부 접근
- class 멤버변수 및 멤버 함수에 접근할 때 인스턴스명.멤버 변수 또는 멤버 함수명을 사용한다.
class Person {
// 기본적으로 getter setter 내장
String name = '이름';
late int age;
// 생성자
Person({required this.name, required this.age});
void printPerson() {
print(name);
print(age);
}
void main(List<String> args) {
//인스턴스 생성
Person pp = Person(name: 'Jhon', age: 13);
//setter
pp.name = 'Jack';
//getter
print(pp.name);
}
- Class 를 정의하는 것은 객체의 설계도를 제작하는 것이다. (붕어빵 기계의 제작틀로 보면된다.) 그러므로 실제 붕어빵을 만드는 것을 생성자로 생성하고 생성된 것을 인스턴스(붕어빵)라고 하고 실제 데이터를 넣고 사용할 수 있다.
* OOP 및 Class 가 잘 이해되지 않는다면 블로그내 JAVA 카테고리의 게시물을 보면 자세한 설명을 볼 수 있다.
4. 클래스 상속
- 다른 객체(부모 객체)의 기능들을 중복하여 가지고 있는 경우, 상속을 받아서 일부분만 재정의, 추가정의를 하여 클래스를 만들 수 있는데 이를 상속이라고 한다. 부모 class 는 자식 class 의 기능을 사용할 수 없고, 자식 class 에서는 부모 class 의 기능을 가져와서 그대로 사용하거나, 재정의(override) 해서 사용할 수 있다.
- 중복되는 코드를 방지(유지보수 효율성)하기위해 상속을 사용한다.
- 클래스 상속은 중복되는 코드 ( 공통되는 속성 )를 부모 클래스( 상위 클래스 )로 정의하고, 특징적인 부분만 자식 클래스로 구현하여 사용할 수 있다.
Ex> 부모 클래스 : 사람(이름과 나이를 가짐) -> 자식 클래스: 학생(학교와 학생번호를 가지고 있음), 노동자 ( 노동자 ID와 직업을 가지고 있다.)
- 부모 클래스를 정의하는 방법은 일반적인 클래스의 정의 방법과 동일하고, 자식 클래스의 정의 방법은 클래스명 뒤에 extands 부모클래스명 을 추가로 작성하면 된다. ( java와 유사 )
Ex> class Student extends Person{
}
- 부모 클래스의 일부분을 자식 클래스에서 다르게 정의 할 수 도 있다. (Override)
Ex. @override
void printAll(){
print(name);
print(student_num);
}
- 부모 클래스의 멤버 변수 및 멤버 함수에 접근하기 위해서는 super 를 사용한다.
Ex> super.name;
- 자식 클래스에서 부모 클래스 생성자는 super(); 로 생성할 수 있다.
class Person {
// 기본적으로 getter setter 내장
String name = '이름';
late int age;
// 생성자
Person({required this.name, required this.age});
void printAll() {
print(name);
print(age);
}
}
class Student extends Person {
late int? student_num;
Student({required String name, required int age}) : super(name: name, age: age);
set studentNum(int value) {
student_num = value;
}
int get studentNum => student_num ?? 0;
@override
void printAll() {
print(name);
print(studentNum);
}
}
void main(List<String> args) {
Student stu = Student(name: 'Jhon', age: 15);
//setter
stu.studentNum = 12;
//getter
print(stu.studentNum);
stu.printAll();
}
5. Class 상속 추가 내용
- class 상속은 유지보수 효율성을 위해 최소한으로 사용한다. ( decoupling )
- OOP 상 부모 클래스의 속성을 명확하게 가지는 경우 런타임 오류를 방지하기 위해서 사용 할 수 있다.
- 추후 인터페이스를 사용하여 추상화 클래스를 상속 받고 재정의 하여 사용할 수 있다.
- 추상화 클래스의 상속은 extands 대신 implements 를 사용한다.
* 추상화 클래스는 객체를 설계 할 때, 멤버 변수나 메서드의 이름만 개념적으로 공통으로 공유할 때 사용한다. 팀 프로젝트로 개발시 프로그램 아키텍쳐가 설계도 처럼 인터페이스(추상 클래스)를 제공하고 메서드의 사용과 정의를 개별적으로 작업할 수 있도록 하는 역할도 있다. (추상화 클래스 정의: abstract class 클래스명{} )
'Flutter > Dart' 카테고리의 다른 글
Dart 연산자 (0) | 2023.04.20 |
---|---|
Dart class 캡슐화 (Getter, Setter, 접근제한자) (0) | 2023.04.19 |
Dart 함수(function, main function) (2) | 2023.04.19 |
Dart 반복문 ( for, while, do while, continue, break ) (0) | 2023.04.19 |
Dart 조건문 ( if, if - else, if - else if - else, switch ) (0) | 2023.04.19 |