Flutter/Dart

Dart 언어 기본기

임공부중 2023. 7. 5. 18:51
반응형

출처 : 유튜브 코드팩토리, 1시간만에 끝내는 Dart 언어 기본기

Hello World, 변수 선언하기, 변수 타입, Nullable, Final vs Const, Operators, List, Map, Set, If문, Loops, Enum, 함수, Typedef

 

 

##   hello print

void main(){

  print('Hello Code Factory');

}

 

 

 

##   변수 선언 - variable

void main(){

 var name(변수명) = 'studying';(변수값)

 print(name)

 

@ 변수값 변경

name = '플러터 프로그래밍';

print(name)

@ 코드는 순서대로 실행된다.

 

var name = 'studying22';

@ 이미 있는 이름의 변수를 선언하는 것은 불가능하다.

}

 

 

 

##   변수 타입

@ 정수 integer

int number1 = 18;

 

@ 실수 double

double number2 = 2.5;

double number3 = -0.5;

 

@ 맞다/틀리다 boolean 

bool isTrue = true;

bool isFalse = false;

 

@ 글자 타입 string

String name1 = '레드벨벳';

 

@ var과 String의 차이

var이라는 데이터 타입이 존재 x , 등호 오른쪽에 있는 값의 타입을 유추함.

var 보다는 직접 명시해주는 것이 최선

 

 

@ String은 +로 붙이기 가능

@ print( '${변수명}') 으로 변수를 프린트안에 넣기 가능

@ print(' $변수명 ') 변수만 쓸 때는 괄호 안써도 가능 but 함수도 쓰고자 할때 ${name.runtimeType}할 때는 괄호 필수

 

@ var 과 dynamic의 차이

var 은 한번 선언한 데이터 타입을 변경할 수 없음.

dynamic은 변수의 데이터 타입도 변경 가능.

 

 

 

##   Nullable vs Non-nullable

@ 타입? 로 선언하면 null도 들어갈 수 있다를 명시

ex) String? name5 = '블랙핑크';

name5 = null; - 에러 안남

String name6 = '가';

name6 = null; - 에러

 

@ print(name2!) - 현재 name2는 null이 아니다 라는 표시

 

 

 

##   final vs const

@ final 변수 값을 변경할 수 없음

final String name = '가';

@ const 변수 값을 변경할 수 없음

const String name2 = '나';

 

@ final 과 const는 둘다 var 역할도 하기 때문에 생략가능

final name = '가';

const name2 = '나';

 

@ DateTime.now()는 run 실행버튼을 누르는 시간이 아닌 이 코드 줄이 실행되는 시간

@ final 과 const의 차이

final은 buildtime을 알고 있지 않아도 됨 - 작성한 코드의 값을 미리 알고 있지 않아도됨

const는 buildtime을 알고 있어야함 - 작성한 코드의 값을 미리 알고 있어야함

 

@ const DateTime now = DateTime.now()는 에러가 남. 값을 미리 알지 못하기 때문 / final은 에러 안남

 

 

 

##   Operators (연산자)

+ : 더하기

-  : 빼기

* : 곱하기

/  : 나누기

%  : 나머지

number++; : number에 1 더해서 number에 저장

number--; : number에 1 빼서 number에 저장

number +=1; number에 1 더해서 number에 저장

*=

-=

/=

 

@ null 관련 연산자

double? number = 4; : number에는 double과 null이 들어 갈 수 있다.

number = null;

number ??=3.0; : number가 null 이면 오른쪽 값으로 바꾸어라

 

@ 값 비교 연산자 - 결과는 boolean

>

<

>=

<=

== 같다

!= 같지않다

 

@ 타입 비교 연산자 - 결과는 boolean

int number1 = 1;

print(number1 is int);

print(number1 is! int)

 

@ 논리 연산자 - 결과는 boolean

&& : and

|| : or

 

 

 

 

##   List 리스트

@ 선언

List<데이터 타입> 리스트명 = []   데이터 타입과 맞지 않은 값을 넣으면 에러

ex) List<String> blackPink = ['제니', '지수'];

 

@ 인덱스 - 일부 값 가져올때, 0부터 시작, 존재하지 않는 인덱스를 가져올려고 하면은 에러남

print(blackPink[0]);

출력 결과 : 제니

 

@ 리스트의 길이

blackPink.length

 

@ 리스트 추가

blackPink.add('나');

 

@리스트 삭제

blackPink.remove('지수');

 

@인덱스 값

blackPink.indexOf('나');

 

 

 

##   Map (key/value)

@ 선언

Map<키의 타입, value의 타입> 맵명 = { : , : , :}

ex) Map<String, String> dictionary = { 'Harry Potter' : '해리포터', 'Ron Weasley' : '론 위즐리'}

 

@ Map 추가

dictionary.addAll({ 'Hermione Granger' : '헤르미온느 그레인저'});

 

@ value 가져오기 - 반대로 value로 key 가져오는 것은 안됨

dictionary['Harry Potter'] (값 변경도 가능)

 

@ Map 삭제

dictionary.remove('Harry Potter'); 해리포터의 키, value 값 둘다 지워짐

 

@ 모든 키 값 가져오기

dictionary.keys

@ 모든 value 값 가져오기

dictionary.values

 

 

 

##   Set - 리스트와의 차이 (리스트는 중복 값 가능), Set은 중복을 자동으로 처리해줌

@선언

Set<String> names = {

'가', '나','다','나'}; 출력하면 가나다만 출력됨

 

@names.add();

@names.remove();

 

 

 

##   If 문 조건문

if(조건문){조건문이 참일 때 실행할 코드} else { 조건문이 거짓일때 실행할 코드}

if(){} else if(){} else

 

##   Switch문

switch(조건){

 case 조건 결과1 :

   실행할 코드

   break;

 case 조건 결과2 :

   실행할 코드

   break;

 case 조건 결과3 :

   실행할 코드

   break;

}

 

 

##   for loop 반복문

for((초기값) int i =0; (언제까지) i <10; (루프가 실행될때마다 변화를 줄 부분) i++){

i가 9가 될때 까지 i++를 실행한다는 의미

}

ex) List<int> numbers = [1,2,3,4,5,6];

for(int number in numbers){ print(number); } numbers에 있는 값이 number라는 변수에 들어감

 

for(int i =0; i<10;i++){

if(i==5){continue;} //continue는 현재 루프를 스킵하게 한다. 그래서 5는 print되지 않음.

print(i);

}

 

 

 

 

##   while loop 반복문

int total = 0;

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

if (total == 5){break;} // break 문은 loop을 나가게 해준다.

}

 

total =0;

do{

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

 

 

 

##   enum (main 밖에서 선언)

@ 선언

enum Status{

approved,  // 승인

pending,  // 대기

rejected,  // 거절

}

void main(){

Status status = Status.pending;

if(status == Status.approaved){

print('승인입니다.');

}

}

 

 

 

 

 

##   함수 - 반복되는 코드를 재활용할 수 있도록 - 반환타입 함수명 (매개변수){코드}

ex) 세개의 숫자 (x,y,z)를 더하고 짝수인지 홀수인지 알려주는 함수

@ positional parameter - 순서가 중요한 파라미터

int addNumbers(함수이름은 임의로)(int x,int y, int z){  // x,y,z는 매개변수-parameter,argument

   int sum = x+y+z;

   if ((sum)%2==0){

   print('짝수입니다.');

}else {print('홀수입니다.');}

return sum;   // 반환값

}

void main(){

@함수 실행

positional parameter이기 때문에 x,y,z 순서대로 들어감

int result = addNumbers(1,2,3);

}

 

 

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

없어도 되는 파라미터에는 []

int addNumber(int x, [int? y, int? z]){} 없어도 되기 때문에 null일 수 있음인 ?를 해줘야함

but x + y+ z에서 에러 발생=> 숫자와 null은 더할 수 없기 때문

@ 기본값을 넣어주어야함

int addNumber(int x, [int y=20, int z=30]){}   // y와 z 값을 넣지 않았을 때 기본값이 들어감

 

 

@named parameter - 순서가 중요하지 않는 파라미터

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

}

void main(){

int result2 = addNumbers(x: 10, z:20, y:30)  // 순서 상관없이 이름을 지정해서 넣어주어야함

}

 

 

@named에 optional parameter

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

} // 이렇게 하면 함수 호출할 때 z는 안넣어도 됨

 

 

@ arrow 함수

반환타입 함수명 (매개변수)=> 반환값

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

 

 

 

 

##   Typedef - 함수를 편하게 사용할 수 있게 하는 기능

// signature

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

// 더하기

int add(int x, int y, int z) => x+y+z; 넣고자 하는 typedef와 반환값의 타입, 매개변수의 타입이 모두 같아야함

// 빼기

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(){

Operation operation = add; // add 함수를 넣음

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

operation = subtract;

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

int result3 = calculate(30,40,50,add);    // 보통 이렇게 활용함

}

반응형