import 'dart:math';
class Point {
double x;
double y;
double z = 0;
Point(this.x, this.y, [this.z = 0]);
Map<String, double> getPoint()=>{'x':x, 'y':y, 'z':z};
double distanceTo(Point b){
final dx = x - b.x;
final dy = y - b.y;
final dz = z - b.z;
return sqrt(dx * dx + dy * dy + dz * dz);
}
}
void main() {
final p = Point(1,1);
final q = Point(4,5);
final curr = p.getPoint();
final dist = p.distanceTo(q);
print(dist);
}
클래스 멤버 사용하기
객체는 함수와 데이터로 구성된 멤버가 있다. 메소드를 호출 할 때, 객체에서 함수를 호출한다. 메소드는 호출할 때 객체 위에서 실행하므로 메소드는 객체의 함수와 데이터에 접근 할 수 있다.
모든 클래스는 암묵적으로 클래스와 구현된 인터페이스의 모든 인스턴스 멤버를 포함한 인터페이스를 정의한다.
B의 구현을 상속하지 않고 B클래스의 API를 지원하는 클래스 A를 생성하려면, 클래스 A는 B 인터페이스를 구현해야한다.
A클래스는 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()));
}
정적 변수, 정적 함수
import 'dart:math';
class Point {
double x;
double y;
double z = 0;
static String? name;
// Point(this.x, this.y, this.name [this.z = 0]); -> name은 인스턴스에 존재하지 않음
Point(this.x, this.y, [this.z = 0]);
Map<String, double> getPoint()=>{'x':x, 'y':y, 'z':z};
double distanceTo(Point b){
final dx = x - b.x;
final dy = y - b.y;
final dz = z - b.z;
return sqrt(dx * dx + dy * dy + dz * dz);
}
void printInfo() {
print('x: ${x} y: ${y} z: ${z} name: $name');
}
}
void main() {
final p = Point(1,1);
final q = Point(4,5);
p.printInfo();
q.printInfo();
Point.name = "점";
// p.name = "p점"; line 35 • The static setter 'name' can't be accessed through an instance.
// q.name = "q점";
p.printInfo();
q.printInfo();
}
static으로 선언된 변수와 함수는 인스턴스에서 동작하지 않고 사용되기 전까지 초기화 되지 않는다.