Dart 언어 기본기
출처 : 유튜브 코드팩토리, 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); // 보통 이렇게 활용함
}