Dart 문법 (1)

luneah·2022년 7월 19일
0

Flutter

목록 보기
10/29
post-thumbnail

타입

모두 reference 타입

int num1 = 2;
double num2 = 3.0
bool isTrue = true;
String str = 'Hello';
  • 타입 체크
    (num1+num2) is int
    (num1+num2).runtimeType

  • var : 타입 추론

    var username; // dynamic -> 가급적으로 피할 것
    var username = 'friendship'; // String
     ```
  • final vs const

    • final : 상수, 재할당 불가
      final String fullname = 'Jeffrey';
      fullname = 'Jefferson'; // error
    • const : 컴파일 타임 상수, 앱 성능 향상시키지만 컴파일 타임에 값 결정됨
      const int age = 75;
      const int favNumber = num1 + 5; // error

✨ Null Safety

기본은 Null을 허용하지 않는다. 변수에 null을 대입하면 컴파일 에러가 발생한다.

int age = 75; // non-nullable
int age = null; // error
int? age; // nullable    -> null을 허용하려면 타입 뒤에 ?를 붙인다.
  • 늦은 초기화 : 값을 바로 초기화 할 수 없는 특수한 상황에 late 키워드 사용해 늦은 초기화 할 수 있다.
    → 꼭 필요한 상황이 아니라면 가급적 피할 것
  • nullable과 non-nullable : nullable이 아닌 변수에 nullable 변수를 대입할 수 없다. 반대도 마찬가지다.
    String? answer;
    String result = answer; // error
    String result = answer! // works

분기

  1. 조건문 - if else
  2. 반복문 - for / while / do~while
  3. 비교
    var txt = 'good';
    assert(txt != 'bad');

연산자

  1. 할당

    String? name;
    var z = name ?? 'Guest'; // name이 null이면 Guest 대입
    name ??= 'Guest'; // name이 null이 아니면 그냥 둬라가 포함되어 있음 
  2. ✨ 삼항 연산자 : 삼항을 사용하여 if else문 대체

    String color = 'blue';
    var isThisBlue = color == 'blue' ? 'Yes' : 'No';
  3. Cascade (..) : 새로운 줄을 작성하지 않고 메소드 호출을 반복할 수 있다. 플러터 코드 작성 시 유용하다.

    // var paint = Paint();
    // paint.color = 'black';
    // paint.strokeCap = 'round';
    // paint.strokeWidth = 5.0;
    
     var paint = Paint()
        ..color = 'black'
        ..strokeCap = 'round'
        ..strokeWidth = 5.0;
  4. 타입 캐스트 : 값을 다른 타입으로 변환한다.

    String num = 10.toString();
    double d = 10.toDouble();
    int i = int.parse('1234');

함수

: 인풋과 아웃풋이 있고 항상 똑같은 값 리턴

  • 기본 함수 형태
    String takeFive(int number) {
      return '$number minus five equals ${number -5}';
     }
  • named parameter를 사용하고 있는 함수
    → 오버로드 효과, 순서 상관 없음
    // required : 반드시 필요한 속성
    namedParams({required int a, int b = 5}) {
    	return a - b;
    }
    
    namedParams(a: 23, b: 10);
  • arrow 함수 : 함수를 매개변수로 다른 함수에 전달할 때 유용하다. 한 줄 짜리 함수 쓸 때 사용.
  • callback 함수 : 플러터에서는 많은 이벤트나 제스처를 처리할 때 콜백 함수를 사용한다.
    void main() {
    	something(10, (value) {
    		print(value);
    	});
    }
    
    void something(int num, Function callback) {
    	callback.call(num);
    }

List

  • 기본 리스트
    List<int> list = [1, 2, 3, 4, 5];
    
    list[0]; // 1
    
    list.length; // 5
    list.last; // 5
    list.first; // 1
  • 반복
    for (int n in list) {
    	print(n);
    }
    
    list.forEach((n) => print(n));
    
    var doubled = list.map((n) => n * 2);
  • 스프레드 연산자 (…) : 리스트 안에 다른 리스트의 요소를 펼쳐 넣을 때 유용하다.
    var combined = [...list, ...doubled];
    combined.forEach(print);
  • Collection if : 조건문 사용 가능, 블록 {} 이나 else문 사용 불가능
  • Collection for : 잘 쓰진 않음

Map

dynamic 허용 (다양한 타입 들어갈 수 있음)

Map<String, dynamic> book = {
  'title': 'Moby Dick',         // key : value
  'author': 'Herman Melville',
  'pages': 752,
};
    
book['title']; // Moby Dick
book['published'] = 1851; // 추가
  • Map의 반복
    for (MapEntry b in book.entries) {
    	print('Key ${b.key}, Value ${b.value}');
    }
    
    book.forEach((k, v) => print("Key : $k, Value : $v"));

📍 Map 자료구조

key, value 쌍으로 이루어진 자료구조, 참고로 JSON 데이터와 똑같은 형태이다. 옆의 코드는 암묵적으로 Map<dynamic, dynamic>이다. 일관적으로 Map<String, dynamic>으로 선언을 많이 하고 Map<String, Object>도 가능하다.

var gifts = {
	// Key: Value
	'first': 'partridge',
	'second': 'turtledoves',
	'fifth': 'golden rings',
};

var nobleGases = {
	2: 'helium',
	10: 'neon',
	18: 'argon',
};

📍 JSON String을 Dart에서 처리하는 방법

String jsonString = “{ \”name\”: \”홍길동\”, \”email\”: \”aaa@bbb.com\” } ”

Map<String, dynamic> user = jsonDecode(jsonString);

print('안녕하세요, ${user['name'}님!');
print('${user['email']}으로 인증 링크를 보냈습니다.');

Class

: 객체의 데이터와 동작으로 그룹화하는 방법이다.

class Basic {
  int id;
    	
  Basic(this.id);
    
  doStuff() {
    print('Hello my Id is $id');
  }
}
  • 인스턴스(객체) 생성 : new 키워드는 옵션 (플러터에서는 미사용하는 것 추천)
    Basic thing = new Basic(55);
    thing.id;
    thing.doStuff();

생성자

this 키워드는 현재 인스턴스 참조에 사용되며 이름 충돌이 없는 한 옵션이다.

class Rectangle {
  final int width;
  final int height;
  String? name;
  late final int area; 
    
  Rectangle(this.width, this.height, [this.name]) {
    area = width * height;
  }
}
  • Named Parameter : 파라미터 이름 지정할 수 있다. 순서 상관 없음. 플러터에서 모든 위젯은 Named Parameter를 사용한다.
  • Named Constructor : 클래스를 초기화하는 여러 방법을 제공할 때 유용하다.
    class Point {
      double lat = 0;
      double lng = 0;
    
      // Named constructor
      Point.fromMap(Map data) {
        lat = data['lat'];
    	lng = data['lng'];
      }
    
      Point.fromList(List data) {
    	lat = data[0];
    	lng = data[1];
      }
    }
    
    var p1 = Point.fromMap({'lat': 23, 'lng': 50});
    var p2 = Point.fromList([23, 50]);
profile
하늘이의 개발 일기

0개의 댓글