Flutter를 사용해서 앱 개발을 해보고 싶어져서 공부하게 된 Dart......(Flutter는 Dart언어의 프레임워크입니다)
우씨...Flutter 사용하겠다고 Dart를 굳이 공부해야되?.....자바 공부하는것도 오래걸렸는데....
어허! 걱정하지 마세요 :) Dart도 OOP 언어입니다. 자바에 대해 열심히 공부하셨다면 Dart를 이해하고 쓰는데는 오랜 시간이 걸리지 않을겁니다. 대부분의 문법이 자바와 매우 유사한점이 많습니다.
What is Dart?
Dart는 Google팀에서 만든 객체지향개념 기반의 프로그래밍 언어입니다.
javascript를 대체하기 위해서 개발한 언어이며, 모바일 앱, 웹, 서버 프로그래밍 등 무엇이든 만들 수 있습니다.
또한 Native Code 로 IOS, Android 앱을 개발 할 수 있습니다 !
공식 홈페이지에서도 메인화면에 Dart is a client-optimized language for fast apps on any platform
라는 문구처럼 모든 플랫폼에서 강력한 앱 개발을 할 수 있다고 자랑하고 있습니다. (UI적인 요소는 Flutter가 담당을 하죠?)
Dart의 특징
- Sound null safety
- Dynamic type
- Native platform & Web platform
- Flutter's best friend
- Typedef
1. Sound null safety
말 그대로 null값을 참조하거나 사용하는걸 사전에 방지해주는 시스템입니다.
개발자가 해당 변수의 값이 null 일 수 있음을 표시하지 않는다면, 해당 변수는 Null값을 가지지 못합니다.
// Null Safety
// ?를 명시하여 해당 값이 null일수도 있음을 알려줍니다.
String? name = 'woojin';
name = null;
// isNotEmpty메소드는 값이 비어있지 않은지를 확인해줍니다.
// 하지만 값이 null인 경우를 명시를 해줘야지 사용가능합니다.
if (name != null) {
name.isNotEmpty;
}
name?.isNotEmpty;
2. Dynamic type
Dart는 dynamic type이라는걸 지원합니다. 자바로 비유하자면 제너릭과 매우 비슷합니다.
dynamic으로 선언한 변수는 그 자리에서 데이터타입이 정해지지 않으며, 추후에 개발자가 초기화 하는 데이터값의 타입에 따라 알아서 변하는 특징이 있습니다.
//Basic Variables
// 다이나믹 타입 변수 선언.
dynamic name;
// 값이 문자열일때
if (name is String) {
name = '우진';
}
name = 'woojin';
// 값이 정수일때
if (name is int) {
name = 32;
}
// 모든 데이터타입으로 초기화가 가능하다
name = 12.2;
name = true;
3. Native & Web platform
핵심만 말하자면 Native platform에서 Dart는 JIT, AOT 두개를 모두 지원한다는 특징이 있습니다.
사용자가 개발을 할때는 변경사항이 있을때마다 코드를 AOT로 컴파일 하게 되면 작업속도가 매우 느려지고 자원낭비가 심해집니다.
그래서 개발 단계에서는 Dart VM의 가상환경에서 JIT 컴파일을 사용하여 효율적인 작업을 가능하게 하며, 변경사항에 대해 즉시 확인이 가능합니다.
개발이 끝나고 배포를 하게 되는 단계에서는 AOT 컴파일러를 사용하여 빠르게 배포를 할 수 있게 도와줍니다. 또한 가비지 컬렉터가 작동을 하여 효율적인 메모리 관리가 가능해집니다.
3. Flutter's best friend
아마 이 글을 읽고 계신분들은 말 안해도 당연히 아실 부분이라고 생각이 듭니다 !
사실 Flutter를 사용하기 위해 Dart를 공부한다. 라는 말이 있을정도로 Dart는 Flutter와 긴밀한 관계를 맺고 있습니다.
그들이 단순히 언어와 프레임워크 라는 관계에만 있었다면, 이렇게 까지 발전하지는 않았을겁니다.
Dart & Flutter 모두 Google팀에서 제작한 언어와 프레임워크 입니다. 만약에 Flutter의 성능이나 기능적인 측면에서 언어인 Dart의 개선과 도움이 필요하다면 Flutter 팀은 Dart팀에게 요청을 하여 수정이나 업데이트가 이루어 질 수 있습니다 !!!
예를 들어 Spring팀이 기능적인 면에서 성장을 이루고자 Java팀에게 특정한 요청을 한다면 받아줄까요??....아니죠
Spring은 단순히 기존에 존재하는 언어에 적용한 프레임워크일 뿐입니다. 하지만 Dart & Flutter는 서로 같은 회사에서 일을 하고 있기 때문에 서로 요청을 하여 개선이 이루어질 수 있다는 점이 특징이자 아주 큰 장점입니다.
그래서 Flutter가 이렇게 빠르고 큰 발전을 이룰수 있지 않았나 싶네요 :)
Dart 기본 문법
자바와 매우 비슷하기 때문에 너무 기본적인걸 제외한 자바와 다른점을 중점적으로 소개해드리겠습니다.
- Data type (num?...)
- 상수 final, const
- 타입 검사
- Function 함수 (return =>)
- Named parameter
Data type 자료형
void main() {
String name = 'woojin';
bool alive = true;
int age = 12;
double money = 23.33;
// parent class
num x = 12;
x = 1.2;
var level = 3;
}
자바와 자료형 타입이 거의 동일합니다.
다만 조금 다른점은 num이라는 타입이 존재합니다. num은 int, double의 부모 클래스입니다. 그렇기에 num으로 명시한 변수는 정수가 올 수도 실수가 올 수도 있습니다. 또한 자바스크립트 처럼 var 사용이 가능하며 초기화 하는 데이터값에 따라 자료형을 유추합니다.
상수 final, const
// Final, Late, Const
final String name2 = 'wooj';
// 데이터값을 나중에 초기화
// do something, go to api
late final String name3;
// 에러발생.
name2 = 'nico';
print(name2);
//const 사용하여 계산후 값 할당
const API = '5123123';
자바에서와 동일하게 final은 상수를 의미하며, 한번 할당된 값을 다시 초기화 할 수 없습니다.
const도 이와 비슷하게 사용이 되는데 두 개의 제일 큰 차이점은 계산하는 시점이 다릅니다.
- final 변수: 선언과 동시에 값을 할당하면 이후에는 값을 변경할 수 없습니다.
- const 변수: 선언과 동시에 값을 할당하면 이후에는 값을 변경할 수 없으며, 컴파일 타임에 값을 계산합니다.
타입 검사
String name = 'woojin';
if(name is String){
name = 'woo';
}
if(name is! String){
name = 'jin';
}
is를 사용하여 데이터 타입을 비교할 수 있습니다. 위와 같은 코드 작성시 name변수는 문자열임으로
name = 'woo' 로 다시 초기화되는걸 알 수 있습니다.
Function 함수 (return =>)
String sayHello(String name) {
return 'my name is $name';
}
String sayBye(String name) => 'adios $name';
위와 같은 return 방식을 =>을 사용하여 한줄로 줄일 수 있습니다. (람다식)
Named parmeter (required)
String sayHello(
{required String name, required String country, required int age}) =>
'Hi my name is $name, i\'m from $country and $age years old';
void main(List<String> args) {
print(sayHello(name: 'woojin', country: 'korea', age: 25));
}
매개변수 설정시 {}안에 선언함으로써 선택 매개변수로 만들어 특정 매개변수만 보낼 수 있으며, {}로 감싸지 않으면 필수로 모두 보내줘야 합니다. 또한 선택 매개변수를 활용하여 순서 상관없이 매개변수 작성이 가능하다는 이점이 있습니다.
sayHello 메소드와 같이 return 하는 값에서 모든 매개변수를 활용하여 전달할때는 required를 자료형 타입 앞에 명시하여 해당 매개변수는 필수로 전달을 해줘야함을 알려줄 수 있습니다 (null 방지)
Typedef
typedef ListOfInts = List<int>;
ListOfInts reverseListOfNumbers(ListOfInts list) {
var reversed = list.reversed;
return reversed.toList();
}
typedef UserInfo = Map<String, String>;
String sayHi(UserInfo userInfo) {
return "Hi ${userInfo['name']}";
}
void main(List<String> args) {
print(reverseListOfNumbers([1, 2, 3]));
print(sayHi({'name': 'woojin'}));
}
위와 같이 자료형 타입을 개발자가 원하는 이름으로 정의가 가능합니다.
코드의 가독성과 접근성 측면에서 좋은 방식인거 같습니다 :)
'Flutter' 카테고리의 다른 글
[Flutter] Flutter 프로젝트 생성 및 기초 .feat 프로젝트 실행해보기 ! (0) | 2023.03.11 |
---|