[Dart] Dart 언어 배우기 2

ryan·2021년 6월 17일
1

Dart/Flutter

목록 보기
8/21
post-thumbnail

링크


7. List 타입

List 선언

void main() {
  // #1
  List favouriteFood = [];
  print(favouriteFood); // []
  
  // #2: 이 방법을 사용하면 몇 가지 기능을 사용할 수 있는데, 그건 나중에...
  List favouriteFood2 = new List();
  print(favouriteFood2); // []
}
  1. List는 이전 타입과 다르게, 여러 개의 값을 저장할 수 있다.
  2. List를 선언하는 방법은 두 가지가 있다.

List에 값 넣기

void main() {
  // #1
  List favouriteFood = [];
  print(favouriteFood); // []

  // #2
  List favouriteFood2 = new List();
  print(favouriteFood2); // []
  
  favouriteFood.add('케사디야');
  favouriteFood.add('삽겹살');
  favouriteFood.add('치킨');
  
  print(favouriteFood); // [케사디야, 삽겹살, 치킨]
}
  1. List 안에 값들이 들어가는데, 값들을 구분 할 때는 ,로 구분한다.
  2. add를 사용해서 List에 값을 넣을 수 있다.

List의 index

void main() {
  // #1
  List favouriteFood = [];
  print(favouriteFood);

  // #2
  List favouriteFood2 = new List();
  print(favouriteFood2);
  
  favouriteFood.add('케사디야');
  favouriteFood.add('삼겹살');
  favouriteFood.add('치킨');
  
  print(favouriteFood); // [케사디야, 삽겹살, 치킨]
   
  print(favouriteFood[0]); // 케사디야
  print(favouriteFood[1]); // 삼겹살
  print(favouriteFood[2]); // 치킨
  
  favouriteFood[1] = '장어';
  
  print(favouriteFood); // [케사디야, 장어, 치킨]
}
  1. 컴퓨터의 숫자는 0, 1, 2, 3, 4, ... 처럼 0부터 시작한다.
  2. List[index]를 통해 List의 값에 접근이 가능하다.
  3. index를 사용해서 List의 값을 업데이트할 수 있다.

List에서 값 빼기

void main() {
  // #1
  List favouriteFood = [];
  print(favouriteFood);

  // #2
  List favouriteFood2 = new List();
  print(favouriteFood2);
  
  favouriteFood.add('케사디야');
  favouriteFood.add('삼겹살');
  favouriteFood.add('치킨');
  
  print(favouriteFood);  
  
  favouriteFood.removeAt(1); // 삼겹살 안녕
  
  print(favouriteFood); // [케사디야, 치킨]
}
  1. removeAt와 List의 index 값을 이용해서 List의 값을 제거할 수 있다.

List 안에 어떤 타입을 넣을 지 선언하기

void main() {
  List<String> favouriteFood = [];
  
  favouriteFood.add('케사디야');
  
  print(favouriteFood);
  
//   favouriteFood.add(1); // Error: int는 넣을 수 없어
}
  1. List를 선언할 때, 어떤 타입의 값이 List 안에 들어가는 지 지정해놓으면, 해당 타입만 입력할 수 있다.

List의 길이를 제한하기(자주 사용하지는 않음)

void main() {
  // Growable List
  List<String> favouriteFood = [];
  
  favouriteFood.add('케사디야');
  favouriteFood.add('케사디야1');
  favouriteFood.add('케사디야2');
  favouriteFood.add('케사디야3');
  favouriteFood.add('케사디야4');
  favouriteFood.add('케사디야');
  favouriteFood.add('케사디야');
  favouriteFood.add('케사디야');
  // ...
  
  print(favouriteFood); // [케사디야, 케사디야1, 케사디야2, 케사디야3, 케사디야4, 케사디야, 케사디야, 케사디야, ...]
}

  1. Growable List: 리스트의 사이즈가 자유롭게 늘어나거나(메모리가 허락하는 한까지) 줄어들 수 있는 List
void main() {
// 길이가 3인 List를 만들겠다는 말.
  List<String> countryList = new List(3);
  print(countryList); // [null, null, null]
  
// countryList.add('Korea'); // Error: add를 사용할 수 없어...
// countryList.removeAt(0); // Error: removeAt을 사용할 수 없어...
  
  countryList[0] = 'Korea';
  countryList[1] = 'Mexico';
  countryList[2] = 'Peru';
  
  print(countryList); // [Korea, Mexico, Peru]
}
  1. Fixed Length List: 선언할 때, 길이가 정해져서 추가적으로 길이를 늘이거나 줄일 수 없는 List
  2. 길이를 지정해 준 List에는 addremoveAt 메서드를 사용할 수 없고, List의 index를 이용해서 새로운 값을 할당해 줄 수 있다.

List에 값을 넣은 채로 선언하기

void main() {
  // #1
  List favouriteFood = ['케사디야', '삼겹살', '치킨'];

  print(favouriteFood); // [케사디야, 삼겹살, 치킨]

  // #2 : from을 사용
  List favouriteFood2 = new List.from(['케사디야', '삼겹살', '치킨']);
  
  print(favouriteFood2); // [케사디야, 삼겹살, 치킨] 
  
  print(favouriteFood2.length); // 3 
}

List의 길이를 알아내는 length

void main() {
  List thingsToLearn = [
    'Dart',
    'Flutter',
    'JavaScript',
    'React',
    'TypeScript',
    'NodeJS',
    'Python',
    'etc'
  ];
  
  print(thingsToLearn.length); // 8
}

8. Map 타입

  • Map은 key, value 짝꿍

Map 선언 방법

void main() {
  Map dictionary = {};
}

Map에 key와 value 넣기

void main() {
  Map dictionary = {
    'apple': '사과',
  };
}
  1. dictionary라는 map을 선언하고, apple이라는 key와 사과라는 value를 입력한다.

Map에 여러 개의 key와 value를 선언하기

void main() {
  Map dictionary = {
    'apple': '사과',
    'banana': '바나나',
    'watermelon': '수박',
  };
}

Map의 value에 접근하기

void main() {
  Map dictionary = {
    'apple': '사과',
    'banana': '바나나',
    'watermelon': '수박',
  };
  
  print(dictionary); // {apple: 사과, banana: 바나나, watermelon: 수박}
  print(dictionary['apple']); // 사과
  print(dictionary['watermelon']); // 수박
}
  1. MapValue에 접근하기 위해서 key를 대괄호에 넣어서 사용한다.

Map에 값 넣기

void main() {
  Map dictionary2 = {};

  print(dictionary2); // {}

  dictionary2.addAll({ 
    'apple': '사과',
    'banana': '바나나',
    'watermelon': '수박',
  });
  
  print(dictionary2); // {apple: 사과, banana: 바나나, watermelon: 수박}
}
  1. Map에 값을 넣으려면 addAll을 사용한다.

Map에 있는 값 지우기

void main() {
  Map dictionary2 = {};

  print(dictionary2);

  dictionary2.addAll({
    'apple': '사과',
    'banana': '바나나',
    'watermelon': '수박',
  });
  
  print(dictionary2); // {apple: 사과, banana: 바나나, watermelon: 수박}
  
  dictionary2.remove('watermelon');
  
  print(dictionary2); // {apple: 사과, banana: 바나나}
}
  1. Map에서 값을 지우려면 remove를 사용한다.

Map에 있는 값을 변경하기

void main() {
  Map dictionary2 = {};

  dictionary2.addAll({
    'apple': '사과',
    'banana': '바나나',
    'watermelon': '수박',
  });
  
  print(dictionary2); // {apple: 사과, banana: 바나나, watermelon: 수박}

  dictionary2['banana'] = '노란색';
  
  print(dictionary2); // {apple: 사과, banana: 노란색, watermelon: 수박}
}
  1. key로 접근해서 값을 변경해줄 수 있다.

Map을 선언하는 다른 방법

void main() {
  // List 선언 방법
  List list = new List();
  
  // #1
  Map dictionary = {};
  
  // #2
  Map dictionary2 = new Map();
  
  // #2 방법에서 처음부터 값을 넣고 선언하려면
  Map dictionary3 = new Map.from({
    'apple': '사과',
    'banana': '바나나',
  });
  
  print(dictionary3); // {apple: 사과, banana: 바나나}
}

Map의 key 또는 value만 가져오기

void main() {
  Map dictionary3 = new Map.from({
    'apple': '사과',
    'banana': '바나나',
  });
  
  print(dictionary3); // {apple: 사과, banana: 바나나}
  
  // key만 가져오기
  print(dictionary3.keys.toList()); // [apple, banana]
  
  // value만 가져오기
  print(dictionary3.values.toList()); // [사과, 바나나]
}

Map에 넣을 값의 타입을 지정해서 만들기

void main() {
  // 첫 번째는 key의 타입
  // 두 번째는 value의 타입
  Map<String, int> price = {
    'apple': 2000,
    'banana': 4000,
    'watermelon': 6000,
  };
  
  print(price); // {apple: 2000, banana: 4000, watermelon: 6000}
}

Map의 key는 절대적으로 Unique해야한다

void main() {
  Map dictionary3 = new Map.from({
    'apple': '사과',
    'banana': '바나나',
  });

  print(dictionary3); // {apple: 사과, banana: 바나나}

  dictionary3.addAll({'apple': '수박'});

  print(dictionary3); // {apple: 수박, banana: 바나나}
  
  print(dictionary3['apple']); // 수박
}
  1. List 같은 경우에는 값은 값을 넣어줘도 추가가 되지만, Map 같은 경우에는 덮어씌어진다.
  2. 만약에, 같은 key를 가진 값이 여러개라면, 우리가 어떤 keyvalue를 불러오는 지 정확하게 알 수 없다.
  3. 따라서, key 유일한 값이어야한다.

9. 변수에 대한 몇가지 약속

  • 개발자들이 협업하는데 도움이 되도록 약속한 것이 있다.
void main() {
  String name = '개발자';
  // String name = '엔지니어'; // Error: 'name'은 이미 선언됐어
  
  // name의 값을 바꾸려면
  name = '엔지니어';
  
  // #1 #2
  // int name = 1; // Error: 'name'은 이미 선언됐어
  
  // #3
  // String time timer = '타임 타이머'; // Error
  
  // camelCase
  String timeTimer = '타임 타이머';
  
  // #4
  String _time = '시간'; 
  
  // #5 이렇게 혼동하면서 사용하면 협업할 때, 복잡해집니다
  String Company = '구글';
}
  1. 변수의 타입이 같던 다르던 같은 이름의 변수는 선언 할 수 없다.
  2. 변수 선언은 소문자로 또는 _로 시작한다.
  3. 변수는 띄어쓰기 할 수 없다.
  4. _를 사용해서 private 변수를 만들 수 있다.
  5. 대문자를 사용하는 경우는 class를 선언할 때다.

10. Final, Const

  • FinalConst는 기본적으로 똑같이 변수를 한 번 선언하면, 변수의 값을 변경하지 못하게 하는 키워드의 의미를 갖고 있다.

final

void main() {
  final String name = '개발자';
  
  name = '엔지니어'; // Error: final 변수 'name'에 할당할 수 없어
}
  1. final은 런타임(코드가 다 컴파일이 되고, 코드가 전부 컴퓨터 언어로 변경이 된 다음)에 값이 지정이 되어있어도 상관이 없다. 실행이 되는 순간에 딱 한번만 선언이 되면 사용이 가능하다.

const

void main() {
  const String name = '개발자';
  
  name = '엔지니어'; // Error: const 변수 'name'에 할당할 수 없어
}
  1. const는 컴파일 하는 시간에 값이 지정이 되어야한다.
  • 컴파일하는 과정: 사람이 읽기 편한 코드가 컴퓨터가 읽기 편한 코드(01010101101010...)로 변경이 되는 과정

  • 일반적으로 final이 많이 쓰이고, const는 Flutter에서 쓰이긴 하지만, 필수는 아니다.

fianl 사용 예시

void main() {
  // 코드가 실행하는 시간을 저장하는 함수
  final DateTime now = DateTime.now();
  
  print(now);
  
  // 1초 기다렸다가 실행되는 함수
  Future.delayed(
    Duration(milliseconds: 1000),
    () {
      final DateTime now2 = DateTime.now();
      
      print(now2);
    }
  );
}

// 1초가 차이 나는 이유, 컴퓨터가 이해하는 언어로 전환이 끝나고 나서, 그 뒤에 실행이 되는 순간에 `DateTime.now` 값들이 지정이 되고 있다. 

// final은 런타임의 값이 지정이 되어도 상관없다.

const 사용 예시

void main() {
  // 코드가 실행하는 시간을 저장하는 함수
  const DateTime now = DateTime.now(); // Error
  
  print(now);
  
  // 1초 기다렸다가 실행되는 함수
  Future.delayed(
    Duration(milliseconds: 1000),
    () {
      const DateTime now2 = DateTime.now(); // Error
      
      print(now2);
    }
  );
}

// const는 컴파일 하는 시점에 값이 지정되어야하는데, 값이 지정되어있지않아서, `DateTime.now()`라는 값을 알 수 없다. 그래서 Error 발생.

11. Operators

변수 선언 및 변경하는 Operators

void main() {
  int number = 2;

  print(number + 2);
  print(number - 2);
  print(number * 2);
  print(number / 2);

  // 나머지 %
  print(number % 2); // 0
  print(number % 3); // 2

  // ++
  number++;
  print(number); // 3

  // --
  number--;
  print(number); // 2

  //=====================
  int number2 = 10;
  print(number2);
  number2 = 8;
  print(number2);

  // ??=
  // number2가 null이면 4고, 아니면 아무것도 하지마라
  number2 ??= 4;
  print(number2); // 8

  int number3;
  print(number3); // null
  number3 ??= 4;
  print(number3); // 4

  int number4 = 2;
  // double number4 = 2;
  number4 += 1; // number4 = number4 + 1
  print(number4); // 3

  number4 -= 1; // number4 = number4 - 1
  print(number4); // 2
  
  number4 *= 2;
  print(number4);
    
  // 나누기(/)는 Dart가 int가 아닌 double로 판단해서 error가 발생한다. number4를 double로 바꿔주면 에러 해결.
  number4 /= 2; // Error
  print(number4);
}

비교 Operators

  int number1 = 1;
  int number2 = 2;
  
  print(number1 < number2); // true
  print(number1 > number2); // false
  print(number1 <= number2); // true
  print(number1 >= number2); // false
  // 동등 비교
  print(number1 == number2); // false
  // 같지 않은지 비교
  print(number1 != number2); // true

Type 비교(is, is!)

void main() {
  int number = 1;
  
  // is
  print(number is int); // true
  print(number is String); // false
  print(number is bool); // false
  
  // is!
  print(number is! int); // false
  print(number is! String); // true
  print(number is! bool); // true
}

논리 operators(&&, ||)

void main() {
  // && operator: 모두 다 조건을 충족해야 true
  // 12가 10보다 크고 1이 0보다 크다
  bool result = 12 > 10 && 1 > 0;

  print(result); // true
  
  result = 12 > 10 && 1 < 0;
  print(result); // false
  
  // || operator: 하나만 충족하면 true
  result = 12 > 10 || 1 < 0;
  print(result); // true
  
  result = 12 < 10 || 1 > 0;
  print(result); // true
}
profile
👨🏻‍💻☕️ 🎹🎵 🐰🎶 🛫📷

0개의 댓글