-
코드팩토리의 플러터 프로그래밍 (책_기본문법)개인공부 2024. 3. 14. 23:19
다트 입문
1. 다트는 UI를 제작하는 데 최적화되어 있다. (완전한 비동기 언어이며 이벤트 기반)
2. 핫 리로딩을 통해 코드의 변경 사항을 즉시 화면에 반영 가능
3. 멀티 플랫폼에서 로깅하고 디버깅하고, 실행할 수 있다.
4. 자바스크립트로의 완전한 컴파일을 지원한다.
컴파일이란?
다트(Dart) 언어가 자바스크립트로의 완전한 컴파일을 지원한다는 것은 다트 코드를 자바스크립트 코드로 변환할 때 완전한 변환을 지원한다는 의미5. 백엔드 프로그래밍을 지원한다.
void main() { print('hello world'); }
이걸 출력하려면 터미널에서 dart lib/main.dart 명령어를 실행하면 'hello world'가 출력된다.
다트는 프로그램 시작점인 엔트리 함수 기호로 main()을 사용하고, 괄호()안에 입력받을 매개변수를 지정할 수 있다.
void는 아무값도 반환하지 않는다는 뜻이다.
[주석]
void main(){ // 주석을 작성하는 첫 번째 방법은 // 한 줄 주석입니다. /* * 여러 줄 주석 방법입니다. * 시작 기호는 /*이고 끝나는 기호는 */입니다. * 필수는 아니지만 관행상 중간 줄의 시작으로 *를 사용합니다. * */ /// 슬래시 세 개를 사용하면 /// 문서 주석을 작성할 수 있습니다. /// DartDoc이나 안드로이드 스튜디오 같은 /// IDE에서 문서(Documentation)로 인식합니다. }
변수선언
var를 사용한 변수 선언
변수에 값이 들어가면 자동으로 타입을 추론하는 타입 추론 기능을 제공해서 명시적으로 타입을 선언하지 않아도 된다.
void main() { var name = '코드팩토리'; // 변숫값 변경 가능 name = 1; print(name); }
이렇게 되면 name은 문자열로 타입이 추론되었기 때문에 에러가 발생하게 된다.
void main() { var name = '코드팩토리'; print(name); // 변숫값 변경 가능 name = '골든래빗'; }
이렇게 변수명은 수정이 가능하지만 변수명 중복은 불가능 하기 때문에 아래처럼 되면 에러가 발생한다.
void main() { var name = '코드팩토리'; print(name); var name = '김고은'; }
dynamic를 사용한 변수 선언
dynamic키워드는 var와는 다르게 변수의 타입이 고정되지 않아서 다른 타입의 값을 저장할 수 있다.
void main() { var name = '코드팩토리'; name = 1; print(name); // 1 }
final/const를 사용한 변수 선언
두 변수는 값을 처음 선언 후 변경할 수 없다.
void main() { final String name = '블랙핑크' ; name = 'BTS'; // 에러 발생. final로 선언한 변수는 선언 후 값을 변경할 수 없음 const String name2 = 'BTS'; name2 = '블랙핑크' ; // 에러 발생. const로 선언한 변수는 선언 후 값을 변경할 수 없음 }
final은 런타임(실행을 해봐야 값을 알 수 있음), const는 빌드타임 상수이다.
DateTime.now( )
함수가 실행되는 순간의 날짜 및 시간을 제공해 준다.void main() { final DateTime now = DateTime.now(); print(now); // 현재 날짜 및 시간 출력됨 }
반면에 const로 지정한 변수는 빌드타임에 값을 알 수 있어야 하는데 DataTime.now()함수는 런타임에 반환되는 값을
알 수 있기 때문에 에러가 난다.
void main() { // 에러 const DateTime now = DateTime.now(); print(now); }
코드를 실행하지 않은 상태에서 값이 확정되면 const를, 실행될 때 확정되면 final을 사용하면 된다.
변수타입
모든 변수는 고유의 변수 타입을 갖고 있다. var 키워드를 사용하면 자동으로 변수 타입을 유추할 수 있지만
직접적으로 변수 타입을 명시해주면 코드가 더욱 직관적이어서 유지보수가 편해진다.
void main(){ // String - 문자열 String name = '코드팩토리'; // int - 정수 int isInt = 10; // double - 실수 double isDouble = 2.5; // bool - 불리언 (true/false) bool isTrue = true; print(isInt); //10 print(isDouble); // 2.5 print(isTrue); // true }
컬렉션
컬렉션은 여러 값을 하나의 변수에 저장할 수 있는 타입이다.
List : 여러값을 순서대로 저장한다.
Map : 특정 키값을 기반으로 빠르게 값을 검색해야 하거나
Set: 중복된 데이터를 제거할 때 사용된다.
컬렉션 타입은 서로의 타입으로 자유롭게 형변환이 가능하다는 매우 큰 장점이 있다.
1. List 타입
여러값을 순서대로 저장한다.
리스트 구성단위를 원소라고 하고, 리스트명[인덱스] 형식으로 특정 원소에 접근할 수 있다.
void main() { // 리스트에 넣을 타입을 <> 사이에 명시할 수 있습니다. List<String> blackPinkList = ['리사','지수','제니','로제']; }
List 타입에 기본으로 제공하는 함수
1. add() 함수
List에 값을 추가할때 사용
arr.add('uri')
'uri'는 배열 끝에 추가된다.
2. where()
List에 있는 값들을 순서대로 순회하면서 특정 조건에 맞는 값만 필터링 하는데 사용된다. (자바스크립트 filter랑 비슷)
순회가 끝나면 유지된 값들을 기반으로 이터러블이 반환된다.
이터러블이란?
이터러블은 추상 클래스로 List나 다음으로 배울 Set 등의 컬렉션 타입들이 상속받는 클레스다.
쉽게 말해 List와 Set같은 컬랙션이 공통으로 사용하는 기능을 정의해둔 클래스이다.
순서가 있는 값을 반환할 때 사용한다.void main() { List<String> blackPinkList = ['리사','지수','제니','로제']; final newList = blackPinkList.where( (name) => name == '리사' || name == '지수' , // '리사' 또는 '지수'만 유지 ); print(newList); // (리사, 지수) print(newList.toList()); // Iterable을 List로 다시 변환할 때 .toList() 사용 // [리사, 지수] }
3. map() 함수
List에 있는 값들을 순서대로 순회하면서 값을 변경할 수 있다. 반환하는 값이 현잿값을 대체하며
순회사 끝나면 이터러블이 반환된다.
void main() { List<String> blackPinkList = ['리사','지수','제니','로제']; final newBlackPink = blackPinkList.map( (name) => '블랙핑크 $name' , // 리스트의 모든 값 앞에 '블랙핑크' 추가 ); print(newBlackPink); // (블랙핑크 리사, 블랙핑크 지수, 블랙핑크 제니, 블랙핑크 로제) // Iterable을 List로 다시 변환하고 싶을 때 .toList() 사용 print(newBlackPink.toList()); // [블랙핑크 리사, 블랙핑크 지수, 블랙핑크 제니, 블랙핑크 로제] }
4. reduce() 함수
List에 있는 값들을 순회하면서 매개변수에 입력된 함수를 실행한다. 다만 reduce함수는 순회할때마다 값을 쌓아가는 특징이 있다.
reduce함수는 이터러블을 반환하지 않고 List 멤버의 타입과 같은 타입을 반환한다.
void main() { List<String> blackPinkList = ['리사','지수','제니','로제']; final allMembers = blackPinkList.reduce((value, element) => value + ', ' + element); // 1 리스트를 순회하며 값들을 더합니다. print(allMembers); // 리사, 지수, 제니, 로제 }
5. fold() 함수
reduce함수와 실행되는 논리는 똑같다. reduce함수는 함수가 실행되는 리스트 요소들의 타입이 같아야하지만 fold함수는 어떠한 타입이든 반환할 수 있다.
void main() { List<String> blackPinkList = ['리사','지수','제니','로제']; // 1 reduce() 함수와 마찬가지로 각 요소를 순회하며 실행됩니다. final allMembers = blackPinkList.fold<int>(10, (value, element) => value + element.length); print(allMembers); //18 }
fold함수는 타입이 완전히 같아야하는 제약이 없다 그래서 첫번째 매개변수에 시작할 값을 지정하고, 두번째 매개변수에는 reduce()함수와 똑같이 작동하는 함수를 입력한다.
'개인공부' 카테고리의 다른 글
코드팩토리의 플러터 프로그래밍 (책_기본문법) (0) 2024.03.20 클린코드 리액트 (props, component) (0) 2024.02.02 클린코드 리액트 state, props (0) 2024.01.31 클린코드 리액트 state (0) 2024.01.31 CSS(선택자2,의사클래스,의사요소) (0) 2023.03.26