Dart #1 기본기

최민경·2023년 1월 16일

Flutter

목록 보기
1/5
post-thumbnail

정수 integer

void main() {
 int number1 = 10;
 int number2 = -10;
  
 print(number1 + number2);
 print(number1 - number2);  
 print(number1 / number2);
 print(number2 * number1);
}
0
20
-1
-100

실수 double

void main() {
  // 실수
  // double

  double number1 = 2.5;
  double number2 = 0.5;

  print(number1 + number2);
  print(number1 - number2);
  print(number1 / number2);
  print(number1 * number2);
}
3
2
5
1.25

boolean

true / false 2가지 값만 있음

void main() {
  // 참/ 거짓
  // Boolean

  bool isTrue = true;
  bool isFalse = false;
  
  print(isTrue);
  print(isFalse);
 
}
true
false

글자 String

String 첫 글자는 무조건 대문자로 선언해줘야 함
String 값도 덧셈 가능함, 뺄셈, 나누기, 곱하기는 안됨.
띄어쓰기는 ' '(따옴표 안에 띄어쓰기)

void main() {
  // 글자
  // Stirng
  
  String name = '레드벨벳';
  String name2 = '코드팩토리';
  
  print(name + ' '+ name2);
 
}
레드벨벳 코드팩토리

'${변수}' 변수 자체를 삽입하기

void main() {
  // 글자
  // Stirng
  
  String name = '레드벨벳';
  String name2 = '코드팩토리';
  
  print(name + ' '+ name2);
  
  print('${name} ${name2}') ; //띄어쓰기 바로 가능
  
  print('$name $name2'); // 변수 자체 하나만 쓰는 경우 {} 생략가능, 단, 함수 사용 불가
  
}
레드벨벳 코드팩토리
레드벨벳 코드팩토리
레드벨벳 코드팩토리

'$name'에 괄호 없이 바로 함수를 사용하는 경우 ↓

var vs. String 차이는?

  • var은 오른쪽에서 선언해 준 변수의 타입을 자동으로 식별함.
  • 따라서 name3는 String으로 자동식별하고, number은 integer로 자동식별함.
  • 다만, 코드가 길어질 수록 var로 선언하면 코드 가독성이 저하됨.
  • 직접 변수의 타입을 선언해주는 것이 좋음.

dynamic

dynamic은 var과 비슷하듯이 오른쪽 변수의 타입을 자동식별함

코드

dynamic name = '코드팩토리';
print(name.runtimeType);

var name2 = '블랙핑크';
print(name2.runtimeType);

결과

String
String

차이점은,
dynamic은 오른쪽 값을 변경할 때 변수타입 변경이 가능함. (eg, String -> int)
var은 처음 선언해줬던 변수타입 그대로 고정되어 같은 타입에 한해 값 변경이 가능함. (eg, String -> String)

변수타입?

변수타입(String, int, boolean 등등) 뒤에 물음표를 붙이면 null까지 선언 가능.

void main() {
  // nullable - null이 될 수 있다.
  // non-nullable - null이 될 수 없다.
  // null - 아무런 값도 있지 않다.
  
  String name = '코드팩토리';
  print(name); // 코드팩토리
  
  name = null; // 에러남
  
  
  String? name2 = '블랙핑크';
  
  name2 = null;
  
  print(name2); // null
  
}

변수 뒤에 !를 붙이면 '현재 이 값은 null이 될 수 없다'라는 것을 뜻함

void main() {
  // nullable - null이 될 수 있다.
  // non-nullable - null이 될 수 없다.
  // null - 아무런 값도 있지 않다.
  
  String? name2 = '블랙핑크';

  print(name2!); // 변수 뒤에 !를 붙이면 '현재 이 값은 null이 될 수 없다'라는 것을 뜻함
  
}

final, const

공통점

  • 변수 선언할 때 맨 앞에 final, const를 삽입하면 됨.
  • final, const로 변수를 선언하면 같은 변수타입이라도 할지어도 값을 변경할 수 없음.
void main() {
  final String name = '코드팩토리';
  print(name);
  
  name = '블랙핑크'; // 에러 뜸
  
}
void main() {
  const String name2 = '블랙핑크';
  print(name2);
  
  name2 ='레드벨벳'; // 에러 뜸
}
  • final, const로 변수를 선언할 때 자료형(변수타입)을 생략할 수 있음.

코드

void main() {
  final name = '코드팩토리';
  print(name);
  
  const name2 = '블랙핑크';
  print(name2);
  
}

결과

코드팩토리
블랙핑크

차이점

  • final 변수선언에는 빌드타임(자연어->기계어)을 몰라도 됨
  • const 변수선언에는 절대적으로 빌드타임이 필요함
  • DateTime.now() 함수는 코드가 실행될 때 시간을 돌려줌
  • 따라서 final 함수는 DateTime.now() 함수 사용이 가능, const는 불가함.
void main() {
  final DateTime now = DateTime.now();
  print(now);
  // final 변수선언에는 빌드타임을 몰라도 됨
  // DateTime.now() 함수는 코드가 실행될 때 시간을 돌려줌
  
  const DateTime now2 = DateTime.now();
  // const 변수선언에는 빌드타임이 절대적으로 필요함
  // 따라서 위처럼 작성하면 에러가 남
  
}

operator (재저장) 기능

number ++, number --

1씩 더하기/빼기 한 후, 기존 변수에 재저장

void main() {
  int number = 2;
  
  print(number + 2);
  print(number - 2);
  print(number / 2);
  print(number * 2);

  print('--------------------------');
  print(number % 2);
  print(number % 3);
  // % 는 나머지를 뜻함
  
  print(number);
  // number값은 여전히 2
  print('--------------------------');
  
  number ++;
  print(number);
  // ++는 1을 더하고 number에 저장해 줌
  // 2+1=3
  
  number --;
  print(number);
  // --는 1을 빼고 number에 저장해 줌
  // 3-1=2

}

number +=, number -=, number *=, number /=

원하는 값 만큼 더하기/빼기/곱하기/나누기 한 후 기존 변수에 재저장

코드:

void main() {
  double number = 4.0;
  print(number);
  
  number += 1;
  print(number);
  
  number -= 1;
  print(number);
  
  number *=2;
  print(number);
  
  number /=2;
  print(number);

}

결과:

4
5
4
8
4

null 조건 operator

??= 은 변수가 null이면 오른쪽 값으로 저장되는 기능임.

코드:

void main() {
  // null 값이 허용되는 변순 선언
  double? number = 4.0;
  print(number);
  
  number = 2.0;
  print(number);
  
  number = null;
  print(number);
  
  number ??= 3.0;
  print(number);
  // ??= 은 변수가 null 이면 오른쪽 값으로 저장되는 기능임.
}

결과:

4
2
null
3

null 값이 아니면 원래 값을 돌려줌.

코드:

void main() {
  // null 값이 허용되는 변순 선언
  double? number = 4.0;
  print(number);
  
  number = 2.0;
  print(number);
  
  
  number ??= 3.0;
  print(number);
  // ??= 은 변수가 null 이면 오른쪽 값으로 저장되는 기능임.
}

결과:

4
2
2

값 비교 operator

타입 비교 operator

논리 operator (and, or)

and는 모두 다 true여야 true
or은 한 개라도 true이면 true

리스트 List

  • 형식: List<자료형> 변수명 = [a, b, c];
  • 중복값 허용.
  • 자료형 혼합 불가.
    (eg, List blackPink = ['제니', '지수', '로제', '리사', 4]; -->에러 뜸
void main() {
 // List 리스트
  List<String> blackPink = ['제니', '지수', '로제', '리사'];
  List<int> numbers = [1,2,3,4,5,6];
  
  print(blackPink);
  print(numbers);
}

index 순서 vs length 길이

  • index는 0부터 시작
  • length는 1부터 시작

.add() .remove() .indexOf()

값 추가, 값 제거, 값의 순서 가져오기

코드:

void main() {
// List 리스트
List<String> blackPink = ['제니', '지수', '로제', '리사'];

blackPink.add('코드팩토리');
print(blackPink);

blackPink.remove('코드팩토리');
print(blackPink);

print(blackPink.indexOf('로제'));  
}

결과:

[제니, 지수, 로제, 리사, 코드팩토리]
[제니, 지수, 로제, 리사]
2

Map

  • Key(왼쪽)와 Value(오른쪽) 값을 지정해줘야 함.
  • dictionary / JS객체와 비슷함.
  • 형식:
 Map<Key타입, Value타입> 변수명 = { Key1 : Value1, Key2 : Value2 };

예시:

   void main() {
    // Map<Key타입, Value타입> 변수명 = { Key1 : Value1, Key2 : Value2 };

    Map<String, String> dictionary = {
      'Harry Potter': '해리포터',
      'Ron Weasley'  : '론 위즐리',
      'Hermione Granger': '헤르미온느 그레인저'
    };

    print(dictionary);
  }
    {Harry Potter: 해리포터, Ron Weasley: 론 위즐리, Hermione Granger: 헤르미온느 그레인저}

boolean값도 지정 가능

예시:

  void main() {
    Map<String, bool> isHarryPotter = {
        'Harry Potter' : true,
        'Ron Weasley' : true,
        'Ironman': false
      };
      print(isHarryPotter);
  }
	{Harry Potter: true, Ron Weasley: true, Ironman: false}

값 추가/변경 기능

예시:

      void main() {

       // 값 추가하기 방법 1
      isHarryPotter.addAll({
      'Spiderman' : false    });
      print(isHarryPotter);

      // 값 추가하기 방법 2
      isHarryPotter['Hulk'] = false;
      print(isHarryPotter);


      // index 값 확인하기
      print(isHarryPotter['Ironman']);

      // 값 변경
      isHarryPotter['Ironman'] = true;
      print(isHarryPotter);
    }
    {Harry Potter: true, Ron Weasley: true, Ironman: false}
    {Harry Potter: true, Ron Weasley: true, Ironman: false, Spiderman: false}
    {Harry Potter: true, Ron Weasley: true, Ironman: false, Spiderman: false, Hulk: false}
    false
    {Harry Potter: true, Ron Weasley: true, Ironman: true, Spiderman: false, Hulk: false}

값 삭제 기능
예시:

void main() {

  Map<String, bool> isHarryPotter = {
    'Harry Potter' : true,
    'Ron Weasley' : true,
    'Ironman': false
  };
  print(isHarryPotter);

  isHarryPotter.remove('Harry Potter');
  print(isHarryPotter);
}
	{Ron Weasley: true, Ironman: true}

key/value 값만 가져오기
예시:

void main() {

  Map<String, bool> isHarryPotter = {
    'Harry Potter' : true,
    'Ron Weasley' : true,
    'Ironman': false
  };

  // key값만 가져오기
  print(isHarryPotter.keys);

  // value값만 가져오기
  print(isHarryPotter.values);
}
  (Harry Potter, Ron Weasley, Ironman)
  (true, true, false)

Set

  • 중복값 불가(알아서 처리해 줌)
  • 형식:
  Set<자료형> 변수명 = {a, b, c};

값 추가/제거/확인 함수
예시:

void main() {

  // Set
  final Set<String> names = {
    'Code Factory',
    'Flutter',
    'Black Pink'
  };

  print(names);

  // 값 추가 함수
  names.add('Jenny');
  print(names);

  // 값 제거 함수
  names.remove('Jenny');
  print(names);

  // 값이 포함되어 있는지 확인
  print(names.contains('Flutter'));
}

if문

  • 형식:
      if(조건){
              조건이 true일 때 결과;
              }else{
              조건이 false일 때 결과;
              }
  
      // 다중 조건일 때:  
      if(조건1){
              조건1이 true일 때 결과;
              } else if(조건2){
              조건2이 true일 때 결과;
              }else{조건2가 false일 때 결과;
              }
  
  

switch문(조건문)

  • switch는 조건당 break를 걸어줘야 다음 조건으로 안넘어감
  • 마지막의 default는 if문의 else와 같음.
void main() {
  
  // switch 문
  
  int number = 3;
  
  switch(number % 3){
    case 0:
      print('나머지가 0입니다.');
      break; //switch는 조건당 break를 걸어줘야 다음 조건으로 안넘어감
     
    case 1:
      print('나머지가 1입니다.');
      break;
    
    default: // if문의 else와 같음
      print('나머지가 2입니다.');
      break;
  }
}

for loop

1_기본 사용법

2_length와 index 개넘을 활용해서 총합을 구하는 법

void main() {
  
  // for loop
  int total = 0;
  
  List<int> numbers = [1,2,3,4,5,6];
  
  // length는 개수(1부터 시작), index는 순서(0부터 시작)
  // numbers.length = 6
  // 따라서 i = 0~5
  // numbers[i]는 numbers 1번째, 2번째...6번째 인덱스를 뜻함
  
    for(int i=0; i < numbers.length; i++){
    total += numbers[i];
  }
  
  print(total);
}
21

3_for in loop과 상위 방법 비교(결과값 같음)

void main() {
  
  // for loop
  int total = 0;
  
  List<int> numbers = [1,2,3,4,5,6];
  
  for(int i=0; i < numbers.length; i++){
    total += numbers[i];
  }
  
  print(total);
  
  total = 0;
  
  // in 뒤에 List의 인덱스가 차례로 옴                                
  for(int number in numbers){
    total += number;
  }
  print(total);
  
}
21
21                                 

while loop

  • while 조건은 무조건 맞출 수 있는 조건으로 해야 함. 안그럼 평생 실행돼서 컴퓨터가 다운될 수 있음.
  • 조건문 다음 결과문이 옴.
    void main() {

      // while loop

      int total = 0;

      // while(total<-1)로 하면 total=0은 -1보다 작을 수 없기 때문에 컴퓨터가 계속 실행함.   

      while(total < 10){
        total += 1;
      }

      print(total);
    }

do while loop

  • 잘 안씀.
  • 결과문 다음 조건문이 옴.
    void main() {

      // while loop

      int total = 0;


      // 조건문 -> 결과문
      while(total < 10){
        total += 1;
      }

      print(total);

      total = 0;

      // 결과문 -> 조건문
      do{
        total += 1;
      } while(total < 10);

      print(total);
    }

반복문(while, for)+조건문(if)

1. break

  • break는 나머지 loop까지 모두 skip하고 빠져나옴.
    void main() {
      // while loop
      int total = 0;

      while (total < 10) {
        total += 1;

        if (total == 5) {
          break; // total이 5이면 조건을 끝냄
        }
      }
      print(total);

      //for loop
      total = 0;
      for (int i = 0; i < 10; i++) {
        total += 1;

        if (total == 5) {
          break;
        }
      }
      print(total);
    }

2. continue

  • continue는 조건에 맞는 현재 실행되는 loop만 skip함.
    void main() {
      // while loop

      for (int i = 0; i < 10; i++) {
       if(i ==5){
         continue; // 현재 loop만 skip하기; break는 나머지 loop까지 모두 빠져나옴
       }
      print(i);
    }
    }

enum vs Stirng

  • enum으로 인덱스를 미리 선언해주면 값이 뭐가 있는지 확인하기 좋음
  • 오타 방지 가능

함수 및 파라미터

1. positional parameter, optional parameter

2. named parameter (required)

3. void

  • return 값이 없으면 void를 함수명 앞에 적음
  • return 값이 있으면 반환타입을 함수명 앞에 적음

4. 파라미터 조합

  • positional parameter + named parameter 조합할 시, positional parameter은 꼭 순서대로 값을 정해줘야 함. 단, 키워드는 필요없음

arrow funtion 화살표 함수

  • => 뒤에 오는 값이 바로 return 되는 값임으로, return을 따로 지정안해도 됨.
  • 형식:
	반환타입/void 함수명(파라미터1, 파라미터2...) => 함수식;

typedef

  • 함수와 비슷하지만, 함수 body가 없다.
  • 같은 함수 형태(반환타입+파라미터)이면, 동 typedef로 선언할 수 있음.


0개의 댓글