Flutter Study Day 2 Dart Class & Object 2

정정원·2023년 11월 29일
0

Flutter Study

목록 보기
3/17

인스턴스 변수

모든 인스턴스 변수는 내부적으로 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);
}

정적 메소드를 컴파일 타임 상수로 사용 할 수 있다. 예를 들어, 상수 생성자의 매개변수로 정적 메소드를 넘겨 줄 수 있다.

0개의 댓글