본문 바로가기

IT.모바일/배움

Null Safety, null 합류 연산자, late, final, const, 연산자, 조건문, 반복문, List, Map, 함수, 메서드, positional/named parameter | Flutter 문법

by FrankUniq 2023. 11. 27.
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'),
        );
    }    
}

 

댓글