기본기

참조 : https://dartpad.dev/?

변수

변수의 선언

var name = '';

이렇게 선언한다.

변수는 재할당 가능하고

순서대로 실행된다.

정수

int number1 = 10;

이런 식으로 정수를 선언할 수 있음.

int number1 = 2;
int number2 = 6;

print(number1 + number2);
print(number1 - number2);
print(number1 / number2);
print(number1 * number2);

실수

double

그냥 쓰면 됨. (기본적인 프로그래밍 언어랑 비슷함.)

Boolean

String

String name = '레벨';
String name2 = '딴거';


var name3 = '우후';
var number =20;

print(name3.runtimeType); // 이런 식으로 쓰면 알아서 String으로 지정해준 것을 알 수 있다.

형을 정해주는 것이 좋다. 나중가면

Map<String, Map<int, List<double>>> testType

이런 식으로 확인

백틱 문자 사용 같음

dynamic 타입

dynamic name = '코드팩토리';

dynamic number = 1;

var name2 = '우하하하';

print(name.runtimeType);
print(name2.runtimeType);

name2 = 5 // 에러!

var 타입은 문자열 타입 에서 정수 타입으로 재할당 불가

dynamic은 형을 뛰어넘어 재할당 가능

nullable

  // nullable - null 이 될 수 있다.
  // non-nullable - null 이 될 수 없다.
  // null - 아무런 값도 있지 않다.

  String name = '코드팩토리';

  print(name);

  String? name2 = '블랙핑크';

  name2 = null;

  print(name2);

? 를 넣으면 널이 들어갈 수 있음

name! 현재 이 값은 null 이 아니다라는 뜻임.

final

 final String name = '코드팩토리';

 print(name);

 name = '블랙핑크'; // 바꿀 수 없음!

 const String name2 = '요요';

 print(name2);

 name2 = '코드팩토리';// 이렇게 바꿀 수 없음.

final, const에서는 값을 재할당할 수 없다. type을 선언 안해줘도 된다.(왜냐면 한번 할당하면 안바뀌니까 그 때 타입도 저장 되는 것임)

DateTime now = DateTime.now();

print(now) //현재 시간이 찍히게 됨.

여기서 now는 코드가 실행되는 순간임 그러면 버튼을 누르는 순간과는 약간 달라질 수 있음.

final 을 붙이면 에러가 안남 const 는 에러가 남.

build time 에 대한 이해가 필요함.

Run 할 때, Build라는 과정이 필요함

작성하는 순간의 코드의 값을 알고 있어야 함. 그러므로 const는 사용하지 못한다.

const는 빌드타임의 값도 알고 있어야 한다. final은 빌드타임과는 상관이 없다.

연산자

+-/* 
%
++
--
+=

다 알고 있는 내용

?? 의 사용

double? number = 4.0;

number = 2.0;

print(number);

number = null;

number ??= 3.0; // number 가 null 이면 오른쪽 값으로 바꿔라.

비교연산자

type 연산자

 number1 is int // int면 true
 number1 is String // String 이면 true

 number1 !is int // 반대로 나옴

논리연산자.

걍 똑같음

List

List<String> blackPink = ['1', '2', '3'];
List<int> numbers = [1,2,3,4,5,6];


// index 순서, 0부터 시작
print(blackPink[0]);

print(blackPink.length); // 실제 길이가 나옴. 3

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

blackPink.remove('코드팩토리'); // 원하는 걸 지울 수 있음.

print(blackPink.indexOf('1')); // 몇번째인지 알려줌

Map

// Map
// Key/ Value

Map <String, String> dictionary = {
  'HarryPorter' : '해리포터',
  'Ron Weasley' : '론 위즐리',
  'Hermione Gra`nger' : '헤르미온느',
}`

print(dictionary);

Map<String, bool> isHarryPotter = {
  'HarryPorter' : true;
  'Ron Weasley' : true;
  'IronMan' : false;
}

print(isHarryPotter);

isHarryPotter.addAll({
  'SpiderMan' : false,
})

print(isHarryPotter['ironman']);

isHarryPotter['Hulk'] = false;

isHarryPotter['Spiderman'] = true;

isHarryPotter.remove('IronMan');

print(isHarryPotter.keys)
print(isHarryPotter.values)

아무튼 어떻게 넣을 수 있고, 조작할 수 있고를 설명함.

Set

Set은 Map 이랑 비슷함

그러나 중복이 안됨.

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문

넘어감

Switch 문

넘어감

for, while, 등등

넘어감

enum

enum Status{
  approved, // 승인
  pending, // 대기
  rejected, // 거절
}

void main(){
  Status status = Status.pending;

  if(status == Status.approved){
    print('승인입니다.');
  }
  else if(status == Status.pending){
    print('거절합니다.');
  }
  else {
    print('거절합니다.');
  }
}

함수

자 이 문서 안에 가장 어려운 개념이다.

optional parameter - 있어도 되고 없어도 되는 파라미터

addNumbers(int x, [int y = 20, int z = 30]){
  int sum = x + y + z;

  if(sum % 2 == 0 ){
    print('짝수입니다.');
  } else {
    print('홀수입니다.');
  }
}

위의 y, z는 있어도 되고 없어도 된다. optional parameter 는 기본 값을 넣어줘야만한다.

addNumbers(10, 10, 10) 하면 받고 addNumbers(10) 이렇게하면 20, 30 으로 입력 됨

named parameter - 이름이 있는 파라미터 (순서가 중요하지 않다.)

addNumbers({
  required int x, 
  required int y, 
  required int z
}){
  int sum = x + y + z;

  if(sum % 2 == 0 ){
    print('짝수입니다.');
  } else {
    print('홀수입니다.');
  }
}

이러면 addNumbers(y: 20, x:10, z: 30);

이런 식으로 사용할 수 있음!

addNumbers({
  required int x, 
  required int y, 
  int z = 30,
}){
  int sum = x + y + z;

  if(sum % 2 == 0 ){
    print('짝수입니다.');
  } else {
    print('홀수입니다.');
  }
}

위와 같이 하면 z는 넣어도 되고 안넣어도 되는 optional parameter 가 된다.

void

반환하는 타입을 넣어주는 곳임. 반환해주고 싶은 타입이 int면 함수 앞에 int를 넣어주면 됨.

parameter 조합

addNumbers(
  int x, 
  {
    required int y, 
    int z = 30,
}){

이런식으로 쓰면 position parameter 쓰고,

그다음, named parameter 그리고 optional parameter임.

arrow 함수

js와 동일

typedef

typedef Operation = int Function(int x, int y, int z);

// 더하기
int add(int x, int y, int z) => x+y+z;

// 빼기
int subtract(int x, int y, int z) => x-y-z;

void main() {
  Operation operation = add;

  int result = operation(10, 20, 30);

  print(result);

  operation = subtract;

  int result2 = operation(10, 20, 30);

  print (result2);
}

위와 같이 변수의 조합을 가지고 해당 함수를 넣어줄 수 있음.

typedef Operation = int Function(int x, int y, int z);

// 더하기
int add(int x, int y, int z) => x+y+z;

// 빼기
int subtract(int x, int y, int z) => x-y-z;

// 계산
int calculate(int x, int y, int z, Operation operation){
  return operation(x, y, z);
}

void main() {
  int result3 = calculate(30, 40, 50, add);
  print(result3);// add가 실행되어 보여짐
}