Dart

    다트 (Dart) 의 캐스케이드 연산자 (Cascade operator) 란?

    다트 (Dart) 캐스케이드 연산자 (Cascade operator) 란? .. 을 말한다. 동일한 객체에 대해 일련의 연산을 수행할 수 있다. 예제 코드 1 캐스케이드 연산자의 결과가 계속 Container 객체를 리턴해주기 때문에 아래와 같은 형식으로 값 할당이 가능하다. var container = Container() ..width = 200.0 ..height = 100.0 ..padding = EdgeInsets.all(8.0) ..alignment = Alignment.center ..color = Colors.blue ..child = Text('Hello World'); 예제 코드 2 var list = [] ..add('Apple') ..add('Ba..

    Dart 에서 CopyWith 메서드를 쓰는 이유

    Dart 언어에서 copyWith() 메서드는 왜 쓰는 걸까? Dart 언어는 현대 언어로 불변을 통한 코드 안정성을 지향한다. 불변 객체는 말그대로 객체 내부 멤버 값이 변하면 안된다. 객체 내부 멤버 값이 변할 것 같으면 아예 새 객체를 생성한다. 새 객체를 생성하기 위한 수단이 copyWith() 이다. 인자로 새로 받지 않은 값은 기존의 값을 그대로 유지하고 인자로 새로 받은 값은 새로 받은 값으로 업데이트해준다. 예제 코드 id, content, date 중 새로 받은 값만 업데이트된 새 객체를 생성해 반환한다. Post copyWith({ String? id, String? content, DateTime? date, }) { return Post( id: id ?? this.id, conte..

    Dart 에서 import hide 이용하기

    Dart 에서 hide 로 중복 숨기기 패키지를 import 해서 쓰다보면, 기존에 정의했던 클래스 이름과 겹치는 경우가 종종 있다. 자바에서는 앞에 어느 패키지인지 명시하는 방식을 많이 쓴다. ex) java.util.List 다트에서는 hide 를 통해 해당 패키지의 특정 클래스를 사용하지 않는다면 숨길 수 있다. import 'pacakage:drift/drift.dart' hide Column; // Widget 의 Column 과 이름이 겹치니 숨기기 이렇게 겹치는 이름을 hide 를 통해 숨긴다면, 같은 클래스 이름을 쓰는 라이브러리를 임포트했음에도 불편함 없이 Column 클래스를 이용할 수 있다.

    Dart 의 Null-safe 언어적 특성

    null-safe 언어란 객체를 선언하면 기본적으로 null 을 넣을 수 없다. 문법적으로 지정을 해줘야지만 null 값을 가질 수 있게 된다. 이를테면, int number; 는 null 이 가능하다는 ? 키워드 표기 없이 초기화를 하지 않았기 때문에 유효하지 않다. int? number; 는 유효하다. 이러한 null-safe 언어의 특성 때문에 null-safe 가 아닌 언어를 쓰던 사람들에게는 낯선 ? 나 ! 같은 연산자가 매우 자주 쓰인다. 자주 쓰이는 연산자 ? 연산자 ? 연산자는 위에서도 언급했는데 어떤 변수에 null 이 들어갈 수도 있음을 의미한다. int? number; // null 가능 int number; // null 불가능 ! 연산자 ! 연산자는 변수가 null 이 아닌 것으로..

    다트의 비동기 지원 (Asynchronous Support)

    비동기 지원 다트 라이브러리엔 Future 혹은 Stream 을 반환하는 함수들이 많다 비동기 함수들은 보통 I/O 혹은 네트워크 작업과 같은 시간 집약적 작업들을 수행을 걸어놓고 작업이 완료될 때까지 기다리지 않고 바로 리턴을 수행한다. async, await 키워드는 마치 동기작업을 하는 것처럼 코드를 보기 편하게 해준다. Future 다루기 라이브러리 투어 에 나오는 것처럼 .then() 혹은 await 을 이용해 future 를 다룰 수 있다. 단 await 을 이용하려면 무조건 async 바디 내부여야 한다. async 함수는 await 을 만나기 전까지는 동기처럼 수행된다. async 함수의 바디 내에는 await 이 몇개 들어있든 상관 없다. Future 는 오브젝트를 반환하겠다는 약속(pr..

    다트 비동기 프로그래밍 (Future, Async, Await)

    배우는 것 async, await 의 적절한 활용 async, await 사용이 실행 순서에 미치는 영향 try-catch 표현식을 사용하여 비동기 호출에서 발생하는 오류를 해결하는 방법 비동기 연산이 주로 사용되는 곳 네트워크를 통해 데이터 가져오기 데이터베이스에 데이터 쓰기 파일에서 데이터 읽기 주로 외부 리소스에서 무언가를 읽어오거나 무언가를 쓰는 경우 네트워크 비용 때문에 병목이 생긴다. 이 병목을 '비동기' 라는 방식을 통해 백그라운드 작업화 시켜 사용자에게 말끔한 사용자 경험을 주어 최대한 해결한다. 비동기 연산이 주는 일반적인 결과 타입 Future: 작은 파일의 경우 한번에 가져올 수 있다. Stream: 커다란 파일의 경우 특정한 단위로 잘라서 가져와야 할 수 있다. 잘못된..

    다트 (Dart) 언어의 생성자 (Constructors) 정리

    생성자 클래스와 같은 이름의 함수를 생성하면 생성자가 된다. (선택적으로) 이름을 부여하면 명명된 생성자 (Named constructors) 를 만들 수 있다. 클래스의 인스턴스를 생성하기 위한 일반 생성자를 generative constructor 라 한다. class Point { double x = 0; double y = 0; Point(double x, double y) { // 사실 인스턴스 변수를 초기화하는 더 좋은 방법이 있다. this.x = x; this.y = y; } } Dart 에서 this 는 이름 충돌(name conflict)이 발생할 때만 사용하는 것이 좋다. 다트 스타일은 this 를 생략한다. 공식 매개변수 초기화하기 (initializing formal paramet..

    다트(Dart) 언어의 클래스(Class) 정리

    다트 (Dart) 클래스 Null 을 제외한 모든 클래스는 Object 를 상속받음 mixin 을 기반으로 한 상속 지원 mixin 기반이라는 것은 모든 클래스에 정확히 하나의 슈퍼클래스가 있지만, 클래스 바디를 다양한 클래스 계층 구조에서 재사용할 수 있다는 것 002.확장-메서드(Extension-methods): 클래스를 바꾸지 않고 메서드 추가 가능 003.클래스-제어자(class-modifier): 하위 클래스 만드는 방식을 제어 가능 클래스 멤버 사용 기본적으로 자바나 자바스크립트와 동일하게 . 으로 접근 가능 null 일 수도 있는 경우 . 대신 ?. 을 사용 // p가 non-null이라면, a의 값을 p의 y의 값으로 설정합니다. var a = p?.y; 생성자 사용 정적 팩터리 메서드나..

    다트(Dart) 언어의 클래스 제어자 (Class modifier) 정리

    클래스 제어자 혹은 수정자 (class modifier) 클래스 혹은 믹스인이 자체 라이브러리 내 혹은 정의된 라이브러리 외부에서 사용되는 방식을 제어한다. 제어자 키워드는 클래스 혹은 믹스인 선언 앞에 온다. 이를테면, abstract class 는 추상 클래스를 정의한다. class 앞에 올 수 있는 것들 abstract base final interface sealed mixin base 만 믹스인 선언 전에 올 수 있다. 제어자들은 enum, typedef, extension 과 같은 다른 선언에 적용할 수 없다. 클래스 제어자 사용 여부는 클래스의 의도된 용도와 클래스가 의존할 수 있어야 하는 동작을 고려해야 한다. 제어자 없음 어떤 라이브러리에서든 생성자나 하위 타입에 대한 권한을 제한하고 싶..

    다트(Dart) 언어의 확장 메서드 (Extension methods) 정리

    목적 다른 벤더에서 만든 라이브러리의 API를 직접 수정하지 않고 내가 원하는 메서드를 몇개 추가하고 싶을 때 사용 가능하다. 일반적인 언어에서 타인의 API 를 변경하는 것이 불가능한 경우가 많다. 원래는 헬퍼 함수나 래퍼 클래스를 이용해 해결하던 문제를 Extension methods 로 해결할 수 있는 것이다. 예시 1: 파싱 문자열에서 숫자로 변환하는 parseInt() 함수가 있었으면 할 때 확장이 포함된 라이브러리 임포트하기 라이브러리를 임포트하고 원래 있던 메서드인것처럼 사용하면 된다. import 'string_apis.dart'; // ··· print('42'.parseInt()); // Extension 메서드 사용. extension 키워드를 이용해 직접..

    다트의 오류 처리 방식

    오류 처리 (Error Handling) Java 와 달리 Dart 의 모든 예외는 Unchecked 예외임 자바 예외 처리의 종류 이펙티브 자바 item 70, 복구할 수 있는 상황에는 검사 예외를 프로그래밍 오류에는 런타임(비검사) 예외를 사용하라 메서드는 어떤 예외를 던질지 선언하지 않으며, 예외 처리가 강제되지 않는다. 다양한 Error 와 Exception 객체를 내부적으로 제공하고, 직접 정의할 수도 있다. Error 와 Exception 객체가 아니어도 어떤 객체든 예외로 던질 수 있다. 단, 프로덕션 코드에서는 Error 와 Exception 을 구현한 타입을 주로 예외로 던진다. throw throw FormatException('Expected at least 1 section&..

    다트 (Dart) 변수, 상수 선언 방식

    변수 선언 var var name = 'Jake Seo'; 타입 추론 (Type Inference): 변수에 들어가는 초기 값을 기준으로 변수의 타입이 추론되어 결정된다. 불변성 (Immutability): 컴파일 될 때, 추론된 타입으로 var 가 치환된다. 이 말은 var 로 선언한 변수의 타입이 일단 추론되면, 컴파일 시에 실제 타입으로 변경됐으니 더이상 타입을 변경할 수 없다는 것이다. dynamic dynamic name = 'Jake Seo'; name = 1 동적 선언: 변수의 타입이 고정되지 않아 계속 다른 타입의 값을 저장할 수 있다. 직접 타입 명시하기 String name = 'Jake Seo'; int age = 50; double weig..

반응형