SMALL
Null Safety [null 안정성, ?]
변수가 null이 될 수 있는지 여부를 명시적으로 지정할 수 있다. 개발자의 실수 방지, 코드 안정성 향상.
void main(){
String name = 'Bueno'; // null 할당 불가.
String? name2 = null; // null (비어있는 값). String?이 null값을 넣을 수 있게 함.
print(name2.length); // 에러 발생. null의 length 처리 불가.
print(name2?.length); // null 출력. 물음표를 쓰면 값이 null로 호출 허용.
// 애초에 name2를 String?로 null Safety 변수로 지정했기 때문에 괜찮은 것.
}
null 합류 연산자, ??
void main(){
String? name3 = null; // null 허용.
String result = name3; // 에러 발생. result는 null을 허용하지 않는 변수이기 때문에.
String result = name3 ?? 'Buena'; // name3이 null이면 우측에 있는 값을 할당.
String? name4 = 'hola';
String result = name4 ?? 'Buena';
print(result); // name4가 null이 아니므로 'hola' 출력.
}
late
late String name; // null. 초기화[값 할당]하지 않고 시작. 명시적으로, 나중에 늦은 초기화로 값을 할당 예정.
String? name2;
void main(){
name = "홍길동" // 원하는 시점에 late 초기화
name2 = "abc"
name2 = null; // String?은 null-able, 반면에 late는 처음에는 값을 할당하지 않아도 나중에는 값을 할당.
final & const
final은 런타임. const는 컴파일 시점에(런타임 이전에 미리) 성능적인 이득 확보 가능.
const로 지정할 수 있는 값들을 const 형태로 지정해놓아야 한다. 그렇지 않고 프로그램 실행 이후 할당하면 속도가 늦어지게 된다.
// 상수: 절대 변동되지 않는 항상 같은 값 유지.
// final 키워드: 처음에 값이 할당되면 다시 할당 불가.
final int testVal = 30;
testVal = 10; // 에러. final variable can only be set once.
final int testVal2;
testVal2 = 20;
testVal2 = 25; // 에러.
// const 키워드: 처음에 값이 할당되면 다시 할당 불가.
// + 선언과 동시에 값을 할당해야 한다. 컴파일 시점에(run 전에) 결정되어야만 한다.
const int testVal3; // The constant must be initialized.
const int testVal3 = 10;
DartPad에서 indentation은 Format 버튼
연산자
void main(){
// 산술 연산자
int a = 10;
int b = 3;
int sum = a+b;
print(sum);
int minus = a-b;
print(minus);
int product = a*b;
print(product);
double division = a/b;
print(division);
int remainder a%b;
print(remainder);
int quotient = a~/b;
print(quotient);
// 비교 연산자
bool isResult = (a==b);
print(isResult);
bool result1 = (true || false); // 논리 합 OR
bool result2 = false && false; // 논리 곱 AND
bool result3 = !esult2; // 논리 부정 NOT
// 할당 연산자
double c = 10;
c += 20;
print(c);
c -= 10;
c *= 10;
c /= 10;
// 조건 연산자
int age = 39;
String ageStatus = age >= 18 ? "성인"; "미성년자"; // 3항 연산자
print(ageStatus);
}
조건문 & 반복문
print('반복 $i'); // String interpollation
void(main){
int age = 50;
if (age <= 19){
print("미성년자");
} else if(age >= 50){
print("중년");
} else if(age <= 34){
print("청년");
else {
print("성인");
}
String grade = 'A';
switch (grade) {
case 'A':
print('우수');
break;
case 'B':
print('보통');
break;
case 'C':
print('부족');
break;
default:
print('평가 없음');
break;
}
for(int i=0, i<5; i++){
print('반복 $i'); // string interpollation
}
print('반복 끝');
int count = 0;
while(count < 3) {
print('while 반복 $count');
// count++;
break; // 반복 최초 1회 후 반복문을 빠져나옴.
}
}
List & Map
scoremap.forEach((key,value){ });
// List: 순서가 있는 데이터 collection. index 개념을 활용해서 데이터에 접근할 수 있다.
List<int> numbers = []; // 빈 리스트 생성
List<int> numbers2 = [
1,
2,
3,
4,
5,
]; // 데이터를 포함해서 리스트 생성
// Map: key와 value의 한 쌍으로 데이터를 저장하는 collection. 각 key는 고유하며, key를 사용하여 value를 검색할 수 있다.
Map<String, int> scoreMap = {};
Map<String, int> scoreMap2 = {
'abc': 100,
'abd': 30,
'abe': 20,
};
void main(){
print(numbers2[0]);
// 리스트에 데이터 추가.
numbers.add(6);
print(numbers[0]);
// for문 활용해서 list 데이터 모두 가져오기
for(i=0, i<numbers2.length, i++){
print('$i ${numbers2[i]}');
}
// 리스트의 데이터 제거
numbers.removeAt(0); // 0번째 데이터 제거
// print(numbers[0]); // 에러
numbers.add(7);
numbers[0] = 8;
print(numbers[0]);
print(scoreMap2['abe']);
scoreMap['abf'] = 88;
print(scoreMap['abf']);
scoreMap2.forEach((key, value){ // for-each문
print('$key의 점수는 $value');
});
}
함수와 메서드
- 함수(Function): 코드의 논리를 분리하고 재사용성을 높이는 데 사용된다. 함수 이름, 매개변수(parameter), 반환 유형(return type)으로 구성.
void main() { // void -> 반환 타입이 없다. 실행만 한다.
print(add(5, 3));
setStart();
}
int add(int a, int b) {
return a+b;
}
void setStart() {
print('시작');
}
- 메서드(Method): 클래스 내부에서 정의된 함수
class UserInfo {
String name;
int age;
String hobby;
void setStart() { // 클래스 내부 함수, method
}
}
positional parameter vs named parameter
void setStart({String name, int age}) { // positional parameter
print('called set started, $name, $age');
}
void setStart2({String name = 'a', int age = 20}) { // named parameter
print('called set started, $name, $age');
}
void setStart3({required String name}) { // named parameter with required
print('called set started, $name');
}
void main() {
setStart('abc', 30);
setStart2(age: 50, name: 'abd');
setStart3(name: 'abe');
}
--
책 Do it! 플러터 앱 프로그래밍
1. 개발 환경 준비
(1) developer.android.com/studo 안드로이드 스튜디오 설치
(2) flutter.dev/docs/get-started.install 최신 버전 플러터 SDK zip 파일 다운로드 - flutter 디렉터리로 압축 해제
cmd에서 확인
c:
cd flutter\bin
cmd bin 디렉터리에서 플러터 개발 환경 점검
flutter doctor
(3) 안드로이드 스튜디오 실행 - Configure - Plugins 또는 File - Setting - Plugins - flutter 플러그인 찾아서 install 클릭 - Dart 플러그인 같이 설치
2. [Create New Flutter Project] - [Flutter Application]
- Project name: first_flutter_app
- Flutter SDK path: 플러터 SDK 압축 푼 \flutter 폴더 경로
- Project location: \FlutterProject\FirstApp
- Description
- Package name: '도메인.회사명.프로젝트명' 형식으로 작성. 예) com.rollcake.flutterapp
- emulator: AVD Manger - Create Virtual Device - Category - Phone - 최신 기종 Pixel 선택.
- 안드로이드 가상 장치에 설치할 시스템 이미지인 안드로이드 SDK 버전 최신으로 선택.
3. 플러터 프로젝트 구조
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
'IT.모바일 > 배움' 카테고리의 다른 글
Class, Abstract, Mixin, Interface 특징 개념 (0) | 2023.11.29 |
---|---|
Dart 369게임 | 모두의연구소 Flutter 오름캠프 (0) | 2023.11.29 |
[패캠 태블로] 지도에 따른 시각화 | Ch.9 (0) | 2023.07.22 |
[패캠 태블로] 속성별 비교를 위한 시각화 KPI, Highlight Table, Bullet Table (0) | 2023.07.21 |
[패캠 태블로] 시간에 따른 시각화 | Ch.4 라인, 영역, 슬로프, 스파크라인, 캘린더, 간트 차트 (0) | 2023.07.19 |
댓글