[FLUTTER] DART 언어 기초과정 - 3 / A Tour of the Dart Language
플러터란 ? 구글에서 개발한 크로스 플랫폼 앱 개발 프레임워크이다. 언어는 구글이 개발한 Dart 를 사용한다. 안드로이드, iOS, Web, Desktop 을 지원하며 구글의 차기 OS Fuchsia의 메인개발환경이 된다고 한다.
- 최대한 내용을 줄여 표현했습니다. (너무 길면 이해가 힘들고, 어느정도 수준이 되어야 이해가 되기 때문)
- 혹시 궁금하시다면 위 링크를 참조 하시면 됩니다.
이전 편
- [FLUTTER] DART 언어 기초과정 - 2 / A Tour of the Dart Language
- [FLUTTER] DART 언어 기초과정 - 1 / A Tour of the Dart Language
40. class 맴버 활용
객체(Object)는 함수(function)와 데이터(data)로 구성된 멤버를가집니다 (각각 메소드(method)와 인스턴스 변수(instance variable)).
메서드를 호출하면 개체에서 해당 메서드를 호출 할 수 있습니다. 이 메서드는 해당 개체의 함수 및 데이터에 액세스 할 수 있습니다.
- 닷 dot(.)을 통해 인스턴스 변수 또는 메소드에 접근 할 수 있습니다.
- ?. 을 통해 좌측 값이 null 인 경우 오류를 발생하는 경우를 방지 할 수 있습니다.(null point exception)
var p = Point(2, 2);
// p.y에 3을 할당
p.y = 3;
// p의 y 값을 가져와 비교
assert(p.y == 3);
// Invoke distanceTo() on p.
// p의 distanceTo 매소드를 호출한 결과 값을 할당
num distance = p.distanceTo(Point(4, 4));
// p 가 null 이 아니라면 p.y에 4를 할당
p?.y = 4;
41. class 생성자(construnctors) 활용
- 생성자는 클래스명 또는 클래스명.식별자로 사용될 수 있습니다.
- Dart 2 부터 new 키워드는 옵션입니다.
var p1 = Point(2, 2);
var p2 = Point.fromJson({'x': 1, 'y': 2});
- const 를 사용하여 생성할 수 있습니다.
var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);
assert(identical(a, b)); // 두개는 같은 인스턴스 임
var a = const ImmutablePoint(1, 1); // 상수(constant)로 생성
var b = ImmutablePoint(1, 1); // 상수(constant)로 생성하지 않음
assert(!identical(a, b)); // 동일한 인스턴스가 아님
- object의 타입 값 가져오기 : runtimeType
print('The type of a is ${a.runtimeType}');
- 인스턴스의 기본 값은 null 임
class Point {
num x;
num y;
}
void main() {
var point = Point();
point.x = 4; // x의 setter(설정) 사용
assert(point.x == 4); // x의 getter(가져오기) 사용
assert(point.y == null); // 값의 기본 값은 null 임
}
42. 생성자
- java와 유사한 방식
class Point {
num x, y;
Point(num x, num y) {
// 이보다 더 좋은 방법이 있습니다. 지켜봐 주세요
this.x = x;
this.y = y;
}
}
this
키워드는 현재 인스턴스를 참조 합니다.this
키워드는 이름이 충돌나는 경우에만 사용 바랍니다.- 인스턴스 변수에 생성자 인수를 할당하는 패턴
class Point {
num x, y;
// x,y 에 각각 값을 할당
Point(this.x, this.y);
}
42.1. 기본 생성자
생성자를 지정하지 않으면 기본 생성자를 제공하며, 기본 생성자는 인수가 없으며 수퍼 클래스에서 인수가 없는 생성자를 호출합니다.
42.2. 생성자는 상속받지 않습니다.
서브 클래스는 슈퍼 클래스에서 생성자를 상속받지 않습니다. 생성자(constructor)를 선언하지 않는 서브 클래스는, 디폴트 (인수 없음, 이름 없음)의 constructor 만을 가집니다.
42.3. 명명된 생성자
명명 된 생성자를 사용하여 클래스에 대한 여러 생성자를 구현하거나 추가적인 명확성을 제공할 수 있습니다.
class Point {
num x, y;
// 일반 생성자
Point(this.x, this.y);
// 명명된 생성자
Point.origin() {
x = 0;
y = 0;
}
}
수퍼 클래스 생성자에 대한 인수는 생성자를 호출하기 전에 평가되므로 인수는 함수 호출과 같은 표현식이 될 수 있습니다.
- 서브 클래스는 슈퍼 클래스에서 생성자를 상속받지 않습니다. 생성자(constructor)를 선언하지 않는 서브 클래스는, 디폴트 (인수 없음, 이름 없음)의 constructor 만을 가집니다.
- super 는 함수 호출전에 적용 됨
class Employee extends Person {
Employee() : super.fromJson(getDefaultData());
// ···
}
42.3. 목록 초기화(list initializer)
// :(콜론)을 통해 본문의 생성자가 실행되기 전에 값을 초기화 할 수 있습니다.
Point.fromJson(Map<String, num> json)
: x = json['x'],
y = json['y'] {
print('In Point.fromJson(): ($x, $y)');
}
import 'dart:math';
class Point {
final num x;
final num y;
final num distanceFromOrigin;
Point(x, y)
: x = x,
y = y,
distanceFromOrigin = sqrt(x * x + y * y);
}
main() {
var p = new Point(2, 3);
print(p.distanceFromOrigin);
}
42.4. 생성자 리다이렉팅(constructors redirecting)
- 특정 생성자에게 처리를 위임(delegating) 할 수 있다.
class Point {
num x, y;
// 메인 생성자
Point(this.x, this.y);
// 메인 생성자에게 위임
Point.alongXAxis(num x) : this(x, 0);
}
42.5. 상수 생성자(constant constructors)
- 초기 설정 후 값을 바꿀 수 없음
class ImmutablePoint {
static final ImmutablePoint origin =
const ImmutablePoint(0, 0);
final num x, y;
const ImmutablePoint(this.x, this.y);
}
42.5. 팩토리 생성자(factory constructors)
- 항상 클래스의 새 인스턴스를 생성하지는 않는 생성자를 구현할 때는 factory 키워드를 사용 바랍니다.
- 예를 들어 팩토리 생성자는 캐시에서 인스턴스를 반환하거나 하위 유형의 인스턴스를 반환 할 수 있습니다.
- 팩토리 생성자는
this
로 접근할 수 없습니다.
사용 예시
var logger = Logger('UI');
logger.log('Button clicked');
구현
class Logger {
final String name;
bool mute = false;
// _cache는 이름 앞에 _ (언더스코어)를 붙여 라이브러리 프라이빗 이다.
static final Map<String, Logger> _cache =
<String, Logger>{};
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final logger = Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
Logger._internal(this.name);
void log(String msg) {
if (!mute) print(msg);
}
}
43. 메소드(methods)
메서드(method)는 개체(object)에 동작(behavior)을 제공(providing)하는 함수(function)입니다.
43.1. getter/setter
- getter 및 setter는 객체 속성에 대한 읽기 및 쓰기 액세스를 제공하는 특수 메서드입니다.
- get 및 set 키워드를 사용하여 getter 및 setter를 구현하여 추가 속성을 만들 수 있습니다.
class Rectangle {
num left, top, width, height;
Rectangle(this.left, this.top, this.width, this.height);
// (right, bottom) 2개의 계산된 속성 정의
num get right => left + width;
set right(num value) => left = value - width;
num get bottom => top + height;
set bottom(num value) => top = value - height;
}
void main() {
var rect = Rectangle(3, 4, 20, 15);
assert(rect.left == 3);
rect.right = 12;
assert(rect.left == -8);
}
43.2. 추상(abstract) 메소드
- 추상화를 하기 위해서는 메소드 본체를 구현하는 대신 세미콜론(;)을 사용합니다.
abstract class Doer {
// 인스턴스 변수 및 메소드 정의 등 ...
void doSomething(); // 추상 메소드 정의
}
class EffectiveDoer extends Doer {
void doSomething() {
// 추상 메소드 구현, 해당 메소드는 이곳에는 추상화 불가
}
}
44. 클래스 상속
- extends를 사용하여 하위 클래스를 만들고 super를 사용하여 수퍼 클래스(상위)를 참조하십시오.
class Television {
void turnOn() {
_illuminateDisplay();
_activateIrSensor();
}
// ···
}
class SmartTelevision extends Television {
void turnOn() {
super.turnOn();
_bootNetworkInterface();
_initializeMemory();
_upgradeApps();
}
// ···
}
45. 맴버 오버라이딩(덮어쓰기)
- 서브 클래스는 인스턴스 메소드, getter 및 setter를 대체 할 수 있습니다.
- @override 주석을 사용하여 의도적으로 멤버를 재정의 할 수 있습니다.
class SmartTelevision extends Television {
@override
void turnOn() {...}
// ···
}
46. 연산자 오버라이딩
- 연산자 목록 :
<
,+
,|
,[]
,>
,/
,^
,[]=
,<=
,~/
,&
,~
,>=
,*
,<<
,==
,–
,%
,>>
- 위에 나열된 연산자를 재정의 할 수 있습니다.
- 예를 들어, Vector 클래스를 정의하면 + 메서드를 정의하여 두 벡터를 추가 할 수 있습니다.
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);
}
void main() {
final v = Vector(2, 3);
final w = Vector(2, 2);
assert(v + w == Vector(4, 5));
assert(v - w == Vector(0, 1));
}
47. noSuchMethod()
class A {
// 정의되지 않은 매소드를 호출 시 처리 함
// 아래 매소드를 재정의 하지 않으면 NoSuchMethodError 를 발생시킴.
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ' +
'${invocation.memberName}');
}
}
48. 열거형(enumerated types)
- 기본 사용방법
enum Color { red, green, blue }
- 기본적으로 index 값은 앞에서 부터 0, 1 ... 의 값을 가지게 됨
assert(Color.red.index == 0);
assert(Color.green.index == 1);
assert(Color.blue.index == 2);
- switch 구문과 함께 사용하여, 코드를 좀더 알기 쉽게 만들 수 있음
var aColor = Color.blue;
switch (aColor) {
case Color.red:
print('Red as roses!');
break;
case Color.green:
print('Green as grass!');
break;
default: // 이 구문이 없으면 경고(warnning)를 받게 됨 (blue 값을 처리 하지 않았기 때문)
print(aColor); // 'Color.blue'
}
49. mixin
코드의 재활용성을 극대화 하기 위한 다중상속 모델
- 믹스 인은 여러 클래스 계층에서 클래스의 코드를 재사용하는 방법입니다.
- mixin을 사용하려면 하나 이상의 mixin 이름 뒤에 with 키워드를 사용하면 됩니다.
class Musician extends Performer with Musical {
// ···
}
class Maestro extends Person
with Musical, Aggressive, Demented {
Maestro(String maestroName) {
name = maestroName;
canConduct = true;
}
}
- 믹스 인을 구현하려면 Object를 확장하고 생성자를 선언하지 않는 클래스를 만듭니다.
- mixin을 일반 클래스로 사용할 수 없도록 하려면, class 대신 mixin 키워드를 사용하면 됩니다.
mixin Musical {
bool canPlayPiano = false;
bool canCompose = false;
bool canConduct = false;
void entertainMe() {
if (canPlayPiano) {
print('Playing piano');
} else if (canConduct) {
print('Waving hands');
} else {
print('Humming to self');
}
}
}
- 특정 유형 만 mixin을 사용할 수 있도록 지정하려면 on 을 사용하여 필수 수퍼 클래스를 지정하면 됩니다.
mixin MusicalPerformer on Musician {
// ···
}
맺음말
궁금하신 점은 언제나 댓글로 문의 주시면 성심것 답글 드립니다.
내용이 많아서 자르고 4편으로 이어 집니다.
관련 글 링크
@flutters : 제가 작성한 글 중 fluter 관련 글만 모아서 리스팀 처리
연재글
- [FLUTTER] DART 언어 기초과정 - 2 / A Tour of the Dart Language
- [FLUTTER] DART 언어 기초과정 - 1 / A Tour of the Dart Language
이것은 한글이고...
저것은 영문이고....
하하하하...
운선생님..!!
코딩이 하고 싶어요~~!
뉴비존 ...
ㅋㅋㅋㅋㅋㅋ
헉!! 이건 외계어 인가요? ㅋㅋㅋㅋㅋㅋㅋㅋ
독거님 ...
Congratulations @wonsama!
You raised your level and are now a Dolphin!
잘보고 있습니다. 프론트가 처음이라 Dart 배우면서 flutter 코딩을 하고 있네요.
넵 감사합니다 :)
Posted using Partiko Android
Hi @wonsama!
Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 3.815 which ranks you at #4619 across all Steem accounts.
Your rank has improved 8 places in the last three days (old rank 4627).
In our last Algorithmic Curation Round, consisting of 241 contributions, your post is ranked at #158.
Evaluation of your UA score:
Feel free to join our @steem-ua Discord server
정리를 매우 잘해주셨어요.
이제 다트 기초는 원사마님 포스팅만 보면 되겠습니다.
감사합니다 :)
궁금한게 너무 많아서 ㅋㅋㅋㅋ 댓글을 달수가 없었어요
Flutter와 DART가 대세로 자리잡고 있는 것일까요...
안드로이드 앱 개발자는 이제 어디로...