분류 전체보기
-
플러터 엘리먼트 트리의 상태 변화 관리와 Inherited WidgetComputer Science/Flutter 2021. 3. 2. 14:51
엘리먼트 트리의 상태 변화 관리 플러터는 위젯 트리를 만들고, 모든 위젯에 대해 엘리먼트 오브젝트를 만든다. 이 때 이 엘리먼트는 StatefulElement이며, 아래 그림처럼 state object를 관리한다. AuthorCard라는 stateful widget이 있고, Icon이라는 자식 위젯을 갖고 있다. 사용자가 Icon(하트 버튼)을 탭하면, setState가 실행되고 _isFavorited를 true로 토글한다. 내부적으로 state object는 이 엘리먼트를 dirty로 마크한다. 이는 build가 호출되게 한다. element object는 old widget을 제거하고 heart icon의 색이 채워진 새로운 아이콘으로 대체한다. 전체 트리를 재건축하기보다는, 플러터는 바뀌어야하는 위..
-
Stateless Widget과 Stateful WidgetComputer Science/Flutter 2021. 3. 2. 10:18
Stateless Widget과 Stateful Widget Stateless Widget은 불변 객체이다. 위젯이 한번 만들어지면 state나 프로퍼티를 바꿀 수 없다. 프로퍼티가 바뀔 필요 없을 때, stateless widget으로 만드는 것이 좋다. stateless widget의 lifecycle은 프로퍼티를 넘길 수 있는 constructor와, override하는 build 메소드로 시작한다. 위젯의 시각적 묘사는 build 메소드가 결정한다. 다음 이벤트는 stateless widget의 update를 일으킨다. - 위젯이 위젯트리에 삽입된다. - 의존성의 상태나 상속 받은 위젯(조상 노드)가 변한다. Stateful Widget은 상태를 보존한다. UI의 일부가 동적으로 변해야 할 때 유..
-
크루스칼 알고리즘 (Kruskal Algorithm) with Union-Find 알고리즘Computer Science/자료구조&알고리즘 2021. 2. 26. 18:26
크루스칼 알고리즘 (Kruskal Algorithm)이란, 그래프의 최소 비용 신장 트리(Minimal Spanning Tree : MST)를 구하는 그리디 알고리즘이다. 그리디 알고리즘으로써 최적의 해답을 얻을 수 있다는 사실이 증명되어 있다. 기본 과정은 다음과 같다. 1. 그래프의 간선들을 가중치 오름차순으로 정렬한다. 2. 첫번째 간선부터(즉, 가중치가 가장 낮은 간선부터) 선택한다. 3. 선택했을 때, 현재의 MST 집합에 사이클을 형성하는지 여부를 판단한다. 4. 사이클을 형성하면 배제하고, 그렇지 않으면 MST 집합에 추가한다. 이 때, 사이클 형성 여부는 Union-Find 알고리즘을 이용한다. Disjoint Set : 서로 중복되지 않는, 상호 배타적인 부분 집합들로 나눠진 원소들을 저..
-
플러터 데브툴즈Computer Science/Flutter 2021. 2. 26. 16:35
플러터 데브툴즈(Flutter DevTools) 다음처럼 파란 다트 아이콘을 누르면 데브툴즈를 열 수 있다. 데브툴즈는 플러터 앱을 디버깅할 때 유용한 툴들을 제공한다. Flutter Inspector : 위젯 트리를 탐색하고 디버깅한다. Timeline : 앱의 프레임 레이트와 CPU 성능을 보여준다. Memory : 다트의 객체들의 메모리 할당 상태를 보여주고, 메모리 누수를 찾는 것을 돕는다. Performance : 플러터 앱 세션을 기록하고 보여준다. Debugger : 콜 스택에서 브레이크포인트와 변수 검사를 지원한다. Network : 플러터 앱 내부의 HTTP, HTTPS, 웹 소켓 트래픽 등을 검사한다. Logging : 다트 런타임에서 발생한 이벤트와 앱 레벨 로그 이벤트를 보여준다. ..
-
플러터 위젯Computer Science/Flutter 2021. 2. 25. 18:41
플러터(Flutter) - 위젯(Widget) 위젯(Widget)이란? 유저 인터페이스를 구성하는 단위이다. 레고를 조합하는 것처럼 무언가를 만들어내기 위해 위젯을 섞고 맞춘다. 플러터의 선언성(declarative nature)은 UI를 만들기 쉽게 한다. 위젯은 앱의 상태(state)를 보여주는 청사진이다. 위젯은 UI를 만드는 함수와 같다. state를 입력 받은 위젯의 build 메소드는 위젯의 UI를 만들어낸다. 위와 같은 UI를 보자. 이 Card 위젯은 다음과 같은 위젯들로 구성되어 있다. 컨테이너(Container) 위젯 : 위젯의 스타일과 꾸미기, 포지션 등을 담당한다. 칼럼(Column) 위젯 : 다른 위젯들을 세로로 보여준다. AuthorCard 커스텀 위젯 : AuthorCard라는..
-
인터럽트(Interrupt)와 폴링(Polling)Computer Science/운영체제 2021. 2. 18. 15:40
인터럽트(Interrupt) 하드웨어나 소프트웨어는 CPU에 인터럽트를 발생시킬 수 있다. 인터럽트란, CPU에게 작업 요청을 보내는 것이다. CPU가 현재 하고 있던 작업에 대한 방해라는 느낌. 대표적으로 입출력 연산이 종료되었을 때, 예외가 발생했을 때, 운영 체제의 다양한 서비스를 요구할 때 등등. 인터럽트가 발생하면 하던 일을 중단하고 인터럽트에 대한 처리, 서비스 루틴을 먼저 실행한다. 서비스 루틴이 종료되면 하던 작업을 재개한다. 인터럽트 처리 방법 2가지 os가 인터럽트의 종류를 확인하고 인터럽트 핸들러를 호출해서 처리한다. 인터럽트가 요청되면, 인터럽트 벡터로 제어를 옮겨, 인터럽트 서비스 루틴의 주소를 가리키는 포인터들로 구성된 인터럽트 벡터 테이블을 참조한다. 참조된 포인터가 가리키는 ..
-
운영체제(Operating System)의 정의Computer Science/운영체제 2021. 2. 17. 23:28
1. 운영체제(Operating System)의 정의 컴퓨터 시스템은 하드웨어, 운영체제, 응용 프로그램, 사용자로 구성된다. 하드웨어는 CPU(중앙 처리 장치), 메모리, 입출력 장치로 구성된다. -> 기본 계산용 자원 제공. 운영체제는 다양한 사용자를 위해 다양한 응용 프로그램 간의 하드웨어 사용을 제어하고 조정한다. 자원을 적절하게 사용할 수 있는 방법을 제공하여, 그 자체로는 유용한 기능을 수행하지 못하고 다른 프로그램이 유용한 작업을 수행할 수 있는 환경을 제공한다. 2. 시스템의 종류 일괄처리 시스템 (Batch System) : 비슷한 작업을 일괄적으로 처리하여 속도를 확보하는 시스템. 기계식 입출력 장치와 전자 장치의 속도의 차이로 cpu가 종종 쉬는 문제가 발생. 다중 프로그래밍 시스템 ..
-
퀵 정렬 (Quick Sort) 알고리즘Computer Science/자료구조&알고리즘 2021. 2. 17. 16:56
분할 정복에 기반한 알고리즘. 리스트에서 피봇을 고른 뒤, 피봇을 기준으로 왼쪽에는 피봇보다 작은 수, 오른쪽에는 피봇보다 큰 수들을 모은 뒤, 비균등하게 리스트를 나눠가며 정렬한다. 리스트를 모두 쪼갰을 때 모두 정렬이 되어 있다. 따라서 마지막에는 정렬된 것을 합치기만 하면 된다. 리스트의 첫째 원소를 피봇으로 삼고, 나머지 리스트에서 왼쪽에서 시작하는 인덱스 low와 오른쪽에서 시작하는 인덱스가 high가 있다. low는 피봇보다 값이 크거나 같은 원소를 만날 때까지 계속 오른쪽으로 이동한다. 즉, low보다 작은 인덱스의 원소들은 모두 값이 low가 가리키는 원소보다 작다. high는 피봇보다 값이 작거나 같은 원소를 만날 때까지 계속 왼쪽으로 이동한다. 즉, high보다 큰 인덱스의 원소들은 모..
-
합병 정렬 (Merge Sort) 알고리즘Computer Science/자료구조&알고리즘 2021. 2. 17. 15:28
분할정복에 기반한 정렬 알고리즘. 배열을 모조리 분할한 다음에, 도로 합치면서 정렬이 이루어진다. 분할 단계와 합병 단계로 나뉜다. 수도코드 merge_sort(int a[], int len){ if(len == 1){ return; } // 분할 단계 merge_sort(a, len/2); merge_sort(a + len/2, len - len/2); // 합병 단계 int b[len]; int i = 0, j = len/2, k; for(k = 0; k