전체 글

안녕하세요 앱개발자 수오재입니다 👋
·Mobile Develop
공식문서 링크: https://api.flutter.dev/flutter/widgets/MediaQuery-class.html공식 유튜브 링크: https://www.youtube.com/watch?v=xVk1kPvkgAY 문제상황키보드가 올라와서 UI가 안보이는 상황에 대처할 때 ViewInset 값이 필요하다.이때 final viewInsets = Mediaquery.of(context).viewInsets; 을 통해 겹치는 부분만큼 패딩값을 주는 상황이 종종있다. MediaQuery.propertyOf 활용이때 위 예시처럼 Mediaquery.of(context) 를 사용하게 되면 Mediaquery로 인해 가져오는 모든 값들을 불필요하게 계산된다.예를들어 orientation(방향) 이라든지,..
·Mobile Develop
API문서: https://api.flutter.dev/flutter/dart-core/List/List.generate.html공식유튜브 링크: https://www.youtube.com/watch?v=izr7uBuiacE List.generate() 란?리스트 제너레이트 함수는 리스트를 규칙에 맞추어 손쉽게 만들어주는 함수라고 요약할 수 있다. 파라미터를 보면length: 먼저 몇 개의 원소 를 만들지,generator: 인덱스를 이용하여 각 요소에 콜백으로 어떤 규칙을 적용할지 growable: 리턴되는 리스트를 불변으로 줄지, 가변으로 줄지 (디폴트는 가변)선택할 수 있다. 문제 상황위와 같은 Row 위젯을 구현한다고 생각해보자 별 다섯개를 보여줘야하기 때문에 단순히 StarIcon위젯을 5개 쭈..
·Mobile Develop
문제1. 특정 배열이 주어졌을 때 (ex [1, 2, 3])2. 해당 배열의 subarray 만들기 (ex [1], [2], [3], [1,2], [1,3]..)해결 1. 즉시 평가 방법으로 SubArray 만들기해결 2. 지연 평가 방법으로 SubArray 만들기왜 지연평가를 지향해야할까?생각해보면 두 방법 모두 시간복잡도는 n^2으로 두 번 순회하면서 도는건데 다를게 있나? 라고 생각할 수 있다. 하지만 자세히 살펴보면 먼저 메모리 사용공간에서 차이를 보이게 된다. 즉시평가에서는 result에 모든 subarray를 담게된다. 위 예시를 보았을 때 최종적으로 6개의 배열이 담기는 순간에 return이 호출되고 이를 순회하면서 print되는 것을 확인할 수 있다. 반면 지연평가는 계산 내내 메모리 공간..
·Mobile Develop
예시 상황1. 만약 A 클래스(혹은 위젯)에서 특정 액션이 트리거되면2. B(Stateful Widget) 클래스 내부의 UI가 바뀌어야하는데3. 이때 B 클래스의 State 객체 내부 메서드를 호출해야한다. 이를 코드로 확인해보자면위 코드와 같이 외부클래스/위젯(ParentWidget) 에서는 Stateful 위젯의 Sate객체 메서드에 직접 접근할 수 없다. 당연한 이야기지만 state 클래스는 따로 선언되어있기 때문이다. 하지만 그렇다고 ParentWidget에서 State 인스턴스를 만들어 호출해야할까? 물론 그렇게하면 함수 자체에는 접근할 수 있겠지만 우리가 원하는 위젯의 UI는 단순 State 함수 호출에 의해 바귀지 않는다. 왜냐하면 Widget은 껍데기이고 여기에 업데이트된 내용물(Elem..
소켓 통신 코드를 구현하면서 Either에 담을 결과값으로 Unit을 넣었다. Unit 타입을 사용한 이유는 리턴값은 없지만 성공적으로 함수를 실행했다는 정보를 받고 싶었기 때문이다. 그렇다면 void를 쓸 수도 있을텐데 왜 Unit을 써야할까?  Unit 타입이란?unit이라는 네이밍은 "단 하나의 값"만을 가진다는 특성에서 유래되었다. unit타입의 모든 값은 동일하며 그 자체로 어떤 정보를 표현하지는 않는다.   카테고리 이론에서 unit 타입은 종단객체(terminal object)이다. 종단객체는 모든 객체에서 단 하나의 방향으로 가는 화살표,  보편적인 끝을 찾고싶을 때의 사상(morphism)을 표현하기 위해 사용한다. 이를 프로그래밍에서는 "결과값이 필요없는 함수의 반환타입"으로 활용하는 ..
·Mobile Develop
🧐 문제상황 매일 새벽 5시마다 플러터 프로젝트 develop 브랜치에서 단위테스트를 실행시키고자 했다. 1. 이를 위해 EC2에 도커로 젠킨스를 배포했다.2. Flutter 는 Docker Hub 에 마땅한 이미지가 없어서 (개인이 올려놓은 플러터 이미지가 있긴했는데 스타수가 워낙 낮아 신뢰하기 어려웠다.) EC2 로컬에 직접 설치한상태였다. 이 상태에서 파이프라인 스크립트를 작성하고 build 를 해보았더니 젠킨스가 flutter 파일을 찾지못하고 failure해버리는 이슈가 발생했다.☺️ 문제 원인 분석 및 해결Jenkins가 Docker 컨테이너로 실행되면, 컨테이너는 자체 격리된 파일 시스템을 사용한다. 따라서, EC2 로컬에 설치된 Flutter와 Android SDK 경로를 인식하지 못하고..
최근 함수형 프로그래밍을 연습하던중 비동기 데이터를 받는 함수를 평소 사용하는 Future 대신 Task로 사용하는 것이 좀더 함수형 스타일에 가깝다는 것을 알게되었다.  Future야 머.. 너무 많이 쓰이고 다른 언어에도 다 있는거라 당연하다고 치지만 Task..? 이건 Swift Concurrency 에서 보고 다른 언어 쓸 땐 못봤던 네이밍인데 이게 왜 Future 대신 함수형 프로그래밍에서 쓰이는거지..? 라는 궁금증이 생겼다. 그래서 코드를 작성해보고 로그를 확인해보니, Future와 Task의 차이에 대해 확실히 알게되었다.   위 코드를 통해 알 수 있는 차이점실행 시점함수 호출 시 즉시 실행.run() 호출 시 실행.로그의 순서fetchNumber 호출 직후 "Fetching number..
·Mobile Develop
네비게이션 탭바를 Stateful 위젯으로 만들어 탭할시 파란색 아이콘 이미지로 바꿀 수 있었으나가급적 Stateless 위젯을 사용하여 최적화 시키고 싶었다.Statless 위젯을 사용하면서 이미지의 색을 바꾸는 방법에 대해 알아보자.배경 지식참고링크: https://api.flutter.dev/flutter/dart-ui/BlendMode.html Flutter의 UI렌더링 과정 이해하기 Flutter의 UI렌더링 과정은 아래와 같다개발자가 작성한 코드를 통해 위젯 트리가 생성된다.위젯 트리가 빌드된 후, Flutter는 상태와 위젯트리 생명주기를 관리하는 Element Tree, 그리고 위젯의 위치와 크기 정보를 가지고 있는 Render Tree를 만든다.상위위젯부터 하위위젯까지 제약조건이 잡히고,..
·Mobile Develop
링크: https://product.kyobobook.co.kr/detail/S000003470645 Dependency Injection Principles, Practices, and Patterns | Seemann, Mark - 교보문고Dependency Injection Principles, Practices, and Patterns |product.kyobobook.co.krDependency Injection - Mark Seemann, Steven van Deursen 을 읽고 의존성 주입에 대한 포스트를 작성했습니다 :) 1. 왜 의존성 주입을 해야할까? 왜 의존성 주입을 해야할까? 결론부터 말하자면 객체간의 느슨한 관계 형성을 위함이다. 이에 대해 조금 더 자세히 들여다보자. 객체는..
Address메모리에는 주소가 있다. 이러한 주소에는 두가지 종류, 가상메모리주소와 물리적 메모리 주소가 있다. 프로그램이 실행되면 프로세스가 되며 독자적인 주소공간이 형성된다. 이때 효율적인 메모리 사용을 위해 CPU는 가상메모리(logical address, virtual address)를 참조하고 가상메모리는 실제 메모리(physical memory)를 참조하게 된다. 이러한 엮여있음을 주소바인딩이라고 한다.  가상 메모리에서 물리적 메모리로 주소변환이 되는 순간은 크게 3가지 시점으로 나누어 볼 수 있다.  Compile time binding 컴파일 시점에 물리적 메모리 주소가 결정된다. 가상메모리 주소가 사실상 물리적 메모리 주소. 컴파일 바인딩에 의해 만들어진 코드를 절대코드(absolute..
suojae
suojae.dev