분류 전체보기
플러터 ListView 에서 사용되는 옵션들 간단하게 정리
ListView 클래스란? 선형으로 정렬된 스크롤 가능한 위젯 목록이다. scrollDirection 옵션 스크롤 축을 vertically 혹은 horizontally 변경할 수 있다. 다만, 크기 조정을 각각 똑바로 해주어야 한다. vertical 일 때, 세로 크기가 무한대면 안되고, horizontal 일 때 가로 크기가 무한대면 안된다. 그러면 "BoxConstraints forces an infinite width." 같은 오류를 맞게 된다. reverse 옵션 요소의 순서를 반대로 변경할 수 있다. NeverScrollableScrollPhysics() 이를 physics 속성에 생성하면 스크롤이 불가능해진다. cacheExtent 옵션 뷰포트 밖 영역을 리스트 뷰로 유지한다. cacheExt..
자바 Objects.requireNonNull() 을 사용하는 이유
Objects.requireNonNull(T obj) 오브젝트가 null 이라면 NullPointerException 을 던진다. public static T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; } 사용 이유 어차피 null 에서 메서드를 호출하면 NullPointerException 은 던져질텐데 왜 사용할까? 빠른 실패 아래는 /register 에서 name 이라는 파라미터를 받아서 포맷팅을 한 후 저장하는 코드의 예시이다. 만일 register() 메서드에 Objects.requireNonNull() 이 있었다면, register() 에서 에러가 터졌을 것이다. register()..
플러터의 상호작용 중 제스처(Gesture) 란?
제스처 관련 위젯 Flutter 에서 제스처 시스템은 두가지 레이어로 나뉨 첫번째 레이어는 raw pointer events 로 포인터의 움직임과 위치를 기술함 (터치, 마우스, 스타일러스 펜) 두번째 레이어는 gesture 라고 의미론적인 액션으로 하나 이상의 포인터 움직임으로 구성됨 제스처의 종류 공식문서 Pointers PointerDownEvent: 포인터가 화면의 특정 위치에 가는 것 PointerMoveEvent: 포인터가 한 위치에서 다른 위치로 이동하는 것 PointerUpEvent: 포인터가 화면에 더이상 접촉하지 않는 것 PointerCancelEvent: 포인터의 입력이 더이상 이 앱을 향하지 않는 것 터치가 되면 (On pointer down), hit test 라는 것이 일어난다...
코드 팩토리의 플러터 프로그래밍 - 플러터 기본 다지기, 4장 플러터 입문하기
코드 팩토리의 플러터 프로그래밍 - 플러터 기본 다지기, 4장 플러터 입문하기 "이 글은 골든래빗 《코드 팩토리의 플러터 프로그래밍》의 04장 써머리입니다." 플러터 소개 크로스 플랫폼 프레임워크로 안드로이드, IOS, 맥OS, 윈도우, 리눅스, 데스크톱 앱까지 지원함 구글이 강력하게 지원 중임 스키아 엔진 기존 크로스 플랫폼 프레임워크들의 시도는 코드를 네이티브 프레임워크 코드로 전환하는 것에 중점을 둠 플러터는 스키아 엔진이라는 2D 렌더링 엔진과 직접 통신함 스키아 엔진이 실행된다면 똑같은 API 를 사용하여 프로그래밍 가능함 플랫폼별 UI 디버깅 부담이 현저히 적음 스키아 엔진의 장점 (React Native 와의 약간의 비교) 더 나은 최적화가 가능하다 새로 렌더링이 필요한 위젯들만 렌더링하기 ..
디바운싱(Debouncing) 과 쓰로틀링(Throttling) 이란?
Debounce 와 Throttling 의 필요성 검색엔진들은 자음 하나로도 많은 검색어 추천 결과를 제공한다. 사용자가 현재까지 입력한 검색어에 따라 검색어를 추천해주는 것이다. 사실 내부적으로는 서버에 검색어를 보내고 그에 따른 추천 검색어를 받는 과정을 거친다. 그런데 이 과정에서 너무 많은 글자를 썼다 지웠다 한다면? 서버는 너무 많은 요청을 처리해야 한다. 이를 최적화 하기 위해 '사용자의 글자 입력이 잠시 끊긴 시점'에만 요청을 보내려면 어떻게 해야 할까? 여기에 디바운스라는 최적화 기법이 이용되는 것이다. Debounce (디바운스) 와 Throttling (쓰로틀링) 이란? 함수가 너무 많이 실행되지 않도록 제어하는 테크닉이다. 성능 최적화와 리소스 관리에 많이 이용된다. D..
다트의 비동기 지원 (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: 커다란 파일의 경우 특정한 단위로 잘라서 가져와야 할 수 있다. 잘못된..
코드 팩토리의 플러터 프로그래밍 - 다트 언어 마스터하기, 3장 다트(Dart) 비동기 프로그래밍
코드 팩토리의 플러터 프로그래밍 - 다트 언어 마스터하기, 3장 다트(Dart) 비동기 프로그래밍 "이 글은 골든래빗 《코드 팩토리의 플러터 프로그래밍》의 03장 써머리입니다." 동기 vs 비동기 프로그래밍 비동기 프로그래밍은 요청한 결과를 기다리지 않아서 순서대로 실행된다는 보장이 없다. 일단 요청을 보내놓고 기다린다. UI 프로그래밍에서는 UI 가 블록되지 않도록 하는데 중요한 역할을 한다. 동기 프로그래밍만 사용해야 한다면, 시간이 걸리는 작업에서 UI의 반응이 멈춰버린다. 네트워크 API 응답을 받거나, 큰 계산, 인코딩 등이 긴 작업에 해당한다. Future 비동기 프로그래밍에 쓰이는 Future 클래스는 이름처럼 미래에 받아올 값을 의미한다. Future name; Future number; ..
코드 팩토리의 플러터 프로그래밍 - 다트 언어 마스터하기, 2장 다트(Dart) 객체지향 프로그래밍
코드 팩토리의 플러터 프로그래밍 - 다트 언어 마스터하기, 2장 다트(Dart) 객체지향 프로그래밍 "이 글은 골든래빗 《코드 팩토리의 플러터 프로그래밍》의 02장 써머리입니다." 객체지향 프로그래밍의 필요성 적절한 추상수준을 유지하며 소스코드의 유지보수를 용이하게 하는 것 main() 함수에 모든 행위를 기술하지 않는다. 기본적으로는 변수와 메서드를 클래스에 종속되도록 코딩하여 유지보수를 용이하게 한다. 클래스를 만들어 데이터가 가질 값과 기능을 설계한다. 클래스 클래스에 속한 함수는 메서드라 부름 함수는 메서드를 포함하는 더 큰 개념 클래스 내부 멤버 변수나 메서드에 접근할 때는 this 키워드 이용 [[001.다트-클래스]] 다트(Dart) 언어의 클래스(Class) 정리 class Car { //..
다트 (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 과 같은 다른 선언에 적용할 수 없다. 클래스 제어자 사용 여부는 클래스의 의도된 용도와 클래스가 의존할 수 있어야 하는 동작을 고려해야 한다. 제어자 없음 어떤 라이브러리에서든 생성자나 하위 타입에 대한 권한을 제한하고 싶..