Dart | Dart #1 기본기

앙두·2023년 7월 4일
0

for My Programming

목록 보기
10/20

Dart

인프런 무료 강의
https://www.inflearn.com/course/lecture?courseSlug=dart-%EC%96%B8%EC%96%B4-%EC%9E%85%EB%AC%B8&unitId=107600
DartPad
https://dartpad.dev/

  • Dart는 구글에서 개발한 프로그래밍 언어

  • 크로스 플랫폼 애플리케이션 개발을 위해 사용, 주로 모바일 앱 및 웹 애플리케이션을 개발하는 데에 이용

  • 객체 지향 프로그래밍함수형 프로그래밍의 특징을 결합, 유연하면서도 강력한 언어

  • Just-in-Time 컴파일러와 Ahead-of-Time 컴파일러를 지원
    Just-in-Time 컴파일러는 개발자가 코드를 작성하면서 실시간으로 컴파일하여 실행하는 기능, 개발자들이 빠른 개발과 디버깅을 할 수 있게 함
    Ahead-of-Time 컴파일러는 미리 코드를 컴파일하여 기계어로 변환, 실행 속도가 향상되고 모바일 앱의 성능을 최적화

  • Flutter라는 UI 프레임워크를 통해 Dart를 사용하면 iOS, Android, 웹 및 데스크톱 애플리케이션을 모두 개발 가능!


변수 variable (var)

  • var 는 할당된 값에 따라 타입이 유추된다.
  • print(name.runtimeType) 으로 type 확인 가능
  • 한번 선언된 타입은 바뀔 수 없다.
  • 재할당 시 타입이 일치해야 한다.
var name = 'Ellie';
print(name.runtimeType); // String

name = 123; // 타입 비동일로 에러!
name = 'Amy';

정수 integer(int)

  • 정확한 숫자만 선언/할당 가능
int num = 10;

실수 double (double)

  • 실수(부동소수점), 정수 선언/할당 가능
double num = 5.0;
double num2 = 2.2;
print(num+num2); // 7.2

Boolean (bool)

  • boolean 값만 선언/할당 가능
bool isTrue = true;

글자 타입 (String)

  • 글자만 선언/할당 가능
  • 글자 타입은 앞글자가 대문자다 String
String name = 'Ellie';

다이나믹 타입 (dynamic) : 재선언할 때 타입 바꿔도 무관

  • var 와 달리 재할당 시, 다른 타입을 넣어도 됨
var num = 10;
dynamic num2 = 20;

num = 'hi'; // 타입 비동일로 에러!
num2 = false; // dynamic type 은 에러가 뜨지 않음

null / nullable / non-nullable

  • null : 아무런 값도 있지 않다.
  • nullable : null이 될 수 있다.
  • non-nullable : null이 될 수 없다.
String? name = 'ellie';
// ? 붙이면 nullable 이 됨
// String 일수도 있고, null 일수도 있다.
print(name!);
// ! 붙이면 현재 이 값은 null이 아니다라는 뜻

// null
double? num = 5.0;
// double 도 되고, null 도 될 수 있다는 의미
  
num ??= 1.0;
// ??= 는 왼쪽이 null 이면, 오른쪽으로 바꿔라.

final, const

  • final, const로 선언하면 값을 변경할 수 없다!
  • const 는 빌드타임을 알아야 한다.
  • final 은 빌드타임을 몰라도 된다. (빌드타임 ? 코드를 입력했을 때, 컴퓨터에게 입력되는 값(?))
final int num1 = 10;
const String num2 = '20';

// type 제거 가능!
final num3 = 30;
const num4 = 40;

// + type 이 맞는지 확인하고 싶을 때?
final ellie = 'name';
  
print(ellie is String); // true
print(ellie is int); // false
print(ellie is! bool); // true

List

제너릭

  • <> 안에 type 지정 : 해당 type으로만 구성된 List
List<String> sushi = ['연어', '광어', '계란', '새우'];
List<double> numbers = [10.2, 10.0, 11.78, 9.6];

print(sushi.length); // 4
print(sushi.indexOf('연어')); // 0

// List 에 추가
sushi.add('장어');
// List 에서 제거
sushi.remove('새우');

print(sushi); // [연어, 광어, 계란, 장어]

Map

  • Map 의 요소들은 Key / Value 한 쌍으로 구성
Map<String, int> myNote = {
    'ice cream': 3000,
    'tissue': 1000,
    'sandwich': 4500,
  };

// Map 에 값을 추가하고 싶을 때
myNote.addAll({
  'tumbler': 17000,
});
print(myNote);
// => {ice cream: 3000, tissue: 1000, sandwich: 4500, tumbler: 17000}
  
// Map 에 있는 value 값을 가져오고 싶을 때
print(myNote['ice cream']);
// => 3000
  
// Map 에 값을 추가하고 싶을 때
myNote['candy'] = 500;
print(myNote);
// => {ice cream: 3000, tissue: 1000, sandwich: 4500, tumbler: 17000, candy: 500}
  
// Map 에 있는 값을 수정하고 싶을 때
myNote['tissue'] = 990;
print(myNote);
// => {ice cream: 3000, tissue: 990, sandwich: 4500, tumbler: 17000, candy: 500}
  
// Map 에 있는 값을 삭제하고 싶을 때
myNote.remove('candy');
print(myNote);
// => {ice cream: 3000, tissue: 990, sandwich: 4500, tumbler: 17000}

print(myNote.keys); // (ice cream, tissue, sandwich, tumbler)
print(myNote.values); // (3000, 990, 4500, 17000)

Set

  • Set 은 중복된 값이 들어가지 않는다.
  • 중복값은 자동으로 1개로 처리
  • List 는 중복값이 들어갈 수 있다
  • Set 과 List 는 비슷한 함수들이 많다
final Set<String> names = {
    'hyun joo',
    'ellie',
    'orange',
    'ellie'
  };
  
print(names); // {hyun joo, ellie, orange} 중복 'ellie' 자동 제거
  
names.add('또롱이');
names.remove('orange');
  
print(names); // {hyun joo, ellie, 또롱이}
  
// Set 안에 어떤 요소가 있는지 없는지 확인하기
print(names.contains('ellie')); // true

enum

  • enum 으로 값을 정해두면, 그 정해진 값만 사용 및 관리하여 오차를 방지
enum Status {
  approved,
  pending,
  rejected,
}

void main() {
  Status status = Status.rejected; // 자동완성됨
  
  if (status == Status.approved) {
    print('승인');
  } else if (status == Status.pending) {
    print('대기');
  } else {
    print('거절');
  }
}

Function

positional parameter

  • 순서가 중요한 파라미터
// void - 공허
// void 자리에는 return 할 타입을 지정해주는 곳
void main() {
  addNum(10, 90, 20);
}

addNum(int a, int b, int c) {
	print(a+b+c); // 120
}

optional parameter

  • 있어도 되구 없어도 되는 파라미터 (대신 기본값을 정해줘야 함)
  • [] 대괄호로 감싸기
void main() {
  addNum(10, 90, 20);
}

addNum(int a, [int b = 0, int c = 0]) {
  print(a + b + c);
}

named parameter

  • 이름이 있는 파라미터 (순서 중요하지 않음)
void main() {
  addNum(b: 90, c: 20, a: 10); // 순서 뒤바뀌어도 상관없음. 이름으로 인식
  addNum2(z: 12, x: 9);
  addNum3(5, b: 12);
}

int addNum({required int a, required int b, required int c}) {
  print(a + b + c); // 120
}

// named parameter + optional parameter (required 삭제)
// 기본값 정해주기
int addNum2({required int x, int y = 0, required int z}) {
  print(x * y * z); // 540
}

// positional parameter + named parameter + optional parameter
int addNum3(int a, {required int b, int c = 0}) {
  int sum = a + b - c;
  print(sum);
  return sum; // 17
}

// arrow fn 화살표 함수 예시 => 만 추가
int addNum4(int a, {required int b, int c = 0}) => a + b * c;

signature

void main() {
  // Operation signature 를 사용하여, 같은 모양의 substract 를 입혀 사용
  Operation mine = subtract;
  
  int result = mine(30, 20, 1);
  
  print(result);
  
  int result2 = calculate(5, 2, 2, add);
  
  print(result2);
}

// signature
// 해당 signature 과 같은 모양의 함수들을 입힐 수 있음
typedef Operation = int Function(int a, int b, int c);

int add(int x, int y, int z) => x + y + z;
int subtract(int m, int n, int o) => m - n - o;

// 위 방식보다, 이런 방식으로 많이 사용함
int calculate(int x, int y, int z, Operation mine) => mine(x, y, z);
profile
쓸모있는 기술자

0개의 댓글