본문 바로가기
다트(Dart) 언어 강좌

생성자와 메서드를 알아보자

by everythingdev 2024. 7. 25.
반응형

생성자와 메서드를 알아보자

  • 플러터를 시작하기 전 다트(Dart) 언어의 개념에 대해 정리를 해보고자 합니다.
  • 다트(Dart) 언어 개념 정리 포스팅 후 플러터(Flutter) 개념 정리로 넘어갈 예정입니다.
  • 플러터(Flutter) 개념 정리 후 실습이 시작 된다고 보시면 될 것 같습니다.

소개

  • Dart는 Google이 개발한 현대적이고 강력한 프로그래밍 언어입니다.
  • 특히 Flutter 프레임워크와 함께 사용되어 크로스 플랫폼 애플리케이션 개발에 널리 사용되고 있습니다.
  • Dart의 주요 특징 중 하나는 객체 지향 프로그래밍(OOP)을 강력하게 지원한다는 점입니다.
  • 이번 포스팅에서는 Dart의 객체 지향 프로그래밍의 핵심 요소인 생성자와 메서드에 대해 자세히 알아보겠습니다.

생성자: 객체의 시작점

생성자는 클래스의 인스턴스를 생성할 때 호출되는 특별한 메서드입니다. Dart에서 생성자는 매우 유연하고 다양한 방식으로 정의할 수 있습니다.

기본 생성자

가장 간단한 형태의 생성자는 클래스 이름과 동일한 이름을 가진 메서드입니다.

class Person {
  String name;
  int age;

  Person(this.name, this.age);
}

  • 이 예제에서 Person 클래스의 기본 생성자는 nameage 매개변수를 받아 해당 속성을 초기화합니다.

명명된 생성자

Dart는 여러 생성자를 정의할 수 있도록 명명된 생성자를 지원합니다.

class Point {
  double x, y;

  Point(this.x, this.y);

  Point.origin() {
    x = 0;
    y = 0;
  }
}

  • Point.origin()은 명명된 생성자의 예시입니다. 이를 통해 원점(0, 0)에 위치한 Point 객체를 쉽게 생성할 수 있습니다.

팩토리 생성자

팩토리 생성자는 항상 새로운 인스턴스를 생성하지 않고, 경우에 따라 기존 인스턴스를 반환하거나 서브클래스의 인스턴스를 반환할 수 있습니다.

class Logger {
  final String name;
  static final Map<String, Logger> _cache = <String, Logger>{};

  factory Logger(String name) {
    return _cache.putIfAbsent(name, () => Logger._internal(name));
  }

  Logger._internal(this.name);
}
  • 이 예제에서 Logger 클래스는 팩토리 생성자를 사용하여 동일한 이름의 로거 인스턴스를 재사용합니다.

메서드: 객체의 행동을 정의

메서드는 클래스의 행동을 정의하는 함수입니다. Dart에서는 다양한 종류의 메서드를 정의할 수 있습니다.

인스턴스 메서드

가장 일반적인 형태의 메서드로, 객체의 인스턴스에서 호출됩니다.

class Car {
  String brand;
  int speed = 0;

  Car(this.brand);

  void accelerate() {
    speed += 10;
    print('$brand의 속도가 증가했습니다. 현재 속도: $speed km/h');
  }
}
  • accelerate() 메서드는 Car 클래스의 인스턴스에서 호출할 수 있는 인스턴스 메서드입니다.

정적 메서드

클래스의 인스턴스가 아닌 클래스 자체에 속한 메서드입니다.

class MathUtils {
  static int add(int a, int b) {
    return a + b;
  }
}
  • 정적 메서드는 클래스의 인스턴스를 생성하지 않고도 호출할 수 있습니다: MathUtils.add(5, 3).

게터와 세터

Dart에서는 게터와 세터를 사용하여 객체의 속성에 접근하고 수정할 수 있습니다.

class Rectangle {
  double _width, _height;

  Rectangle(this._width, this._height);

  double get area => _width * _height;

  set width(double value) {
    if (value > 0) {
      _width = value;
    }
  }
}
  • 이 예제에서 area는 읽기 전용 속성으로, 게터를 통해 계산됩니다. width는 세터를 통해 유효성 검사 후 설정됩니다.

추상 메서드

추상 클래스에서 구현 없이 선언만 된 메서드입니다. 서브클래스에서 반드시 구현해야 합니다.

abstract class Shape {
  double get area;
}

class Circle extends Shape {
  double radius;

  Circle(this.radius);

  @override
  double get area => 3.14 * radius * radius;
}
  • Shape 클래스의 area 게터는 추상 메서드이며, Circle 클래스에서 구체적으로 구현됩니다.

생성자와 메서드의 고급 기능

Dart는 생성자와 메서드에 대해 몇 가지 고급 기능을 제공합니다.

초기화 리스트

생성자의 본문이 실행되기 전에 인스턴스 변수를 초기화할 수 있습니다.

class Point {
  final double x;
  final double y;
  final double distanceFromOrigin;

  Point(double x, double y)
      : x = x,
        y = y,
        distanceFromOrigin = sqrt(x * x + y * y);
}

리다이렉팅 생성자

다른 생성자를 호출하는 생성자를 정의할 수 있습니다.

class Point {
  double x, y;

  Point(this.x, this.y);

  Point.alongXAxis(double x) : this(x, 0);
}

연산자 오버로딩

Dart에서는 연산자를 오버로딩하여 클래스의 객체에 대해 산술 연산 등을 정의할 수 있습니다.

class Vector {
  final int x, y;

  Vector(this.x, this.y);

  Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
  Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
}
  • 이 예제에서는 벡터의 덧셈과 뺄셈을 정의했습니다.

결론

  • Dart의 생성자와 메서드는 객체 지향 프로그래밍의 핵심 요소로, 클래스의 인스턴스를 생성하고 그 행동을 정의하는 데 사용됩니다. 기본 생성자부터 팩토리 생성자, 다양한 종류의 메서드, 그리고 고급 기능들까지, Dart는 풍부하고 유연한 도구를 제공하여 개발자가 효율적이고 유지보수가 용이한 코드를 작성할 수 있도록 돕습니다.
  • 이러한 기능들을 잘 활용하면, 복잡한 애플리케이션 구조를 깔끔하게 설계하고 구현할 수 있습니다. 특히 Flutter를 사용한 모바일 앱 개발에서 이러한 Dart의 특징은 큰 강점으로 작용합니다. 객체 지향 프로그래밍의 원칙을 잘 따르면서도, Dart만의 독특하고 강력한 기능들을 활용하여 효율적이고 확장 가능한 소프트웨어를 개발할 수 있습니다.
  • Dart의 생성자와 메서드에 대해 깊이 이해하고 실제 프로젝트에 적용해 보면서, 여러분의 프로그래밍 스킬을 한 단계 더 발전시킬 수 있을 것입니다.

맺음말

  • 이번 포스팅에서는 다트의 생성자와 메서드에 대해 알아보았습니다.
  • 다음 포스팅에서는 다트의 상속과 다형성에 대해 알아보고자 합니다.
반응형