Method(메서드)

메서드는 객체에 동작을 제공하는 함수로, 크게 4가지 유형으로 나뉩니다: 인스턴스 메서드, 연산자 오버로딩, Getter/Setter, 추상 메서드.

1. Instance methods 인스턴스 메서드

  1. 클래스 인스턴스 객체에 속하는 메서드;
  2. 인스턴스 변수에 직접 접근할 수 있으며 this 키워드를 사용 가능;
  3. 완전한 함수 본문을 포함하며 업무 연산 및 로직 처리 수행 가능.
import 'dart:math';

class Point {
  final double x;
  final double y;

  // 생성자로 인스턴스 변수 초기화
  Point(this.x, this.y);

  // 인스턴스 메서드: 두 점 사이 거리 계산
  double distanceTo(Point other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return sqrt(dx * dx + dy * dy);
  }
}

void main() {
  Point p1 = Point(0, 0);
  Point p2 = Point(3, 4);
  print(p1.distanceTo(p2)); // 출력 5.0
}Code language: JavaScript (javascript)

2. Operators 연산자 오버로딩

  1. 대부분의 연산자는 본질적으로 특수한 이름을 가진 인스턴스 메서드;
  2. 선언 문법: operator 연산자(매개변수) 반환타입 { ... };
  3. 오버로딩 지원 연산자 목록:
    < > <= >= == ~
    - + / ~/ * %
    | ˆ & << >>> >>
    []= []
  4. 내장 연산자는 오버로딩 불가 (예: !=, Dart 하위 계층에서 자동 구현되므로 수동 정의 불필요);
  5. ==를 오버로딩할 때 반드시 hashCode도 함께 재정의해야 하며, 그렇지 않으면 동등 비교 시 오류가 발생합니다.
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);

  // == 연산자 오버로딩: 동등 비교
  @override
  bool operator ==(Object other) =>
      other is Vector && x == other.x && y == other.y;

  // 짝으로 hashCode 재정의
  @override
  int get hashCode => Object.hash(x, y);
}

void main() {
  final v = Vector(2, 3);
  final w = Vector(2, 2);

  assert(v + w == Vector(4, 5));
  assert(v - w == Vector(0, 1));
  print(v + w);
}Code language: JavaScript (javascript)

연산자 오버로딩을 통해 숫자처럼 두 Vector 객체에 +, -, == 등 숫자 전용 연산을 사용할 수 있습니다.

3. Getters and setters 접근자

  1. get:읽기 전용 메서드, 계산 속성 조회, 매개변수 없음;
  2. set:쓰기 메서드, 연관 변수 수정, 매개변수 단 하나;
  3. 모든 인스턴스 변수에 암시적 getter가 기본 제공, 가변 변수에는 암시적 setter도 포함;
  4. 장점: 나중에 일반 변수를 계산 로직으로 변경해도 외부 호출 코드 수정 불필요;
  5. 증감 연산자 ++/--는 getter를 한 번만 호출하고 값을 캐시하여 부작용 방지.
/// 화면 좌표계 사각형, 원점(0,0)은 좌측 상단
class Rectangle {
  double left, top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);

  // Getter: 우측 경계 계산
  double get right => left + width;

  // Setter: 우측 경계 지정 후 left 역산 갱신
  set right(double value) => left = value - width;

  // Getter: 하단 경계 계산
  double get bottom => top + height;

  // Setter: 하단 경계 지정 후 top 역산 갱신
  set bottom(double value) => top = value - height;
}

void main() {
  var rect = Rectangle(3, 4, 20, 15);
  assert(rect.left == 3);

  // setter 호출
  rect.right = 12;
  assert(rect.left == -8);
  print(rect.left); // -8
}Code language: JavaScript (javascript)

4. Abstract methods 추상 메서드

  1. 인터페이스만 정의하고 본문 없음, 세미콜론 ;으로 구현 대체;
  2. abstract class 추상 클래스 또는 mixin 믹스인 내에만 작성 가능;
  3. 자식 클래스는 모든 추상 메서드를 재정의하고 구현해야 하며, 구현하지 않을 경우 자식 클래스도 abstract로 표기해야 함.
// 추상 클래스: 추상 메서드 포함
abstract class Doer {
  // 추상 메서드: 선언만 있고 구현 없음
  void doSomething();
}

// 일반 자식 클래스: 부모의 모든 추상 메서드 구현 필수
class EffectiveDoer extends Doer {
  @override
  void doSomething() {
    print("구체적인 업무 로직 실행");
  }
}

void main() {
  Doer worker = EffectiveDoer();
  worker.doSomething(); // 출력: 구체적인 업무 로직 실행
}Code language: JavaScript (javascript)

비교표

메서드 유형핵심 특징문법 표기사용 시나리오
인스턴스 메서드 Instance인스턴스 변수 접근, 완전한 로직 본문일반 함수 정의객체 일반 동작 (연산, 업무 처리)
연산자 오버로딩 Operator특수 이름 인스턴스 메서드, operator 키워드 사용operator +()사용자 정의 객체 덧셈/뺄셈/첨자/동등 비교
Getter/Setter속성 읽기쓰기, get은 매개변수 없고 set은 매개변수 하나get / set계산 속성 캡슐화, 외부 통합 접근 통로
추상 메서드 Abstract메서드 본문 없고 인터페이스 선언만메서드 뒤에 ;추상 부모 클래스 규격 정의, 자식 클래스 구현 강제

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다