Skip to main content

Dart의 메소드

Dart2.19.6Less than 1 minute

원문 : https://dart.dev/language/methodsopen in new window

메소드는 객체에 대한 행동을 제공하는 함수입니다.

인스턴스 메소드

객체의 인스턴스 메소드는 인스턴스 변수와 this에 접근할 수 있습니다.
아래 예제의 distanceTo() 메소드는 인스턴스 메소드의 예제입니다.

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;
    }
}

연산자

연산자는 특별한 이름을 가진 인스턴스 메소드 입니다.
Dart는 아래의 이름 연산자를 정의할 수 있게 합니다.

<+|>>>
>/^[]
<=~/&[]=
>=*<<~
-%>>==

Note

!=와 같은 몇몇 연산자가 목록에 없음을 알 수 있을 것입니다.
이것은 단순히 구문적 변형이기 때문입니다.
예로 들어, e1 != e2 표현식은 !(e1 == e2)의 구문적 변형입니다.

연산자 선언은 내장된 식별자인 operator를 사용하여 정의할 수 있습니다.
아래 예제는 벡터의 더하기(+), 빼기(-), 동등(==)을 정의한 것 입니다.

class Vector {
    final 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);

    
    bool operator ==(Object other) =>
        other is Vector && x == other.x && y == other.y;
    
    
    int get hashCode => Object.hash(x, y);
}

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

    assert(v + w == Vector(4, 5));
    assert(v - w == Vector(0, 1));
}

getter와 setter

getter와 setter는 객체의 속성을 읽고 쓸수 있는 특별한 메소드 입니다.
각 인스턴스 변수는 암묵적으로 getter와 가능하면 setter까지 가지고 있다는것을 기억하세요.
getset 키워드를 사용한 getter와 setter를 구현하여 추가적인 속성을 생성할 수 있습니다.

class Rectangle {
    double left, top, width, height;

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

    // 두 계산된 속성을 정의 : right, bottom
    double get right => left + width;
    set right(double value) => left = value - width;
    double get bottom => top + height;
    set bottom(double value) => top = value - height;
}

void main() {
    var rect = Rectangle(3, 4, 20, 15);
    assert(rect.left == 3);
    rect.right = 12;
    assert(rect.left == -8);
}

getter와 setter를 사용하면 클라이언트 코드를 변경하지 않고 인스턴스 변수로 시작하여 나중에는 메소드로 래핑할 수 있습니다.

Note

증분(++)와 같은 연산자는 getter가 명시적으로 정의되어있는지 여부와 상관없이 예상대로 동작합니다.
예상치 못한 부작용을 피하기 위해 연산자는 getter를 딱 한번만 호출하고 해당 값을 임시변수에 저장합니다.

추상 메소드

인스턴스, getter와 setter는 추상이 될 수 있으며 인터페이스를 정의해도 다른 클래스에서 구현할 수 있도록 남길수 있습니다.
추상 메소드는 추상 클래스에서만 존재합니다.

메소드를 추상으로 만들기 위해 메소드 본문 대신 세미콜론(;)을 사용합니다.

abstract class Doer {
    // 인스턴스 변수와 메소드를 정의...

    void doSomething(); // 추상 메소드를 정의
}ß

class EffectiveDoer extends Doer {
    void doSomething() {
        // 구현을 제공하며 메소드는 여기서 추상이 아닙니다.
    }
}