티스토리 뷰
Flutter 공부를 이제 막 시작을 해서, Flutter 프로젝트의 기본 구조를 익히다 보니.. 책에서 정리해주는 간단한 소개만으로는 Dart에 대한 이해가 많이 부족할 거 같아서 차근차근 정리해보려고 한다.
Google 에서 굉장히 밀어주는 언어라고 하니, 제대로 익혀놓는 것이 여러모로 편할 거 같아서.. ㅎㅎ 우선 이번 포스팅에서는 아주 기본적인 코드 샘플과 java와 다른 dart 만의 여러 특징들을 정리하려고 한다.
바로 들어가보자.
이 포스팅에서 다루지 않는 더 자세한 & 기본적인 부분은 공식 레퍼런스에서 확인할 수 있다.
우선, Dart 언어가 가지고 있는 몇 가지 특징부터 확인하고 가자.
1. 객체지향 언어답게, 변수에 넣을 수 있는 모든 값은 object이며, 모든 객체는 class의 인스턴스이다.
2. Dart는 최상위 함수(main() )뿐만 아니라, 클래스나 객체에 연결된 함수(정적 메서드, 인스턴스 메서드)도 지원한다. 또한 함수 안에 함수를 만들 수 있다.
3. java와 다르게, Dart는 public. protected, private 같은 접근 한정자가 없습니다. 식별자 앞에 underscore를 붙여 다른 클래스에서 접근이 불가능한 private로 만들 수 있다. 자세한 내용은 여기에서 확인할 수 있다.
이제 아주 기초적인 Code Samples를 확인해보자.
1. Hello world
새로운 언어 공부의 첫 시작은 언제나 hello world!
void main(List<String> arguments) {
print('Hello, World!');
}
>>
Hello, World!
2. 변수
dart는 각 변수의 type를 엄격하게 검사를 하지만, 대부분의 변수는 var를 사용하여 선언이 가능하다.
제네릭 변수로 사용하고 싶다면 dynamic type을 사용할 수 있다.
void main(List<String> arguments) {
var name = 'Voyager I';
var year = 1977;
var antennaDiameter = 3.7;
var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
var image = {
'tags': ['saturn'],
'url': '//path/to/saturn.jpg'
};
dynamic nameD = "dynamic";
print(nameD);
nameD = 123;
print(nameD);
}
>>
dynamic
123
3. 조건문과 반복문
java와 거의 비슷한 방식으로 조건문과 반복문을 사용할 수 있다.
void main(List<String> arguments) {
var year = 2021;
var flybyObjects = [1, 2, 3];
if (year >= 2001) {
print('21st century');
} else if (year >= 1901) {
print('20th century');
}
for (final object in flybyObjects) {
print(object);
}
for (int month = 1; month <= 12; month++) {
print(month);
}
while (year < 2032) {
year += 1;
print(year);
}
}
>> 생략
4. functions
함수는 아래와 같이 선언하여 사용할 수 있다.
void main(List<String> arguments) {
int fibonacci(int n) {
if (n == 0 || n == 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
var result = fibonacci(20);
print(result);
}
또한, 인자를 1개만 사용하는 함수의 경우는 아래와 같이 람다를 사용할 수도 있다.
void main(List<String> arguments) {
var flybyObjects = ["turn", "turn1", "name"];
flybyObjects.where((name) => name.contains('turn')).forEach(print);
}
>>
turn
turn 1
5. 주석
// 를 활용하여 주석을 작성할 수 있으며, /* comments */ 를 사용하여 여러 줄 주석도 사용할 수 있다.
6. Null safety
flutter가 2.0으로 업데이트되면서, null로 인해 생기는 예외를 없애기 위해 적용한 개념이다. dart에서 일반적인 방식으로 생성하는 변수는 전부 null 값을 가질 수 없으며, 변수에 할당된 초기값이 없으면 컴파일 과정에서 바로 에러를 뱉는다.
그러나 변수 생성 시에 type 오른쪽에? 를 붙여주면, 해당 변수는 null 값을 갖는 것이 허용된다.
7. Classes
아래 예제에서 클래스의 작성과 getter 메서드의 사용, 생성자 및 생성자를 다른 이름으로 명시해주는 방법 또한 확인할 수 있다. 또한 dart의 getter 및 setter 메서드의 작성은 여기에서 더욱 자세하게 확인할 수 있다.
import 'package:untitled1/untitled1.dart' as untitled1;
void main(List<String> arguments) {
var voyager = Spacecraft('Voyager I', DateTime(1977, 9, 5));
voyager.describe();
var voyager3 = Spacecraft.unlaunched('Voyager III');
voyager3.describe();
}
class Spacecraft {
String name;
DateTime? launchDate;
// Read-only non-final property
int? get launchYear => launchDate?.year;
// Constructor, with syntactic sugar for assignment to members.
Spacecraft(this.name, this.launchDate) {
// Initialization code goes here.
}
// Named constructor that forwards to the default one.
Spacecraft.unlaunched(String name) : this(name, null);
// Method.
void describe() {
print('Spacecraft: $name');
// Type promotion doesn't work on getters.
var launchDate = this.launchDate;
if (launchDate != null) {
int years = DateTime.now().difference(launchDate).inDays ~/ 365;
print('Launched: $launchYear ($years years ago)');
} else {
print('Unlaunched');
}
}
}
8. enum
dart 또한 다른 언어와 마찬가지로 enum을 활용할 수 있다.
import 'package:untitled1/untitled1.dart' as untitled1;
void main(List<String> arguments) {
final yourPlanet = Planet.mercury;
if (!yourPlanet.isGiant) {
print('Your planet is not a "giant planet".');
}
}
enum PlanetType { terrestrial, gas, ice }
/// Enum that enumerates the different planets in our solar system
/// and some of their properties.
enum Planet {
mercury(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
venus(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
// ···
uranus(planetType: PlanetType.ice, moons: 27, hasRings: true),
neptune(planetType: PlanetType.ice, moons: 14, hasRings: true);
/// A constant generating constructor
const Planet(
{required this.planetType, required this.moons, required this.hasRings});
/// All instance variables are final
final PlanetType planetType;
final int moons;
final bool hasRings;
/// Enhanced enums support getters and other methods
bool get isGiant =>
planetType == PlanetType.gas || planetType == PlanetType.ice;
}
>> Your planet is not a "giant planet".
9. 상속
java의 상속과 동일하게 extends 및 super를 사용하는 상속의 개념을 가지고 있다. 그리 어려운 내용은 아니니 간단한 형식만 보자.
class Orbiter extends Spacecraft {
double altitude;
Orbiter(super.name, DateTime super.launchDate, this.altitude);
}
또한, dart는 따로 인터페이스라는 키워드를 가지고 있지 않는 대신에 모든 클래스를 인터페이스처럼 사용하고 implements 하여 재정의할 수 있다.
10. 예외 처리
dart에서의 예외 처리는 아래와 같이 처리할 수 있다.
if (astronauts == 0) {
throw StateError('No astronauts.');
}
try {
for (final object in flybyObjects) {
var description = await File('$object.txt').readAsString();
print(description);
}
} on IOException catch (e) {
print('Could not describe object: $e');
} finally {
flybyObjects.clear();
}
이번 포스팅에서는 간단한 개념과 아주 기초적인 코드 샘플들을 확인해봤는데, 아직 끝난 것이 아니다.
null safety, 비동기 프로그래밍, 상속과 mixins 등과 같은 개념은 다음 포스팅에서 좀 더 자세하게 다뤄보기로 하겠다.
'Mobile > Dart' 카테고리의 다른 글
[Dart] Null Safety (0) | 2022.06.27 |
---|---|
[Dart] 비동기 프로그래밍: future, async, await (0) | 2022.06.27 |
[Dart] factory (0) | 2022.06.26 |
[Dart] Extends, Implements, With (0) | 2022.06.26 |
- 정보보안기사 #실기 #정리
- await
- AsyncStorage
- 이탈리안 레스토랑
- redux
- 인천 구월동 맛집
- Promise
- react-native
- react
- 인천 구월동 이탈리안 맛집
- 파니노구스토
- 맛집
- Async
- javascript
- redux-thunk
- Total
- Today
- Yesterday