메서드는 객체에 동작을 제공하는 함수로, 크게 4가지 유형으로 나뉩니다: 인스턴스 메서드, 연산자 오버로딩, Getter/Setter, 추상 메서드.
1. Instance methods 인스턴스 메서드
- 클래스 인스턴스 객체에 속하는 메서드;
- 인스턴스 변수에 직접 접근할 수 있으며
this키워드를 사용 가능; - 완전한 함수 본문을 포함하며 업무 연산 및 로직 처리 수행 가능.
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 연산자 오버로딩
- 대부분의 연산자는 본질적으로 특수한 이름을 가진 인스턴스 메서드;
- 선언 문법:
operator 연산자(매개변수) 반환타입 { ... }; - 오버로딩 지원 연산자 목록:
< > <= >= == ~- + / ~/ * %| ˆ & << >>> >>[]= [] - 내장 연산자는 오버로딩 불가 (예:
!=, Dart 하위 계층에서 자동 구현되므로 수동 정의 불필요); ==를 오버로딩할 때 반드시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 접근자
get:읽기 전용 메서드, 계산 속성 조회, 매개변수 없음;set:쓰기 메서드, 연관 변수 수정, 매개변수 단 하나;- 모든 인스턴스 변수에 암시적 getter가 기본 제공, 가변 변수에는 암시적 setter도 포함;
- 장점: 나중에 일반 변수를 계산 로직으로 변경해도 외부 호출 코드 수정 불필요;
- 증감 연산자
++/--는 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 추상 메서드
- 인터페이스만 정의하고 본문 없음, 세미콜론
;으로 구현 대체; abstract class추상 클래스 또는 mixin 믹스인 내에만 작성 가능;- 자식 클래스는 모든 추상 메서드를 재정의하고 구현해야 하며, 구현하지 않을 경우 자식 클래스도
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 | 메서드 본문 없고 인터페이스 선언만 | 메서드 뒤에 ; | 추상 부모 클래스 규격 정의, 자식 클래스 구현 강제 |
Previous: Primary Constructors(주 생성자)