class

Date:     Updated:

카테고리:

태그:

Dart에서 클래스는 객체 지향 프로그래밍의 핵심 개념으로, 데이터와 기능을 캡슐화하는 데 사용됩니다. 클래스는 객체를 생성하기 위한 템플릿을 정의하며, 객체는 이 클래스의 인스턴스입니다. Dart에서 클래스를 정의하고 사용하는 방법을 매우 상세하게 설명하겠습니다.

1. 클래스 정의

클래스를 정의하려면 class 키워드를 사용합니다. 클래스에는 데이터(변수)와 기능(메서드)을 포함할 수 있습니다.

class Person {
  // 필드 (데이터)
  String name;
  int age;

  // 생성자
  Person(this.name, this.age);

  // 메서드 (기능)
  void greet() {
    print('Hello, my name is $name and I am $age years old.');
  }
}

2. 클래스의 주요 구성 요소

2.1. 필드 (Fields)

클래스의 데이터는 필드라고 합니다. 필드는 클래스의 상태를 나타내며, 변수처럼 다룰 수 있습니다.

class Person {
  String name;
  int age;
}

2.2. 생성자 (Constructors)

생성자는 클래스의 인스턴스를 생성할 때 호출되는 특별한 메서드입니다. 생성자는 필드를 초기화하는 데 사용됩니다.

  • 기본 생성자: Dart는 기본 생성자를 자동으로 제공하지만, 사용자 정의 생성자를 작성할 수도 있습니다.

    class Person {
      String name;
      int age;
    
      Person(String name, int age) {
        this.name = name;
        this.age = age;
      }
    }
    
  • 축약형 생성자: 생성자의 매개변수를 필드와 동일한 이름으로 사용하는 축약형 생성자를 사용할 수 있습니다.

    class Person {
      String name;
      int age;
    
      Person(this.name, this.age);
    }
    
  • 명명된 생성자: 클래스에 여러 생성자를 정의하고 싶을 때 사용합니다. 생성자의 이름을 명명하여 사용할 수 있습니다.

    class Person {
      String name;
      int age;
    
      Person(this.name, this.age);
    
      Person.withDefaultAge(this.name) : age = 30;
    }
    

2.3. 메서드 (Methods)

클래스는 데이터를 조작하고 행동을 정의하는 메서드를 가질 수 있습니다.

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void greet() {
    print('Hello, my name is $name.');
  }

  int yearOfBirth() {
    return DateTime.now().year - age;
  }
}

2.4. 접근 제어 (Access Control)

  • public: Dart에서는 모든 필드와 메서드가 기본적으로 공개입니다. 다만, 이름 앞에 언더스코어(_)를 붙이면 비공개로 설정할 수 있습니다.

    class Person {
      String _name;  // private 필드
      int age;
    
      Person(this._name, this.age);
    
      void greet() {
        print('Hello, my name is $_name.');
      }
    }
    

2.5. 상속 (Inheritance)

클래스는 다른 클래스를 상속받아 기능을 확장할 수 있습니다. 상속을 사용하면 기존 클래스의 필드와 메서드를 재사용할 수 있습니다.

class Employee extends Person {
  String jobTitle;

  Employee(String name, int age, this.jobTitle) : super(name, age);

  @override
  void greet() {
    super.greet();
    print('I am an $jobTitle.');
  }
}
  • extends: Person 클래스를 상속받아 Employee 클래스를 생성합니다.
  • super: 부모 클래스의 생성자와 메서드를 호출합니다.
  • @override: 부모 클래스의 메서드를 재정의할 때 사용합니다.

2.6. 인터페이스 (Interfaces)

Dart에서는 인터페이스를 class를 통해 구현합니다. Dart에서는 모든 클래스가 암묵적으로 인터페이스 역할을 합니다.

class Animal {
  void makeSound();
}

class Dog implements Animal {
  @override
  void makeSound() {
    print('Woof!');
  }
}
  • implements: Animal 인터페이스를 구현합니다. 인터페이스에 정의된 모든 메서드를 구현해야 합니다.

2.7. 믹스인 (Mixins)

믹스인은 여러 클래스에서 공통으로 사용하는 메서드와 필드를 재사용할 수 있도록 도와줍니다. 믹스인은 클래스와 with 키워드를 사용하여 결합할 수 있습니다.

mixin Swimmer {
  void swim() {
    print('I can swim!');
  }
}

class Person {
  String name;
  Person(this.name);
}

class SwimmingPerson extends Person with Swimmer {
  SwimmingPerson(String name) : super(name);
}
  • mixin: 믹스인 정의
  • with: 믹스인을 클래스와 결합

3. 객체 생성 및 사용

클래스의 인스턴스를 생성하고 사용하려면 new 키워드를 사용하거나, Dart에서는 new 없이도 객체를 생성할 수 있습니다.

void main() {
  // 객체 생성
  Person person = Person('Alice', 30);

  // 메서드 호출
  person.greet();

  // 필드 접근
  print('Age: ${person.age}');
}

4. 정적 멤버 (Static Members)

클래스에 속하는 정적 필드와 메서드는 객체가 아닌 클래스 자체에 속합니다. static 키워드를 사용하여 정의합니다.

class MathUtil {
  static const double pi = 3.141592653589793;
  
  static double square(double number) {
    return number * number;
  }
}
  • static: 클래스에 속하는 필드와 메서드를 정의할 때 사용합니다.
void main() {
  print(MathUtil.pi);  // 정적 필드 접근
  print(MathUtil.square(5));  // 정적 메서드 호출
}

요약

  • 클래스는 객체 지향 프로그래밍의 기본 단위로, 데이터와 기능을 캡슐화합니다.
  • 필드메서드를 포함하며, 생성자를 사용하여 객체를 초기화합니다.
  • 상속, 인터페이스, 믹스인을 통해 코드 재사용과 다형성을 구현합니다.
  • 정적 멤버를 사용하여 클래스 레벨에서 데이터를 관리하고 메서드를 호출합니다.

클래스는 복잡한 데이터와 기능을 구조화하고 관리하는 데 필수적인 도구입니다. Dart에서 클래스를 잘 이해하고 활용하면 효율적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다.

Dart 카테고리 내 다른 글 보러가기

댓글 남기기