All
24 posts
(디자인과 인간심리) 1장 생활용품의 정신병리학

좋은 디자인의 가장 중요한 특성 중 두 가지는 과 인간 중심 디자인 좋은 디자인은 기계로부터 인간으로의 좋은 의사소통이 필요하다. 어떤 행동이 가능하며, 무엇이 일어나고 있으며, 그리고 무엇이 일어날 것인지를 알려 주어야 하는 것이다.

May 29, 2023
UX
In-Out 파라미터

💡 인-아웃 매개변수 (In-Out Parameter) In-Out 파라미터란 ? ! Swift에서 은 함수의 매개변수 선언 앞에 사용되는 키워드로, 해당 매개변수가 함수에 전달된 변수에 대한 참조를 나타냅니다. 이렇게 선언된 매개변수는 함수 내에서 변수의 값을 변경할 수 있고, 변경된 값은 함수를 호출한 곳으로 다시 전달됩니다. 이를 통해 함수 내부에서 변수의 값을 수정하고 그 결과를 함수 외부에서 사용할 수 있습니다. swapValues함수는 inout 매개변수인 a와 b를 사용해 변수 x와 y의 값을 서로 바꿉니다. 함수를 호출할 때 를 사용해 변수의 참조를 전달해야 합니다. 👀 Why ? Swift에서 In-Out 매개변수는 왜 필요한가요 ? ! 일반적으로 함수의 파라미터는 함수 내에서 지역 변수로 취급되며, 함수 내에서 변경된 값은 함수 외부에 영향을 미치지 않습니다. 그러나 in-out 파라미터를 사용하면 할 수 있으며, 변경된 값이 됩니다. 👀 When…

May 26, 2023
Swift
Property wrapper - @ObservedOject, @EnvironmentObject

👀 Property Wrapper란? @ObservedObject와 @EnvironmentObject 모두 @State와 @Binding과 마찬가지로 property wrapper 입니다 ! Property wrapper란 속성 감싸기를 통해 코드를 더욱 간결하고 읽기 쉽게 만드는 데 사용되는 기능입니다. 이를 통해 코드를 더욱 직관적이고 명확하게 작성할 수 있습니다. 💡 @ObservedObject SwiftUI View가 관찰해야 하는 외부 객체가 있을 때 사용됩니다. @ObservedObject는 ObservableObject 프로토콜을 채택하여 SwiftUI View와 상호작용할 수 있도록 만들어집니다. 📝 Docs @ObservedObject 래퍼는 SwiftUI 뷰와 ObservableObject 객체 간의 연결을 설정하는 데 사용됩니다. ObservableObject 객체가 변경될 때마다 뷰는 알림을 받고 업데이트된 값을 사용하여 다시 렌더링됩니다. 이러한…

May 14, 2023
SwiftUI
(MC2) 협업 ? 시작해볼게 !

서론 오랜만에 씁니다. 그렇게 귀찮았던 블로그 회고를 쓰게 하다니 ! 그만큼 오늘 세션은 저에게 엄청난 설렘과 의미? 를 가져다 주었습니다 ! 그동안 회고록을 작성하지 않았던 건 아닙니다. 팀에서 공동 회고록을 작성하고 있는데, 언젠간 ? 아마도 (바라건대) 머지 않아 여기다가 정리해서 올릴 생각입니다. 그래서 오늘 무엇을 했냐면 ? 개발 설계 문서 팀내 코드 협업 규칙 을 만들었습니다 ! 이걸 쓰고 있는 지금도 하군뇨 ! 본론 📝 개발 설계 문서 사실 이건 아직 작성 중입니다. 지금까지 정해진 건 이번 MC2 프로젝트는 을 따른다는 것 ! 입니다 일단 넘어가겠습니다. 💻 코드 협업 규칙 0404팀은 다음과 같은 사이클을 통해 협업합니다. 다음은 토의를 통해 정한 팀내 협업 규칙입니다. 1. 이슈 생성 💡 사전에 협의 하에 분할된 기능과 분업을 받은 사람이 깃허브에서 Issue 를 만듭니다. Issue의 목적은 작업의 시작 알림 , 본인의 작업 진…

May 03, 2023
회고
(SwiftUI) 데이터 바인딩

SwiftUI에서 데이터 바인딩이 필요한 이유 SwiftUI에서 View는 struct(구조체)형태이다. 따라서 구조체이기에 내부에서 프로퍼티를 변경하는 것이 불가능하다. 다음 코드와 같이 A로 정의된 값을 내부에서 B로 변경하려고 할 때, ‘Cannot assign to property: ‘self’is immutable과 같은 오류가 발생한다. 따라서 이와 같은 문제를 해결하기 위해 를 사용한 데이터 바인딩이 필요하다. 💡 @State A property wrapper type that can read and write a value managed by SwiftUI 사용법 변수 앞에 @State 붙이기만 하면 됨 Property Wrapper : 변화가 생기면 해당 변수의 값을 읽거나 새로 쓸 수 있다. State value 값이 변경되면 뷰는 해당 value의 apperance를 무효화 하고 새롭게 body 값을 계산 State 변수값이 변경되면 view를…

April 27, 2023
SwiftUI
열거형 (Enum)

💡 Enum 개념 연관된 항목들을 묶어서 표현할 수 있는 타입 이미 정해놓은 입력 값만 선택해서 사용하고 싶을 떄 유리 -> 정의해 준 항목 외에는 추가 / 수정 불가능 즉, 열거형은 다음과 같은 경우 유용 제한된 선택지를 주고 싶을 떄 정해진 값 외에는 입력받고 싶지 않을 때 예상된 입력 값이 한정되어 있을 떄 💡 열거형을 사용하는 이유 깔끔하고 간결한 코드 다음과 같이 열거형을 사용해 코드를 짤 경우 각 대륙 안에 어떤 국가가 있는지 한눈에 알아볼 수 있다. 코드 작성이 편리 위 두개의 코드는 모두 말레이시아 수도 쿠알라룸푸르를 선언하고 있다. 두 가지의 코드로 수도(KualaLumpur)를 출력 하려고 할 떄, 열거형으로 선언할 경우에는 Capital 입력 시, 자동완성을 통해 어려운 철자를 입력하지 않아도 된다. 코드 실수를 줄일 수 있다. 다음과 같이 모두 같은 실패를 나타내지만, result가 아닌 다른 이름을 사용하면 쓸데없는 코드들이 많아지고 오류가 잦아진…

April 04, 2023
Swift
(SwiftUI) 화면전환을 위한 NavigationLink, NavigationStack

💡 NavigationStack A view that displays a root view and enables you to present additional views over the root view. 다른 뷰로 넘어가는 방식 (화면전환의 방식)을 스택처럼 적용한 것 선언 항상 제거되지 않은 가장 최근에 추가된 View를 표시 RootView는 제거할 수 없다. NavigationStack을 사용하기 위해선 NavigationLink와 .navigationDestination 수정자가 필요 NavigationLink = 제어 뷰 (클릭 시 내가 원하는 View를 나오게 하는 역할) navigationDestination(for:destination:) = Destination View를 NavigationLink에서 제시된 Data 타입과 연결해주는 Method 💡 NavigationLink A view that controls a navigation presnetat…

April 03, 2023
SwiftUI
(SwiftUI) View 사이즈 조절하기 by Frame, Padding, Spacer

💡 SwiftUI에서의 View SwiftUI는 AutoLayout과 달리, 본인이 속한 부모뷰와 본인의 콘텐츠에 동시에 영향을 받아 자동으로 Layout이 결정 UIKit에서 프레임을 설정하는 것과 달리, SwiftUI의 수식어는 뷰를 직접 변경하는 것이 아닌, 원래의 뷰를 수식하는 새로운 뷰를 반환 SwiftUI에서 뷰는 View 프로토콜을 따르는 구조체로 선언되고, 그 View 프로토콜을 따르기 위해서는 body 프로퍼티를 가지고 있어야 하며, 그 안에 View가 선언되어야 한다. 사진과 같이 미리보기를 할 수 있는 이유는 BloadUpload뷰에 대한 PreviewProvider가 설정되어 있기 때문 ⭐️ 하나의 body 프로퍼티는 단 1개의 뷰를 반환하도록 구성 다음 코드에서와 같이 두개의 Text를 입력하더라도 위 사진에서처럼 하나의 뷰에 Text 두개가 나타나는 것이 아닌 Preview가 두개 생기는 것을 볼 수 있다. ⭐️ 따라서 새로운 뷰를 추가하기 위해…

April 01, 2023
SwiftUI
스토리 텔링(Story telling)

👀 (WHY) 스토리 텔링이 중요한 이유 Stories have value 성공적인 스토리 텔링의 예시로 에비앙과 일본 아오모리 현의 행운의 사과를 예시로 들었다. Effective Stories 효과적인 스토리가 가진 특징은 무엇일까? 잘 디자인된 구조를 가진 청중을 끌어들이는 공감할 수 있는 반복 가능한 캐릭터가 등장하는 기존의 가정에 도전하는 👀 (HOW) 어떻게 하면 효과적인 스토리 텔링을 할 수 있을까? Story Beats 스토리 텔링의 구조와 같은 것 Option A Every day Then one day Because of that Ever since then Pixar에서 사용하고 있는 Story beats Option B Situation - who, where, when Complication - conflict, disruption, obstacle, gap Resolution - solution, call to action Result - the n…

March 25, 2023
etc.
assert와 guard

💡 assert 함수 특정v조건을 체크하고 조건이 성립되지 않으면 메시지를 출력할 수 있게 해주는 함수 애플리케이션이 동작 도중에 생성하는 다양한 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 확인하고 빠르게 처리 가능 assert(::file:line:) 함수를 사용 디버깅 모드에서만 동작 배포하는 애플리케이션에서는 제외됨 주로 디버깅 중 조건의 검증을 위해 사용 💡 guard 구문 문법 guard 조건 else {조건이 false일 때 실행될 구문} guard 구문의 핵심은 Early EXIT (빠른 종료) if 조건문과 비교해본다면, if문은 ‘(조건)이면 (code)해라’의 실행구문이지만, guard구문의 경우 ‘(조건)이 아니면 끝내라’ 디버깅 모드뿐만 아니라 어떤 조건에서도 동작 가능 guard의 else 블럭 내부에는 _특정 코드블럭을 종료하는 지시어(return, break, continue, throw 등)_가 꼭 있어야 한다. 단순 조건 판단 후 빠르게 …

March 20, 2023
Swift
MC1(Mini Challenge 1) 기록하기

🍎 아카데미 생활 (2023..03.13 ~ 2023.03.17) Mini challenge1, MC1이 시작되었습니다. 지나고 기록하려고 하니깐 뭐 어떻게 어디서부터 해야되는지 모르겠습니다. 내일(Day6)부턴 매일매일 기록해보겠습니다. (아 그리고 이건 원래 일상 기록하는 블로그 말툰데.. 여기다가 써도 될진 모르겠지만… 그냥 이렇게 하겠습니다…) Prelude를 진행하는 동안 MC1을 얼마나 기다렸는지 모르겠습니다. 매일 다양한 러너들을 만날 수 있어서 좋았기도 했지만, 빨리 팀이 만들어져 어딘가에 소속감을 느끼고 싶다는 마음이 커졌던 것 같습니다. — CBL (Challenged Based Learning) 생전 처음 듣는 학습 방법으로 프로젝트를 하고 있습니다. 하나의 광범위한 주제에 관해 아이디어 발산과 수렴을 반복하며 문제에 대한 답을 찾아나가는 방식인 것 같습니다. 사실 아직 잘 모르겠지만 멘토분들이 이번 MC1은 CBL학습에 적응하기 위한 단계라고 …

March 20, 2023
회고
(SpriteKit) 테트리스 게임 만들기로 알아본 SpriteKit

🎮 SpriteKit 특징 The SpriteKit framework makes it easy to create high-performance, battery-efficient 2D games. With support for custom OpenGL ES shaders and lighting, integration with SceneKit, and advanced new physics effects and animations, you can add force fields, detect collisions, and generate new lighting effects in your games. lower-level 2D 애니메이션을 위해 디자인 OpenGL과 같은 graphics API를 필요로 하지 않음 SceneKit와 함께 사용해 배경이나 전경의 오버레이로 활용 가능 🧩 SpriteKit 구성요소 SKView SpriteKit의 기본 뷰 각 장면 컨텐츠를 렌더링하여 표시하는…

March 19, 2023
iOS
(Xcode) 사라진 info.plist 파일을 찾아서

☠️ 오류 내용 2023-03-12 19:30:15.653050+0900 TetrisGame[8542:367066] [SceneConfiguration] Info.plist contained no UIScene configuration dictionary (looking for configuration named “(no name)“) Info.plist 파일에 UIScene 구성 사전이 없다는 내용이다. 디렉토리를 살펴봤더니 다음과 같이 Info.plist 파일이 모두 사라져 있었다. 검색해본 결과 Xcode13부터 신규 프로젝트 생성 시 info.plist파일이 프로젝트 내부로 들어가 디렉토리 상에서 찾을 수 없다고 하였다. 🔎 해결방법 다음과 같이 PROJECT -> TARGETS -> Info 로 접근 Key에 **‘App Transport Security’**를 추가하고 하위에 **‘Allow Arbitrary Loads’**를 추가한 다음, Value를 **…

March 12, 2023
iOS
클로저 (Closure)

💡 클로저 (Closure) 클로저는 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호{}로 구분된 코드의 블럭을 의미 전역함수(global function)와 중첩함수(nested function)기 모두 클로저에 포함 보통 클로저는 Unnamed Closure를 의미하는 것이지만, Named Closure(함수) 또한 Closure에 포함 Named Closure (함수) 다음 코드와 같이 우리가 일반적으로 func()을 사용해 정의하는 이름이 있는 함수를 의미 단지, 이를 클로저로 부르는 것이 아니라, 그냥 함수로 명칭 Unnamed Closure (익명함수) 보통 Closure의 의미는 다음과 같이 이름을 붙이지 않고 사용하는 함수(익명함수)를 말함 따라서 클로저는 익명이긴 하지만 함수이기에 1급 객체 함수의 특성을 모두 가짐 1급 객체 함수의 특성 변수나 상수에 저장 및 할당 가능 파라미터(객체의 인자)로 전달 가능 함수(객체)에서 retu…

March 06, 2023
Swift
캐시 메모리 (Cashe Memory)

💡 캐시 메모리 (Cashe Memory) 속도가 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리 CPU가 주기억장치에서 저장된 데이터를 읽어올 때, 자주 사용하는 데이터를 캐시 메모리에 저장한 뒤, 다음에 이용할 때 주기억장치가 아닌 캐시 메모리에서 먼저 가져옴으로써 속도를 향상 시킨다. 메인 메모리와 CPU 사이에 위치하며, CPU의 속도에 버금갈 만큼 메모리 계층에서 가장 속도가 빠르지만, 용량이 적고 비싸다는 단점도 있다. 하나의 CPU에는 이러한 캐시 메모리가 2~3개 사용된다.(L1, L2, L3) 이는 속도와 크기에 따라 분류한 것으로, 일반적으로 L1 캐시부터 먼저 사용된다. 듀얼 코어 프로세서의 캐시 메모리 각 코어마다 독립된 L1 캐시 메모리를 가지고, 두 코어가 공유하는 L2 캐시 메모리가 내장된다. L1 캐시는 보통 8~64KB 정도의 용량으로 CPU가 가장 빠르게 접근하게 되며, 여기서 데이터를 찾지 못하면, L2 캐시…

March 05, 2023
CS
CGPoint, CGSize, CGRect

🧠 Why? iOS에서 View를 그리기 위해선 다음과 같은 것들이 필요하다. View의 시작 위치를 알기위한 x,y 좌표 (이 좌표는 iOS 뷰 기준점인 **왼쪽 꼭대기 (0,0)**으로부터 시작) 시작지점부터 어느 크기만큼 그릴 건지에 대한 width, height CGPoint A structure that contains a point in a two-dimensional coordinate system 2차원 좌표계의 점을 포함하는 구조체 다음과 같이 CGFloat 타입의 x, y 값을 가지는 구조체이다. ✨ 따라서 View의 위치를 나타낼 때 CGPoint를 사용한다. 그러나 꼭 View의 위치를 나타낼 때만 쓰는 것이 아니라 x, y 를 나타내야 할 때 언제든 사용 가능하다. CGSize A structure that contains width and height values 너비와 높이 값을 포함하는 구조체 사각형을 의미하는 것이 아님 다음과 같이 CGFl…

February 24, 2023
iOS
객체 지향 프로그래밍 (OOP, Object-Oriented Programming)

🧠 Why? 객체 지향 프로그래밍이 왜 필요할까? 객체 지향 프로그램 이전의 패러다임을 살펴보면 먼저 순차적(비구조적) 프로그래밍과 절차적(구조적)프로그래밍이 있다. 순차적(비구조적) 프로그래밍 순차적으로 흘러가는 프로그래밍 구조를 의미 순차를 중점으로 보는 코드 코드의 흐름, 순서에 기반하는 프로그래밍 비구조적 프로그래밍에서는 주로 goto문을 활용 따라서 규모가 커질수록 goto문이 범람하게 되어 알아보기 어려운 코드가 만들어진다. -> 코드를 단위화할 방법을 모색 절차적(구조적) 프로그래밍 절차적 프로그래밍에서의 절차란, 우리가 평소에 알고있는 절차가 아닌 프로시저를 의미한다. 프로시저란? 반환값(리턴)이 존재하지 않는 함수를 의미 프로시저의 사용으로 goto문이 범람했던 순차적 프로그래밍과 달리 반복 가능성이 있는 부분을 프로시저로 쪼개고 각각의 프로시저안에서 중복되는 부분은 반복문으로 구성 하지만 이런 프로시저는 추상적이라는 문제점을 가지고 있다. 예시 📚 …

February 21, 2023
CS
프로퍼티(Property)와 메서드(Method)

💡 프로퍼티 (Property) ✨ 프로퍼티는 클래스, 구조체, 열거형과 관련한 값 ✨ 프로퍼티의 종류에는 *저장 프로퍼티(Stored Property)*와 *계산된 프로퍼티(Computed Property)*가 있다. 1. 저장 프로퍼티 (Stored Property) 단순히 값을 저장하고 있는 프로퍼티 let을 사용해 상수 또는 var를 사용해 변수로 선언해 사용 가능 클래스와 구조체(열거형 X) 에서만 사용기능 상수 구조체 인스턴스의 저장 프로퍼티 구조체를 상수(let)로 선언하면 구조체 인스턴스의 프로퍼티 변경 불가능 클래스 인스턴스는 let으로 선언하더라도 프로퍼티 변경 가능 지연 저장 프로퍼티 값이 처음으로 사용되기 전에는 계산되지 않는 프로퍼티 lazy 키워드 사용 요소가 끝나기 전에 적절한 값을 알지 못하는 경우에 유용 실제 사용되기 전에는 실행되지 않으므로 인스턴스의 초기화 시점에 복잡한 계산 회피 가능 📝 지연 프로퍼티는 반드시 변수(var)로 선언 상…

February 20, 2023
Swift
구조체(Struct)와 클래스(Class)

✨ 구조체와 클래스는 OOP(Object-Oriented Programming)를 위한 필수 요소로 프로그램의 코드를 추상화하기 위해 사용 ✨ Swift에서는 구조체와 클래스를 위한 별도의 인터페이스와 파일을 만들 필요가 없다. 💡 구조체 (Struct) 정의 인스턴스의 값(프로퍼티)을 저장하거나 기능(메소드)을 제공하고 이를 캡슐화할 수 있는 Swift가 제공하는 타입 Swift에서는 대부분의 타입이 구조체로 이루어져 있다. 대문자 CamelCase 사용 구조체는 값 타입 (Value Type) 함수에서 상수나 변수에 전달될 때 값이 복사되어 전달 구조체에서는 값이 할당되는 순간 복사되기 때문에 picture와 hd는 전혀 다른 인스턴스 struct 이름 {       구현부 } 프로퍼티 및 매서드 🔎 프로퍼티와 매서드에 대한 자세한 설명은 여기 참고 구조체 사용 1. 가변 인스턴스 2. 불변 인스턴스 3. 타입 프로퍼티 및 매서드 구조체 타입 자체에서 사용할 수 있는 프로…

February 17, 2023
Swift
옵셔널(Optional)과 옵셔널 체이닝(Optional Chaining)

💡 옵셔널 (Optional) 값이 있을 수도 있고, 없을 수도 있는 것! 🧠 Why? nil의 가능성을 명시적으로 표현 nil의 가능성을 문서화 하지 않아도 코드만으로 충분히 표현이 가능하므로 문서 / 주석 작성 시간을 절약 가능 전달 받은 값이 옵셔널이 아닐 경우 nil체크를 하지 않더라도 안심하고 사용할 수 있으므로 효율적인 코딩과 예외 상황을 최소화하는 안전한 코딩이 가능 enum + general ❗️ 암시적 추출 옵셔널 (Implicitly Unwrapped Optional) 기존 변수처럼 사용 가능 nil 할당 가능 ❓ 옵셔널 (Optional) nil 할당 가능 기존 변수처럼 사용불가 ❌ 💡 옵셔널 추출 (Optional Unwrapping) 옵셔널 바인딩 (Optional Binding) nil 체크 + 안전한 값 추출 if - let 여러 변수들을 한번에 바인딩 가능 강제 추출 (Force Unwrapping) 옵셔널의 값을 강제로 추출 강제추출 시 값이 없으면 런…

February 17, 2023
Swift
Swift 기초 다지기 (3)

💡 조건문 if-else if condition {      statements }  else if condition {      statements }  else {      statements } condition(조건) 소괄호 생략 가능 ❗️ Swift 조건은 항상 Bool 타입이 들어와야한다. ❗️ switch switch value { case pattern:    code default:    code } 범위 연산자를 활용하면 유용 💭 범위 연산자 닫힌 범위 연산자(Closed Range Operator) a…b a 이상 b 이하 반 닫힌 범위 연산자 (Half-Open Range Operator) a..

February 11, 2023
Swift
Apple Developer Academy @ POSTECH 합격 후기

January 18, 2023
회고
Swift 기초 다지기 (2)

💡 컬렉션 타입 컬렉션 타입 : 여러 값들을 묶어서 하나의 변수로 표현 1. Array Array : 순서가 있는 list 컬렉션 빈 Array 생성 🎯 Int Array 생성 🎯 Double Array 생성 🎯 String Array 생성 🎯 Character Array 생성 ⭐️ let을 사용해 Array 선언 시 Array 원소 변경 불가능 immutableArray.append(4) 또는 immuntableArray.removeAll() 과 같은 명령어 사용 불가능 append Int 타입으로 Array를 생성했기 때문에 Int 타입의 숫자들만 추가할 수 있다. contains Array안에 해당 숫자가 있는지 판별 있으면 true 반환 없으면 false 반환 remove remove(at: 인덱스) Array안에 해당 위치 값 삭제 후 값 반환 removeLast() 마지막 값 삭제 후 값 반환 removeAll() 모두 삭제 count 몇개의 원소가 있는지 확인 2. D…

January 12, 2023
Swift
Swift 기초 다지기 (1)

💡 명명법 Swift 는 대소문자를 구분! 1. Lower Camel Case function, method, variable, constant 2. Upper Camel Case type(class, struct, enum, extension, …) 💡 콘솔로그 1. print 단순 문자열 출력 2. dump 인스턴스의 자세한 설명 (description 프로퍼티) 까지 출력 💡 문자열 보간법 (String interpolation) 프로그램 실행 중 문자열 내에 변수 또는 상수의 실질적인 값을 표현하기 위해 사용 () -> 문자열로 자동 치환 💡 상수와 변수 띄워쓰기 중요! 값의 type이 명확하다면 type 생략 가능 1. 상수 선언 상수 선언 키워드 : let let 이름: 타입 = 값 2. 변수 선언 변수 선언 키워드 : var var 이름: 타입 = 값 💡 데이터 타입 Swift는 다른 데이터 타입 간의 변경이 매우 까다롭기 때문에 반드시 명확한 데이터 타입을 설정…

December 24, 2022
Swift