![[Flutter][Error] CocoaPod Dependency 오류](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fn5sUr%2FbtsEXrdrcaM%2FAAAAAAAAAAAAAAAAAAAAAI8JWl7wu3GZ98fk_gWIwurTbvzpYoBcfi8ouOkX9F4R%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DjN2SWlZk7VinHz0ilrjWPS4nGZA%253D)
개요 프로젝트에서 사용하는 DB로 Firebase firestore를 사용하려고 했다. 사용하기 간편하고 팀에 백엔드가 없는 상황에서 가장 사용하기 쉽기에 firestore를 사용할 계획이었다. 그러나 플랫폼의 특징을 띠고 있는 현재의 프로젝트 특성상 종속성이 없는 firestore는 문제가 있다고 판단이 되었다. 그리고 아래와 같이 프로젝트 방향성도 바뀌게 되면서 DB를 바꿔야 하는 상황이 되어버렸다. 바뀐 프로젝트 방향성 더보기 노인의 todos를 추가하자 장점) 1. 로그인 할때 노인의 정보를 가져올때 투두 정보를 전부 가져올 수 있다 2. 보호자가 구독중인 노인들 투두 정보를 가져올 때, 정보를 같이 가져오지 못해서 노인의 정보를 가져오려면 한 명 한명 일일이 쿼리를 또 날려야한다. 합치면 한 번..
![[SWIFT] 문자열과 문자](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbrXpsL%2FbtsEYOlHx5q%2FAAAAAAAAAAAAAAAAAAAAALggVaXLjtoTC-TSzJh6gVKIAl_CsOTo8142V3-GLca0%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DQvDzSuVbiwVm1Cu4pyC53TT5Zf0%253D)
문자열과 문자 String(문자열)은 "Hello World"와 같이 Character(문자)들이 합쳐진 것이라고 볼 수 있다. Swift에서 문자열 및 문자 타입은 코드에서 텍스트를 유니코드 호환 방법으로 제공하고 문법적인 부분은 C와 비슷하다. 문자열의 연결은 `+` 연산자를 사용하여 수행할 수 있다. 물론 문자열도 상수와 변수로 선언하여 변경 가능성을 관리해 주어야한다. 문자열 보간을 통해 어떠한 문자열에서 다른 문자열을 불러올 수도 있다. Swift의 문자열은 유니코드 문자로 구성된다고 한다. String Literals 개발자는 미리 정의되어 있는 String 값으로 문자열을 사용할 수 있다. 문자열을 사용할 때는 두 개의 `"` 안에 원하는 문자열을 써주면 된다. Multiline String..
![[SWIFT] 기본 연산자들](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FWRezw%2FbtsEYOMK2Vu%2FAAAAAAAAAAAAAAAAAAAAAMAATFXOAmWq1DQR__R-jiQGbuzt1nF6SF5gqpKzHIL0%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3D7lEoQT71MR5F%252BK5BfYXtswNn%252Fxw%253D)
기본 연산자들 Operators(연산자)는 값을 확인, 변경 또는 결합하는 데 사용하는 특수 기호 또는 Phrase이다. 예를 들어 `+` 연산자나 `&&` 연산자가 있다. Swift는 C언어 연산자의 여러 코딩 오류를 제거하기 위해 기능을 향상시킨 연산자를 지원한다. `=` 연산자는 값을 반환하지 않는데 이는 `==` 연산자와의 혼동에 의해 실수로 사용되지 않도록 하기 위해서다. 산술 연산자(`+`,`-`,`*`,`/`)는 값 오버플로를 감지하고 오류를 발생시키기 때문에 허용된 값보다 크거나 작은 숫자를 사용할 수 없게 도와준다. Swift는 C에서는 찾을 수 없는 `.. `, `=`, `≤` Swift 연산자에는 `===`, `!==`도 있는데 이는 두 객체 참조가 모두 동일한 객체 인스턴스를 참조하..
![[SWIFT] Swift 문법의 기초](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbE2goI%2FbtsEWaohNac%2FAAAAAAAAAAAAAAAAAAAAAJkT4aUWbEVsLC29dHNsw61apvFxQt8TQaJ1lA7ZF5IB%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DC8vybcv3aVrYNIUq2ZUFGVFaJWM%253D)
Swift 문법의 기초 Swift는 IOS, macOS, watchOS, tvOS를 만들기 위한 새로운 프로그래밍 언어이다. 기초적인 자료형으로는 Int, Double, Float, Bool, String, Array, Set, Dictionary가 있다. C언어와 마찬가지로 Swift는 값을 저장하고 참조하기 위해 변수를 사용하고 이름으로 변수를 구분한다. Swift에는 변수 중에서도 값을 변경할 수 없는 Constant(상수)를 제공하고 이로 인해 C에서 보다 더 많은 기능을 수행할 수 있다. Swift에는 Objective-C에서는 볼 수 없는 tuple(튜플) 형식도 제공한다. 튜플을 사용해서 여러 값을 하나의 값으로 반환할 수도 있다. Swift에서는 Optional Type(옵셔널 타입)을 제..
![[iOS][ERROR] Button AddTarget 에러](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FVqMaO%2FbtsEVcGCWhB%2FAAAAAAAAAAAAAAAAAAAAAIYH8bUH5q2Hat6xVIQ6cWDxBRStdLjLfZ0L2Eq4Ygq0%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DEUcw6jRaPrAMntLr8z%252FYzp%252B8qPk%253D)
문제 발생 Flutter를 하다가 다시 iOS 네이티브를 공부하려고 돌아오면서 몇 가지 UI들에 대해 테스트를 해보고 있었다. 스토리보드를 사용하지 않고, 코드로만 UI 구성하기를 연습하고 싶어서 스토리보드를 없애고 하나씩 확인을 해보고 있었다. 그 중 버튼을 눌러서 다른 화면으로 넘어가는 것을 해보고 있었는데, 아래의 코드에서 오류가 나기 시작했다. ▼ class ViewController: UIViewController { let testButton : UIButton = { let button = UIButton() button.setTitle("Button", for: .highlighted) button.layer.cornerRadius = 20.0 button.backgroundColor = ..

개요 플로이드-와샬 알고리즘은 변의 가중치가 음이거나 양인 가중 그래프에서 최단 경로들을 찾는 알고리즘이다. 가중치가 음인 그래프는 있지만, 음수 싸이클은 없다. (음수 싸이클이란? 음의 가중치가 더 커서 최단 경로를 계속해서 줄일 수 있는 상태의 간선을 말함.) 벨만-포드와 음의 가중치의 최단 경로를 계산할 수 있다는 점에서 비슷하지만, 플로이드-와샬 알고리즘은 한 번 수행하면 모든 꼭짓점 쌍 간의 최단 경로의 길이(가중치의 합)을 찾는다. 즉, 벨만-포드와 다익스트라 알고리즘은 한 정점에서 다른 모든 정점으로의 최단 경로를 구했다면, 플로이드-와샬 알고리즘은 모든 정점에서 모든 정점으로의 최단 경로를 구한다. 또한 플로이드-와샬 알고리즘은 다이나믹 프로그래밍으로 볼 수도 있다. 알고리즘 알고리즘 분류..

개요 가중치가 있는 그래프에서 최단 경로 문제를 푸는 알고리즘이다. 최단 경로 문제라고 하면 다익스트라와 같은 작업을 수행하고, 심지어는 다익스트라가 더 빠르기까지 하다. 하지만 벨만-포드 알고리즘의 의의는 다익스트라 알고리즘이 처리하지 못하는 음수인 간선을 처리할 수 있다는 것이다. 그래서 음수인 간선이 등장하는 경우에는 벨만-포드 알고리즘을 사용한다. 알고리즘 벨만-포드 알고리즘에서 중요한 부분 벨만-포드 알고리즘에서 가장 중요시 해야할 부분은 음의 싸이클이다. 벨만-포드 알고리즘은 다익스트라 알고리즘과 같이 값이 더 작은 값이 나오면 갱신하는 식으로 진행된다. 그런데 음의 싸이클이 등장하게 되면, 한 번 순회를 돌 때마다 값이 계속 작아져서 무한히 갱신하게 된다. 그래서 우리는 순회 횟수를 V - ..
![[Flutter][Package] ScreenUtil 패키지](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FdO8fIV%2FbtsEQesz4SC%2FAAAAAAAAAAAAAAAAAAAAAMQWT4vQNXXi-k6nHod4kjXg2cxynAP3ZR_oj2iCkBxb%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DF22egwr8YolKffaEoQCzZS8FC8Y%253D)
개요앱 개발을 하다보면 해상도 대응이 상당히 까다롭다.디자이너가 준 화면을 구현하고, 실제 기기에서 보면 뭔가 이상할 때가 많다.이는 해상도가 맞지 않아, UI 배치가 조금씩 틀어지면서 생기는 문제다. 각 기기마다 해상도가 다르기 때문에 모든 기기에 맞게 코드를 작성하는 것은 어렵다.이를 위해 iOS에선 Auto Layout과 같은 방법론이 등장했다. 하지만 Flutter에서는 어떨까? Flutter에서도 padding을 사용하여 CSS나 iOS와 같이 해상도 대응을 할 수 있다.일반적으로는 이게 정석인데, 약간의 꼼수를 사용할 수 있다. 바로 ScreenUtil 패키지를 이용하는 것이다. ScreenUtil 이란?ScreenUtil 패키지는 해상도를 자동 대응해주는 패키지이다.기준 화면을 설정하면, ..
![[Flutter][Widget] Spacer 위젯](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FxkyzN%2FbtsEMY4bh0C%2FAAAAAAAAAAAAAAAAAAAAAPWFx5Jc_PHj3sFAZ71bbFeiEyIaBRGgJEL4wOIjeZaH%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3D%252BWHONHPyniaNkNTVMxe11UgrPhc%253D)
Spacer란? Spacer는 Row와 Column과 같은 Flex Container (이는 뒤에서 알아볼 것이다.)의 공간을 조절하는 빈 공간을 만들어주는 위젯이다. 이름 그대로 Space + er로 공간을 만들어주는 위젯이다. Spacer 위젯은 추가적인 공간을 잡는 위젯이기 때문에 Flex container안에 있는 Flex.mainAxisAlignment를 MainAxisAlignment.spaceAround, MainAxisAlignment.spaceBetween, MainAxisAlignment.spaceEvenly 로 설정하면 추가 공간을 모두 차지했으므로 재배포할 공간이 남아 있지 않아 가시적인 효과가 없다. 즉, Spacer는 MainAxisAlignment 속성을 모두 무시한다는 것이다..
![[Flutter] Const를 사용해야하는 이유](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fb2lYox%2FbtsERxqEfHl%2FAAAAAAAAAAAAAAAAAAAAADAU0kv7kxyIJlAJbPVXsQXcuzpMnZ-aHna9JU3vWZmM%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DbZI0XGa0JOX%252FGG83P1V5zhyz7VU%253D)
개요 Flutter로 크로스 플랫폼 앱 개발을 하다보면, 아래와 같이 `const`를 붙이라는 경고메세지가 등장한다. ▼ 이는 Error가 아닌 단순 Warning이라서 지키지 않아도 프로그램이 컴파일 되는 데에는 큰 문제가 없다. 하지만 아래에 파란줄이 남은 것을 볼 때면 굉장히 찝찝해져서 const를 붙이지 않고 넘어갈 수 없다. ▼ 이쯤되면 의문이 하나 생긴다. "도대체 왜 `const` 키워드를 붙이라고 권장하는걸까?" 프로그래밍 문법을 배울 때 const는 상수라고 배운다. 그리고 상수는 변하지 않는 값을 선언할 때 사용한다고도 배우는데, Dart에는 `const`외에 `final`이라는 키워드가 존재한다. 변하지 않는 값을 선언하는 것을 권장하는 것이라면 `const`가 아니라 `final`을..