포스팅 환경
- Dart 2.18.2
개요
다트는 구글에서 웹 어플리케이션에 사용하려고 만들었으나
지금은 플루터 앱을 만드는 언어로 주로 쓰여지고 있습니다.
다트를 공부하면서 느낀 것은 Java 같기도 하고 Kotlin 같기도 하고 JavaScrpit 같기도 하고..
여러모로 짬뽕이 된 정체성으로 이도저도 아닌 느낌..?
여러 언어들의 문법과 장점을 채용해서 그런 것 같기도 합니다.
의아한 점이 많으나 생각보다 문법은 어렵지 않습니다.
(개인적인 견해는 Kotlin 이 짱 😘)
다트를 공부하면서 ; 세미콜론을 다시 붙이려니 죽을 것 같습니다(?)
약간 도시생활을 즐기다가 다시 귀농한 느낌???? 입니다... 😭
여튼 다트를 공부하면서 배운 내용을 포스팅해보려 합니다.
연습환경
다트 또한 코틀린이나 기타 언어들 처럼 공식적으로 다트언어를 running 해볼 수 있는 웹사이트를 제공합니다.
아래 웹사이트를 통해서 별로의 다운로드, 설치 과정 없이 다트 언어를 연습해볼 수 있습니다.
진입점(entry point)
다트 문법은 자바, 코틀린 처럼 main() 함수가 진입점 입니다.
void main() {
// 여기에 작성합니다.
print("Hello, World!")
}
주석(comment)
주석은 코드에 달아두는 설명으로 실행에 영향을 주지 않습니다.
다트에서 주석을 작성하는 방법은 아래 예시와 같이 총 3가지 입니다.
// 한줄 주석
/**
* 여러 줄 주석
**/
/// 문서 주석
/// 를 함수나 클래스 정의 위에 작성하면 dartdoc 과 같은 문서 생성 도구를 통해 문서를 자동으로 생성해줍니다.
문장(statement)
문장은 명령 단위 입니다.
다트에서는 문장 끝은 세미콜론(;)으로 표시합니다.
void main() {
print("안녕하세요");
}
변수(variable)
다트는 숫자나 문자열 같은 기본 변수 타입을 제공하며, 사용자가 직접 타입을 정의할 수도 있습니다.
다트는 다음과 같은 기본 타입을 제공합니다.
- int 정수
- double 실수
- String 문자열 '', ""
- bool 참 또는 거짓의 논리적인 값을 갖는 타입
문자열(String) 타입
String name;
name = "홍길동";
bool 타입
// 참(true) 거짓은 false
bool b = true;
// i는 10보다 작다.
bool b2 = i < 10;
bool b3 = s.isEmpty;
int 와 double 그리고 num
int i = 10;
double d = 10.0;
// int 와 double 은 num 타입에 포함됩니다.
num a = i;
num b = d;
// 일부 언어에서 지원하는 자동 형변환은 지원하지 않습니다.
// 예) int -> double
d = i // 에러
타입 추론
다트에서는 다른언어와 마찬가지로 타입을 직접 명시 하지 않고 var 로 대체할 수 있는 타입 추론도 지원합니다.
var i = 10; // int
var d = 10.0; // double
var s = 'hello'; // String
var s2 = "hello"; // String
var b = true; // bool
var b2 = i < 10; // bool
var b3 = s.isEmpty; // bool
Non Null 과 Nullable
다트에서는 Kotlin 처럼 타입에 ? 을 사용하여 nullable 하다는 것을 명시할 수 있습니다.
또한 타입에 ? 없다는 것은 non null 하다는 것 이기 때문에 null safe 하게 사용할 수 있습니다.
// i 와 d 는 nullable 하다는 것을 컴파일러에게 알려줍니다.
int? i = 10;
double? d = 10.0;
// 컴파일 통과
i = null;
d = null;
// i 와 d 는 non null 하기 때문에 컴파일 에러가 발생합니다.
int i = null;
double d = null;
타입 추론에서는 nullable 과 non null 을 어떻게 판단 할까요?
// i 와 d 는 타입 추론에 의해서 nullable 한 변수가 됩니다.
var i = null;
var d = null;
// 컴파일 통과
var i = null;
i = 10;
// 컴파일 에러
// i는 10으로 값이 초기화 될 때 non null 하게 타입이 정해졌으므로 null 을 넣으려고 하면 컴파일 에러 발생
var i = 10;
i = null;
상수 - final, const
final 은 자바와 동일한 개념이고 코틀린에서는 val 로 볼 수 있습니다.
마찬가지로 한번 변수 값이 정해지면 변경할 수 없습니다.
const 와 final 의 같은 불변한 변수이지만 차이점은 const 는 컴파일 시점에 값이 할당된다는 것 입니다.
자바에서는 final static 과 같은 개념이고 코틀린에서는 object const val 과 같은 개념이라고 보시면 됩니다.
final String name = "Kyu";
name = "linitial"; // 에러 발생
static const String name = "Kyu";
name = "linitial"; // 에러 발생
연산자
다트도 다른언어 처럼 여러 연산자 키워드가 있습니다.
산술 연산자
+ : 더하기
- : 빼기
* : 곱하기
/ : 나누기(double 타입 반환)
~/ : 몫(int 타입 반환)
% : 나머지(int 타입 반환)
증감 연산자
증감 연산자는 아시다시피 값을 1씩 증가시키거나 감소시키는 연산자로
다트도 후위 연산과 전위 연산이 있습니다.
- 후위 연산: 값++, 값--
- 전위 연산: ++값, --값
var num = 0;
print(num++); // 아직 num 은 0
print(++num); // num 은 2가 됨.
비교 연산자
다트에서는 다음과 같은 비교 연산자를 제공합니다.
a == b : a 와 b 가 같다
a != b : a 와 b 는 다르다
a > b : a 가 b 보다 크다
a < b : a 가 b 보다 작다
a >= b : a 가 b 보다 크거나 같다
a <= b : a 가 b 보다 작거나 같다.
print(1 == 2); // 같다
print(1 != 2); // 다르다
print(1 > 2); // 더 크다
print(1 < 2); // 더 작다
print(1 >= 2); // 크거나 같다
print(1 <= 2); // 작거나 같다
논리 연산자
계산식을 연산하여 결과를 참 또는 거짓으로 반환하는 논리연산자입니다.
다트에서 제공하는 논리 연산자는 다음과 같습니다.
&& : AND 조건
|| : OR 조건
== : 같은지 비교
!= : 다른지 비교
! : 부정
print("result: ${true && false}"); // false
print("result: ${true || false}"); // true
print("result: ${true == false}"); // false
print("result: ${true != false}"); // true
print("result: ${true == false}"); // false
타입 검사
다트에서 객체의 타입을 검사하는 키워드는 다음과 같습니다.
- is : 같은 타입이면 true
- is! : 다른 타입이면 true
int a = 10;
String s = "hello, world";
if (a is int) {
print("정수입니다.");
}
if (s is! int) {
print("정수가 아닙니다.");
}
형변환(type cating)
다트에서는 형변환에 as 키워드를 사용합니다.
다른 타입끼리는 당연히 형변환을 할 수 없고
자바와 코틀린처럼 다형성에 기반하여 상위, 하위로 형변환이 가능합니다.
(하지만 Kotlin 처럼 as? 키워드로 null safe 한 형변환 문법은 제공하지 않습니다. 아쉬운 부분..)
상위 형변환(up casting)
/*
* double 형의 d 와 int 형의 a 는 타입이 달라서 형변환 할 수 없습니다.
*/
double d = 10.0;
int a = d as int; // 에러 발생
num n = d as num;
num n = d; // as 구문 생략도 가능합니다.
하위 형변환(down casting)
/*
* num 에 10.0 이라는 double 형의 값을 할당하였으므로 double 형으로 하위 형변환이 가능합니다.
*/
num n = 10.0;
double d = n as double;
print(d);
어떻게 double 과 int 형 ↔ num 형으로 상위, 하위 형변환이 가능할까요?
이미 눈치채신 분들도 계시겠지만
당연하게도 double 형과 int 형이 num 을 상속받았기에 가능합니다.
abstract class double extends num {
...
}
abstract class int extends num {
...
}
기본적인 dart 문법을 살펴보았습니다.
다음 포스팅에서는 함수에 대해서 포스팅을 진행하려 합니다.
이상으로 포스팅을 마치겠습니다.
감사합니다 :)
https://linitial.tistory.com/46?category=1050635
'Develop > Flutter' 카테고리의 다른 글
[Dart] 배우기 - 4. 컬렉션 (0) | 2022.10.26 |
---|---|
[Dart] 배우기 - 3. 분기와 반복 (0) | 2022.10.26 |
[Dart] 배우기 - 2. 함수 정의와 호출 (0) | 2022.10.25 |
[Flutter] - 앱 실행 도중 멈춤 현상(IOS, 신뢰하지 않는 개발자) (0) | 2022.10.24 |
[Flutter] - flutter SDK 자주 쓰는 명령어 모음 (0) | 2022.10.21 |