728x90
반응형
SMALL
주석
// 한 줄 주석
/**
* 여러 줄 주석
**/
/// 문서주석 : 메서드나 클래스 정의 위에 작석하면 dartdoc 과 같은 문서 생성 도구를 통해 문서를 자동으로 생성해줍니다.
변수
dart는 다음과 같은 기본 변수 타입을 제공.
- int : 정수
- double : 실수(소숫점)
- String : 문자열
- bool : 참 또는 거짓
변수명 앞에 타입을 설정하고, 변수명 뒤에 '=' 기로호 값을 지정.
ex)
String name = '제니';
int age = 23;
double height = 176.5
bool isMale = false;
※ int와 double는 num에 포함
※ int를 double 타입에 대입 할 수 없음
※ 타입을 직접 명시하지 않고 var로 대체 할 수 있음
flnal과 const
final이나 const 키워드를 변수 선언 시 제일 앞에 두면 값이 수정되지 않는 상수로 사용 할 수 있음.
산술 연산자
+ : 더학
- : 빼기
* : 곱하기
/ : 나누기(double 타입으로 반환)
~/ : 몫(int 타입으로 반환)
% : 나머지(int 타입으로 반환)
※ assert() 함수는 계산 결괏가 참인지 검사
증감연산자
증감연산자는 값을 1씩 증가하거나 감소 시키는 연산자
- 후위연산자 : [식]++, [식]--
- 전위연산자 : ++[식], --[식]
증가나 감소를 계산식이 끝난 후에 계산을 할지 아니면 계산식 전에 할지가 다름.
비교 연산자
== : 같다
!= : 다르다
> : 더 크다
< : 더 작다
>= : 크거나 같다
<= : 적거나 같다
논리 연산자
&& : 그리고
|| : 또는
== : 같다
! : 부정
!= : 다르다
타입 검사
is : 같은 타입이면 true
is! : 다른 타입이면 true
ex)
int a = 10;
if(a is String){
print("문자열이 아님");
}
if(a is int){
print("정수형");
}
형변환
형변환에는 as 키워드를 사용
다른 타입끼리는 변환이 안되고 더 상위 개념으로 변환 할 수 있음.
ex)
int a = 10;
double b = a; //에러
int a = 10;
num c = a; // as num 생략 가능
함수
int f(int x){
return x+10;
}
함수명은 f
매개변수는 int 타입의 x
반호한값은 int 타입의 x+10
f함수는 int 타입의 매개변수 x를 받고, x+10을 값을 int 타입으로 반환하는 함수
반환값이 없을 경우에는 void
ex)
void f(int x){
print(x);
}
변수 앞에 $ 기호를 붙여 문자열 내에 변수를 삽입 할 수 있다.
ex)
String _name = "제니";
int age = 23;
print("$_name 가 이름 입니다.");
print("${_name_length} 가 이름의 글자 수 입니다.");
print("${age+10} 은 10년 후의 내 나이 입니다.");
익명함수
이름이 없는 함수
ex)
(number){
return number % 2 == 0;
}
람다식
=> 왼쪽에는 인수명을 작성하고, 오른쪽에는 동작할 코드 또는 반환값을 작성
ex)
(number) => number % 2 == 0;
선택 매개변수
함수 정의에서 {}로 감싼 매개변수는 선택적으로 사용할 수 있음.
ex)
void something(String name, {int age}){}
void main(){
something('제니', age:23);
something('제니');
something(age:10); // error
something(); // error
}
분기와 반복
if, else if, else
ex)
String a = '제니';
if(a == '지수'){
print('지수');
}else if( a == '로제'){
print('로제');
}else{
print('제니');
}
삼항연산자
[조건] ? [참일 때] : [거짓일 때]
ex)
var todo = isRainy ? '빨래를 하지 않는다' : '빨래를 한다';
switch case
void f(String name){
switch(name){
case 'a':
print('a');
break;
case 'b':
print('b');
break;
case 'c':
print('c');
break;
}
}
f('a');
=== 결과 ===
a
for
for(var i=0; i<3; i++){
print(i);
}
=== 결과 ===
0
1
2
Class
변수와 함수로 이루어진 객체
- 인스턴스화
var Person person = new Person();
var Person person = Person(); // new 연산자 생략 가능
접근 지정자
변수명 앞에 '_' 기호를 붙이지 않으면 외부에서 접근이 가능하고
변수명 앞에 '_' 기호를 붙이면 외부에서 접근이 불가능 하다.
ex)
class Person{
String name = 'jenni';
int _age = 23;
}
class Company{
var Person person = new Person();
print(person.name);
print(person._age); // error
}
Getter & Setter
프라이빗 변수에 접근을 하려면 게터와 세터 메서드가 필요하다
각각 읽기와 쓰기 기능
변수 앞에 '_' 기호가 없으면 어디서든 접근이 가능한 퍼블릭 변수이므로 게터와 세터 메서드를 작성할 필요가 없다.
변수 앞에 '_' 기호가 있으면 프라이빗 변수이므로 클래스 외부에서 접근하려면 게터와 세터 메서드를 작성해야 한다.
ex)
class Person{
String name;
int _age;
int get age => _age
set _age(int age) => _age = age;
}
var Person person = new Person();
print(person.age);
프로퍼티는 게터로 가지고 오고 세터로 설정한다.
상속
상속을 주는 쪽이 슈퍼클래스(또는 부모 클래스).
받는 쪽이 서브 클래스(또는 자식 클래스).
상속은 extends 키워드 사용
부모 클래스의 함수를 물려 받아 재정의하고 싶으면 @Override 어노테이션을 사용
super 키워드를 사용하면 슈퍼클래스(또는 부모 클래스)에 접근 가능
나 자신을 참조 할 때는 this 키워드를 사용하지만 일반적으로는 생략
추상 클래스
추상 클래스는 추상 메서드를 포함하는 클래스
추상 메서드는 선언만하고 정의를 하지 않은 메서드
추상 클래스는 그대로 인스턴화를 할 수 없으며, implements 하여 기능을 완성하는 상속 재료로 사용
대상 클래스에는 implements 키워드를, 메서드에는 @Override 키워드를 사용
여러 개의 추상 클래스를 사용 할 수 있으며, 추상 클래스의 메서드를 모두 재정의해야 한다.
믹스인
with 키워드를 사용하면 상속하지 않고 다른 클래스의 기능을 가져오거나 오버라이드 할 수 있다.
ex)
class Goblin implements Monster{
@Override
void attack(){
print("고블린 어택");
}
}
class DarkGoblin extends Goblin with Hero{
}
위의 DarkGoblin은 Monster 클래스, Goblin 클래스, Hero 클래스의 기능을 모두 가지고 있다.
컬렉션
List : 같은 타입의 자료를 여러 개 담을 수 있고, 특정 인덱스로 접근 할 수 있다. ['','',''] 사용
Map : 키와 값의 쌍으로 저장 할 수 있고, 키를 통해 값을 얻을 수 있다. {key:value}
Set : 종복이 허용되지 않고, 찾는 값이 있는지 없는지 판단하고자 할 때 사용. {'','',''} 사용
List
List는 순서가 있는 자료를 담는 컬렉션
다트는 배열을 제공하지 않음.
ex)
List<String> items = ['짜장','라면','볶음밥'];
var items = ['짜장','라면','볶음밥'];
<String>은 리스트에 담길 데이터 타입을 지정한 것
컬렉션도 타입 추론을 사용할 수 있어 일반적으로 var로 선언
사용 방법은 일반적인 다른 언어의 배열과 흡사
◉ 모든 타입을 대변하는 dymic 이라는 특수한 타입이 있다.
여러 타입을 한 리스트에 넣거나 일반 변수를 성언 할 때도 사용 할 수 있다.
스프레드 연산자(...)
... 연산자는 컬렉션을 펼쳐주는 연산자로 스프레드 연산자라고 한다.
다른 컬렉션 안에 컬렉션을 삽입 할 때 사용.
ex)
var items = ['짜장','라면', '볶음밥'];
var items2 = ['떡볶이', ...itmes, '순대'];
final items = [1,2,2,3,3,4,5];
final myNumbers = {...items, 6,7}; // Set을 사용하면 자동으로 중복 제거 효과를 볼 수 있다.
print(myNumbers); // 1,2,3,4,5,6,7
Map
순서가 없고 탐색이 빠른 자료구조 컬렉션
키와 값의 쌍으로 이루어져 있다.
키를 이용하여 값을 빠르게 얻을 수 있다.
만약에 요청한 키에 해당하는 값이 없으면 null을 반환한다.
Set
집합을 표한하는 자료구조 컬렉션
add(),remove() 메서드로 집합에 추가하거나 삭제
contains() 메서드는 찾고자하는 자료가 집에 있는지 없는지 불리언 타입으로 반환하기 때문에 집합에 요소가 있는지 검사할 때 사용
리스트와는 다르게 중복을 허용하지 않음.
함수형 프로그래밍
일급 객체
다크에서는 함수를 값으로 취급할 수 있다.
다른 변수에 함수를 대입 할 수 있다.
ex1)
void greeting(String text){
print(text);
}
void main(){
var f = greeting; // 함수를 다른 변수에 대입 할 수 있음.
f('hello');
}
ex2)
void someThing(Function(int i) f){
f(10);
}
void main(){
someThing((value){
print(value);
});
}
ex3)
void something(Function(int i) f){
f(10);
}
void myPrintFunction(int i){
print("내가 만든 함수에서 출력한 $i");
}
void main(){
somthing(myPrintFunction); // 내가 만든 함수에서 출력한 10
something((i) => myPrintFunction(i)); // 내가 만든 함수에서 출력한 10
something((i) => print(i)); // 10
something(print) // 10
}
for문과 forEach() 함수
for 문은 대표적인 반복문
for 문은 외부 반복
forEach() 함수는 내부 반복을 수행
forEach() 함수는 (E element){} 형태의 함수를 인수로 받는다.(E는 모든 타입이 가능하다는 의미)
ex)
items.forEach((e) => print(e)); // 람다식
items.forEach((e){ // 일반적
print(e);
});
람다식에서 e는 items의 각 요소가 내부적으로 반복하면서 하나씩 들어올 인수
이것을 print에 전달한다는 의미
where
조건을 필터링 할 때 사용하는 함수
ex)
// 짝수만 출력하기
final items = [1,2,3,4,5];
items.where( (e) => e%2 == 0 ).forEach( (e) => print(e) ); //2,4
함수형 프로그래밍을 지원하는 함수들은 결과를 반복 가능한 타입으로 반환하며
메서드 체인(. 연산자를 찍고 연속적으로 사용하는 것)으로 연결하여 사용 가능
map
map() 함수는 반복되는 값을 다른 형태로 변환하는 방법을 제공하는 함수
ex)
// 짝수를 찾아 '숫자'라는 글자를 붙여 문자열 형태로 출력
final items = [1,2,3,4,5];
for(var i=0; i<items.length; i++){
if(items[i]%2 == 0){
print('숫자 ${items[i]}'); // 숫자2, 숫자4
}
}
=> map() 함수 사용
items.where( (e) => e%2 == 0 ).map( (e) => '숫자 $e' ).forEach(print);
toList
디트에서 함수형 프로그래밍을 지원하는 함수 대부분은 Iterable<T>라는 인터페이스 타입 인스턴스를 반환
실제 사용할 때는 대부분 리스트 형태로 변환해야 하는 경우가 많다
ex)
// 결과를 리스트로 저장
final result = [];
items.forEach( (e) {
if(e%2 == 0){
result.add(e);
}
});
=> toList() 함수 사용
final result = items.where( (e) => e%2 == 0).toList();
toList() 함수는 where(), map()과 같이 Iterable 인터페이스를 변환하는 메서드를 사용 할 수 있다.
toSet
리스트에 중복된 데이터가 있을 경우 중복을 제거한 리스트를 얻고자 할 때 사용
ex)
// 짝수 리스트 구하기
final items = [1,2,2,3,3,4,5];
var result = [];
var temp = <int>{};
for(var i=0; items.lengthl i++){
if(items[i]%2 == 0){
temp.add(items[i]);
}
}
result = temp.toList();
print(result); // 2,4
=> toSet() 사용
var result = items.where( (e) => e%2 == 0).toSet().toList(); // 2,4
any
any() 함수는 리스트를 특정 조건을 충족하는 요소가 있는지 없는지 검사할 때 사용
ex)
// 리스트에 짝수가 하나라도 있는지 검사
final items = [1,2,2,3,3,4,5];
var result = false;
for(var i=0; i<items.length; i++){
if( items[i]%2 == 0 ){
result = true;
break;
}
}
print(result); // true
=> any() 함수를 사용
print(items.any( (e)=> e%2 == 0 )); //true
reduce
reduce() 함수는 반복 요소를 줄여가면서 결과를 만들 때 사용
ex)
// 리스트에서 최대값을 구할 때 순차적으로 비교
// dart:math 패키지는 max(), min() 등 다영한 수학 함수를 제공
import 'dart:math';
final items = [1,2,3,4,5];
var maxResult = items[0];
for(var i; i<items.length; i++){
maxResult = max(items[i], maxResult);
}
print(maxResult); // 5
=> reduce() 함수 사용
final items = [1,2,3,4,5];
print( items.reduce( (e,v) => max(e,v) )); // 5
=> reduce() 함수를 쓰는 다른 방법
final result = items.reduce(max); // 5
계단식 표기법 .. 연산자
계단식 표기법 .. 연산자를 사용하면 동일 객체에서 일련의 작업을 수행 할 수 있음.
ex)
// 리스트에 6울 추가하고 2를 제거
final items = [1,2,3,4,5];
print( items
..add(6)
..remove(2) ); // 1,3,4,5,6
매번 리스트가 반환되어 임시 변수를 만드는 단계가 절역되고 더 유동적인 코드를 작성 할 수 있음.
컬렉션 if
다크에서는 컬렉션 내부에 if 문이나 for 문을 사용 할 수 있다.(이 때 {} 블럭은 사용할 수 없다.)
컬렉션 if를 사용하면 임시 변수를 작성하지 않아도 되며, 더 유동적인 코드를 작성 할 수 있다.
ex)
bool promoAction = true;
print( [1,2,3,4,5, if(promoAction) 6] ); // 1,2,3,4,5,6
컬렉션 for
ex)
var listOfInts = [1,2,3];
var listOfString = [
'#0',
for(var i in listOfInts) '#i'
];
listOfString.forEach(print); // #0, #1, #2, #3
null 처리에 관한 기능
값이 없다는 의미의 null은 에러를 유발하기 쉬움.
값이 null인 객체에 접근해 조작하면 프로그램은 에러를 내면서 중지
ex)
// if 문을 사용하여 null인지 검사
if(name != null){
print(name.length);
}
- ?. 연산자
다트에서 제공하는 '?.' 연산자를 사용하면 null 여부를 간단하게 파악
객체의 프로퍼티나 메서드에 접근 할 때 if 대신 ?. 연산자를 사용하면
객체가 null일 때 에러를 발생하는 대신 null을 반환
ex)
print( name?.length ) // null
- ?? 연산자
?? 연산자는 객체가 null 일 때 작동을 간단히 구현하는데 사용
ex)
// 객체가 null이 아니면 길이를, null이면 0을 반환하는
print(name?.length ?? 0); // name이 null이면 0을 출력
728x90
반응형
LIST
'Program > Flutter' 카테고리의 다른 글
Flutter Splash Screen 적용 (0) | 2020.08.07 |
---|---|
Mac Flutter 개발 환경 (0) | 2020.07.15 |
Flutter Card Widget Sample (0) | 2019.10.02 |
SingleChildScrollView (0) | 2019.09.02 |
Flutter Focus on a Text Field (0) | 2018.11.14 |