Flutter/Dart

Dart 클래스(class)

오늘도개발 2023. 4. 19. 16:47

 

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 클래스명{} )