본문 바로가기

전체 글11

키보드와 함께 버튼을 자연스럽게 올리는 방법 (feat. Combine) ❓ 상황프로젝트 진행 중, 텍스트 필드에 입력할 때 키보드가 올라오면서 하단의 가입 버튼이 키보드에 가려지는 문제가 발생했습니다. 가입 버튼을 키보드 위로 자연스럽게 올리고 싶다는 단순한 목표였지만, iOS의 동작 타이밍과 키보드 노티피케이션의 구조를 이해해야 제대로 해결할 수 있는 문제였습니다. 또한, Minimum Target이 iOS 14였기 때문에 @objc, addObserver 같은 Objective-C 기반 코드는 최대한 줄이고 Swift스럽게 구현하고자 고민이 많았습니다.🤔 처음 고민했던 방법들textFieldDidBeginEditing, textFieldDidEndEditing 델리게이트 메서드를 활용해서 버튼 위치 조정?NotificationCenter의 UIKeyboardWillSh.. 2025. 4. 17.
GitHub 403 에러 (Permission denied) 해결 방법 팀 프로젝트를 위해 클론 받아온 레포지토리에 git push를 하려 했는데,아래와 같은 403 에러가 발생했습니다. 이 문제는 HTTPS 인증 문제 때문입니다.GitHub은 보안 강화를 위해 패스워드 대신 Personal Access Token(PAT)을 사용하도록 변경했는데,HTTPS 방식으로 push하려고 하면 인증이 제대로 되지 않아 발생하는 오류입니다.✅ 해결 방법: SSH 방식으로 변경HTTPS가 아닌 SSH 방식을 사용하면 인증 문제 없이 push할 수 있습니다.다음 명령어를 실행해서 GitHub 원격 저장소(remote) URL을 SSH 방식으로 변경하세요.git remote set-url origin git@github.com:[프로젝트주소].git  이제 다시 git push를 실행하면 .. 2025. 4. 4.
Git 잔디가 안심어짐 잔디는 GitHub 계정에 연결된 이메일 주소와 로컬 Git의 전역 설정 파일(.gitconfig)에 설정된 이메일 주소가 일치해야만 생김. (커밋을 할 때 사용한 이메일 주소가 GitHub 계정에 등록된 이메일 주소와 일치해야 잔디에 해당 커밋이 기록됨) 잔디가 생기지 않는다면 .gitconfig를 확인해 볼 필요가 있음. 터미널에서 다음과 같은 명령어를 입력 .gitconfig 파일에 어떤 값들이 설정되어 있는지 확인할 수 있는데.. 여기서 유저의 이름과 이메일을 볼 수 있음 자신의 Github 설정에 가서 계정의 이름과 이메일이 터미널에서 확인한 결과와 다르다면 문제가 있는거임. 해결방법은다시 터미널로 돌아가서 GitHub 계정 정보와 동일하게 .gitconfig 파일의 정보를 수정해주면 됨. 위 .. 2024. 8. 16.
고차함수 고차함수란 다른 함수를 매개변수로 받거나, 함수 자체를 반환하는 함수Swift에서는 배열이나 컬렉션을 처리할 때 유용하게 사용됨  map배열의 각 요소에 주어진 변환 함수를 적용하여 새로운 배열을 반환filter배열의 각 요소 중 주어진 조건을 만족하는 요소들만 포함하는 새로운 배열을 반환reduce배열의 모든 요소를 주어진 클로저를 사용하여 하나의 값으로 합침forEach배열의 각 요소에 대해 특정 작업을 수행.새로운 배열을 반환하지 않고, 각 요소에 대해 작업만 수행flatMap배열의 각 요소에 대해 주어진 변환 함수를 적용하고, 중첩된 배열을 평평하게 펼쳐 하나의 배열로 반환compactMap배열의 각 요소에 대해 주어진 변환 함수를 적용하고, nil 값을 제거한 후 새로운 배열을 반환 2024. 8. 10.
UICollectionViewCompositionalLayout UICollectionViewCompositionalLayout은 iOS 13에서 도입된 강력하고 유연한 레이아웃 시스템으로, 복잡하고 다양한 레이아웃을 손쉽게 구성할 수 있도록 설계되었습니다. 🔴 레이아웃 (Layout)UICollectionViewCompositionalLayout을 사용하여 복잡한 레이아웃을 손쉽게 구현할 수 있음UICollectionViewCompositionalLayout:  여러 섹션이 서로 다른 레이아웃을 가질 수 있는 컬렉션뷰 레이아웃을 구성하는 객체  NSCollectionLayoutSection 객체를 사용하여 섹션 단위로 레이아웃을 정의NSCollectionLayoutSection:  컬렉션뷰의 각 섹션에 대한 레이아웃을 정의  섹션 내의 그룹 및 아이템의 크기, 간.. 2024. 8. 7.
MVVM 곰튀김님 따라하기 Data🔴 서버에서 가져온 데이터 JSON 🔴 사용할 데이터 String 🔴 UtcTimeModelMVC MVVM🟠 서버로 부터 온 데이터 Entity 🟠 Entity를 가져오는 Repository 서버로 부터 온 데이터(Entity)인 UtcTimModel을 전달 🟠 Repository를 사용하는 Service 서버모델(Entity)을 로직에서 사용하는 Model로 바꿔줌필요없는 것 다 빼고 Entity에서 필요한 것만 뽑아서 Model로 변형 🟠 이 앱에서 사용하는 Model 서버에서는 JSON의 String으로 왔지만,Service에서는 Date타입으로 가지고 있음 🟠 ViewModel 화면에서 보여줘야될 값은 String 하나임Logic에서는 Date 타입으로 뭔가를 처리하지만,Vi.. 2024. 7. 14.
동시성프로그래밍 동시성 프로그래밍(concurrency programming)은여러 작업을 동시에 실행하여애플리케이션의 효율성을 높이는 프로그래밍 방식동시성 프로그래밍을 통해 애플리케이션이여러 작업을 병렬로 처리할 수 있게 되어,특히 네트워크 요청, 파일 입출력, 대용량 데이터 처리와 같이시간이 많이 소요되는 작업을 효율적으로 관리할 수 있음동시성 프로그래밍의 주요 개념스레드(Thread)가장 기본적인 동시성 프로그래밍의 단위프로세스 내에서 독립적으로 실행되는 흐름으로, 여러 스레드가 동시에 실행될 수 있음태스크(Task)실행할 작업의 단위스레드는 이러한 태스크들을 동시에 혹은 병렬로 처리하여 프로그램의 실행 속도를 향상시킴동기화(Synchronization)여러 스레드나 태스크가 동시에 같은 데이터에 접근할 때발생할 .. 2024. 5. 24.
프로세스, 쓰레드 프로세스와 멀티프로세스프로세스 (Process)프로세스는 실행 중인 프로그램의 인스턴스를 의미운영체제로부터 시스템 자원을 할당받는 작업의 단위운영체제는 각 프로세스에게 독립된 메모리 공간을 할당하며,프로세스 간의 메모리 공간은 기본적으로 다른 프로세스와 격리특징:독립성: 각 프로세스는 독립적인 메모리 공간을 가지며, 다른 프로세스의 메모리에 직접 접근할 수 없음상호작용: 프로세스 간의 통신은 주로 IPC(Inter-Process Communication) 메커니즘을 통해 이루어짐.예를 들면, 파이프, 소켓, 메시지 큐 등자원 할당: 운영체제는 각 프로세스에 CPU 시간, 메모리, 파일 디스크립터 등의 자원을 할당오버헤드: 프로세스 간의 전환(context switch)에는 비교적 큰 오버헤드가 발생멀티프.. 2024. 5. 23.
순환참조 strong 강한참조인스턴스의 주소값이 변수에 할당될 때,RC가 증가하면 강한참조strong을 별도로 선언하지 않아도, 디폴트값이 strongstong에는 순환참조 문제가 있음..순환참조두개의 객체가 서로가 서로를 참조하고 있는 형태ARC의 단점.. 강한 순환참조 발생 시 영구적으로 메모리가 해제되지 않을 수 있음강한 순환참조 예시 ⬇️class Person { let name: String var apartment: Apartment? init(name: String) { self.name = name } deinit { print("Person Deinit") }}class Apartment { let unit: String.. 2024. 5. 23.
ARC 참조타입과 heap인스턴스, 클로저 등등 참조타입은 자동으로 heap에 할당힙에 할당?Class Dog { var name: String? init(name: String?) } self.name = name }}let choco = Dog(name: "Choco")실제 Dog 인스턴스는 힙에 할당되고,지역변수 choco는 스택에 할당됨스택에 있는 choco는 힙에 있는 인스턴스를 참조하고 있는 형태즉, choco안에는 힙에 할당된 인스턴스의 주소값이 들어가 있음힙영역의 인스턴스는 복사되지 않는다let bori = chocobori는 choco와 같은 힙 영역의 Dog 인스턴스를 가리키고 있음힙은 사용하고 난 후 반드시 메모리 해제를 해줘야 한다스택에 있는 choco와 bori가 함수 종료시점에 사라.. 2024. 5. 23.