모든 인스턴스 변수는 내부적으로 getter 메서드를 생성합니다. Non-final 변수 그리고 이니셜라이저가 없는 late final 인스턴스 변수 또한 내부적으로 setter 메서드를 생성합니다. 더 자세히 알고 싶다면, Getter와 setter를 참고하세요.
초기화되지 않은 인스턴스 변수는 null 값을 가진다.
class Point {
double? x; // 초기값이 null인 인스턴스 변수 x를 선언.
double? y; // 초기값이 null인 y 선언.
double z = 0; // 초기값이 0인 z 선언.
}
Non-late 변수가 선언된 동시에 초기화되면 인스턴스가 생성될 때, 생성자와 해당 이니셜라이저 목록이 실행되기 전에 값이 설정된다. 결과적으로, non-late 인스턴스 변수 이니셜라이저는 this
에 접근할 수 없다.
class Point {
double? x; // 초기값이 null인 인스턴스 변수 x 선언.
double? y; // 초기값이 null인 y 선언.
}
void main() {
var point = Point();
point.x = 4; // x의 setter 메서드를 사용합니다.
assert(point.x == 4); // x의 getter 메서드를 사용합니다.
assert(point.y == null); // y의 디폴트 값은 null입니다.
}
인스턴스 변수는 final
로 선언할 수 있고, 그런 경우에는 단 한 번만 값이 정확하게 할당된다. final
과 non-late 인스턴스 변수를 선언할 때 생성자 매개변수나, 생성자의 이니셜라이저 목록를 사용하여 초기화해야한다.
class ProfileMark {
final String name;
final DateTime start = DateTime.now();
ProfileMark(this.name);
ProfileMark.unnamed() : name = '';
}
생성자 바디가 시작된 후에 final
인스턴스 변수의 값을 할당하고 싶다면, factory 생성자를 사용하거나, late final을 사용하면 된다.
클래스는 클래스의 모든 인스턴스 멤버와 클래스가 구현하는 모든 인터페이스를 포함하는 인터페이스를 암시적으로 정의합니다. B 클래스를 상속받지 않은 A 클래스가 B의 API를 사용하고 싶다면 B 인터페이스를 구현해야 합니다.
하나의 클래스는 implements
문 안에 하나 혹은 여러 개의 인터페이스를 구현하고, 인터페이스에 필요한 API들을 제공한다.
/ person. 암묵적 인터페이스는 greet()을 포함합니다.
class Person {
// 인터페이스의 안에 있지만 해당 라이브러리에서만 확인이 가능합니다.
final String _name;
// 생성자이기 때문에 인터페이스에 없습니다.
Person(this._name);
// 인터페이스에 있습니다.
String greet(String who) => 'Hello, $who. I am $_name.';
}
// Person 인터페이스의 구현.
class Impostor implements Person {
String get _name => '';
String greet(String who) => 'Hi $who. Do you know who I am?';
}
String greetBob(Person person) => person.greet('Bob');
void main() {
print(greetBob(Person('Kathy')));
print(greetBob(Impostor()));
}
여러 개의 인터페이스를 가지는 클래스
class Point implements Comparable, Location {...}
static 키워드를 사용해 클래스 와이드한 변수와 메소드를 구현하세요.
정적 변수(클래스 변수)는 클래스 와이드한 상수와, 상태를 정의할 때 유용하다.
class Queue {
static const initialCapacity = 16;
// ···
}
void main() {
assert(Queue.initialCapacity == 16);
}
정적 변수는 사용하기 전에는 초기화되지 않는다.
정적 메소드(클래스 메소드)는 인스턴스 위에서 실행되지 않기 때문에 this
에 접근 할 수 없지만, 정적 변수에 대한 접근은 가능하다. 하단 코드는 클래스에서 직접 정적 메소드를 실행하는 코드이다.
import 'dart:math';
class Point {
double x, y;
Point(this.x, this.y);
static double distanceBetween(Point a, Point b) {
var dx = a.x - b.x;
var dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}
}
void main() {
var a = Point(2, 2);
var b = Point(4, 4);
var distance = Point.distanceBetween(a, b);
assert(2.8 < distance && distance < 2.9);
print(distance);
}
정적 메소드를 컴파일 타임 상수로 사용 할 수 있다. 예를 들어, 상수 생성자의 매개변수로 정적 메소드를 넘겨 줄 수 있다.