google에서 만든 프로그래밍 언어
flutter에서 사용함.
dart는 두 개의 컴파일러를 가지고 있다.
Dart의 컴파일 방법 ⇒ just-in-time, ahead-of-time
null safety
: 개발자가 null 값을 만들어냈을 때 애플리케이션이 망가지는 이슈를 해결하기 위해서 dart는 null safety를 도입함 ⇒ 프로그램을 빌드 시 좀 더 안전하게 할 수 있다.
flutter와 dart 모두 구글이 만들었다
⇒ 따라서 구글을 flutter를 위해 dart를 최적화 할 수 있다. 즉, 프레임워(flutter)를 위해서 프로그래밍 언어(dart)를 고칠 수 있다.
main함수는 모든 Dart 프로그램의 Entry point이다.
main 함수에서 쓴 코드가 호출된다. (만약 main이 없다면 실행이 되지 않음)
dart는 자동으로 세미콜론을 붙여주지 않기 때문에 직접 붙여야 한다. (일부러 세미콜론을 안 쓸 때가 있기 때문)
변수를 만드는 2가지 방법
var
: 함수나 메소드 내부에 지역변수를 선언할 때 사용
이 방식은 자료형을 지정해주지 않으므로 dart가 추측해서 사용하는데 업데이트 할 때 자료형이 일치하지 않으면 에러가 난다.
예를 들어 var name = "pizza"; 라고 했을 때 name변수의 자료형은 String인데 name의 값을 1(정수형)으로 업데이 하려고 하면 안된다.
타입(자료형) 지정 : class에서 변수나 property를 선언할 때
여러가지 타입을 가질 수 있는 변수에 쓰는 키워드이다.
(해당 변수의 타입을 알 수 없을 때 주로 사용)
변수를 선언할 때 dynamic을 쓰거나 값을 지정하지 않으면 dynamic 타입을 가진다.
Null Safety
: 개발자가 null 값을 참조할 수 없도록 하는 것이다.
String뒤에 '?'를 붙여줌으로서 name이 String 또는 null이 될 수 있다고 명시해준 것입니다.
기본적으로 모든 변수는 non-nullable(null이 될 수 없음)이다.
초기 데이터 없이 먼저 변수를 생성하고 추후에 데이터를 넣을 때 주로 사용한다.
flutter로 data fecthing을 할 때 유용하다.
late 변수를 만들고, API에 요청을 보낸 뒤에 API에서 값을 보내주면 그 응답 값을 late변수에 넣어 사용할 수 있다.
dart에서 const는 compile-time constant를 만들어준다.
const는 컴파일할 때 알고 있는 값을 사용해야 한다.
만약 어떤 값인지 모르고, 그 값이 API로부터 오거나 사용자가 화면에서 입력해야 하는 값이라면 그건 const가 아닌 final이나 var가 되어야 한다.
const : 컴파일 시점에 바뀌지 않는 값 (상수)
final : 컴파일 시점에 바뀌는 값 (API에서 받아온 값, 사용자 입력 값)
아래 타입을 포함한 거의 대부분의 타입들이 객체로 이루어져 있다. (함수도 객체)
이것이 Dart가 진정한 객체 지향 언어로 불리는 이유이다.
숫자형의 대표격인 타입,
int와 double은 서로 간에 형변환이 불가능하지만, num을 통해서는 가능하다
이렇게 형변환을 해야 하는 변수의 경우 처음부터 num으로 타입을 지정하면 된다.
다양한 숫자 값을 받아야 되는 경우 int와 double보단 num을 쓰는 것을 권유
void main() {
num a = 7;
num b = 3.14;
a = b;
print(a);
}
📌 int ⇒ 정수
📌 double ⇒ 실수
collection if
와 collection for
을 지원하는 것이다.set도 두 가지 방법으로 정의할 수 있다.
var을 사용
var numbers = {1, 2, 3};
자료형 명시
Set numbers = {1, 2, 3};
list는 대괄호([ ])를 쓰며 set은 중괄호({ })를 쓴다.
set의 요소들은 유니크하다. 🟰 set은 중복이 허용되지 않는다.
(list의 요소는 중복이 허용된다.)
?? 연산자를 이용하면 왼쪽 값이 null인지 체크해서 null이 아니면 왼쪽 값을 리턴하고 null이면 오른쪽 값을 리턴한다.
??= 연산자를 이용하면 변수 안에 값이 null일 때를 체크해서 값을 할당해줄 수 있다.
변수의 값이 null일 때 값을 할당해 주는 연산자이기 때문에 null이 아니면 값이 할당되지 않는다.
조금 다르게 동작하는 또 다른 Constructor를 가지고 싶다면?
예를 들어, 두 개의 Constructor를 만들고 싶다고 한다
(xp를 0으로 초기화 시킨 blue팀, red팀 player를 만든다고 가정)
Named Constructor란?
class를 초기화하는 method, 필요에 따라 다른 인자를 받을 수 있다.
콜론(:)을 사용하여 클래스의 property를 초기화 한다
enum은 우리가 코드를 작성할 때 실수를 하지 않게 도와준다.
flutter에는 여러 옵션들이 많다(color, margin, padding, style, 정렬 등)
그래서 오타 같은 실수들이 자주 발생할 수 있고 이런 실수들은 눈에 잘 안 보일 수도 있다. 이런 상황을 방지하기 위해 사용하는 것이 enum이다.
enum type의 변수들은 해당 enum type에 생성된 값들 중에서만 값이 할당될 수 있다.
예시
enum 생성 시 { } 안의 내용에 따옴표로(””,’’) 묶지 않는다 (= 텍스트 형태로 쓰지 않는다.)
이런 방식으로 새로운 “타입”을 생성한다.
추상화 클래스는 (추상화 클래스를 extends 한) 클래스들이 직접 구현해야 하는 메소드들을 모아 놓은 일종의 청사진
이라 보면 된다.
추상 클래스에서는 기능을 구현하지 않는다.
추상 클래스를 확장하는 클래스는 추상클래스의 파라미터도 상속받는다.
상속을 하고 super를 이용해 부모 클래스의 생성자를 호출할 수 있다.
상속한 부모 클래스의 프로퍼티에 접근하게 하거나 메소드를 호출할 수 있다.
이 때, 가장 중요한 것은 확장한 부모 클래스가 생성자를 포함하고 있는데
그 클래스를 다른 어떤 곳에서 사용하려면 필요한 값을 전달해야 하고
그 부모 클래스의 생성자를 호출해줘야 한다.
Mixin은 생성자가 없는 클래스이다. 클래스에 프로퍼티들을 추가할 때 유용하다.
extends가 아닌 with를 통해 Mixin의 프로퍼티들을 가져올 수 있다.
extend를 사용하여 상속받은 클래스는 자식 클래스, 상속한 클래스는 부모클래스가 되는 것이고, 자식 클래스는 부모 클래스를 super를 통해서 접근할 수 있다.
Mixin은 with라는 키워드를 통해서 단순히 Mixin 내부의 프로퍼티와 메소드들을 가져오는 것 뿐이다.
강의에서는 에러가 안 났는데 vsCode에서 에러가 남
참고 링크에 들어가 보니 mixin을 쓰려면 표시하라는 얘기였다.
최근 버전부터는 mixin 사용법이 수정 된 듯
mixin이자 class여야 한다면 ⇒ mixin class 클래스명 { }
순수 mixin 이면 ⇒ mixin 클래스명 { }