Skip to content
Open
197 changes: 197 additions & 0 deletions Fine/250602_Boolean (Day 2).md
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
# 1. [How to store truth with Booleans](https://www.hackingwithswift.com/quick-start/beginners/how-to-store-truth-with-booleans)

* true/false 연산자
```swift
let goodDogs = true
let gameOver = false
```

```swift
let isMultiple = 120.isMultiple(of: 3)
```

* 다른 데이터 타입들과는 달리, Boolean은 사칙연산이 없음.
* ! 'not' 은 있음. true를 false로, false를 true로 바꿈.
```swift
var isAuthenticated = false
isAuthenticated = !isAuthenticated
print(isAuthenticated) // true
isAuthenticated = !isAuthenticated
print(isAuthenticated) // false
```

* toggle() = !
```swift
var gameOver = false
print(gameOver) // false

gameOver.toggle()
print(gameOver) // true
```
---
**Q.** Boolean을 소화하는 방식에는 어떤 것들이 있는지?
A. Boolen은 UI의 상태를 조건에 따라 제어할 때 자주 사용함.

**1. [@State](https://github.com/State)와 조건부 렌더링**
```swift
struct ContentView: View {
@State private var isOn = false // @State는 Boolean을 저장하고 UI와 연결.

var body: some View {
Toggle("Power", isOn: $isOn)

if isOn { // if isOn으로 뷰의 표시 여부를 조건부로 결정.
Text("System is ON")
} else {
Text("System is OFF")
}
}
}
```

**2. 뷰 Modifier에서 Boolean 활용**
```swift
struct ContentView: View {
@State private var isCritical = true

var body: some View {
Text("Caution")
.foregroundColor(isCritical ? .red : .primary)
.bold(isCritical)

- Boolean 값을 통해 .foregroundColor, .bold() 등의 modifier를 동적으로 적용.
```

**3. .opacity, .disabled, .hidden 같은 속성 제어**
```swift
struct ContentView: View {
@State private var isFormValid = true

func submit() {
isFormValid.toggle() // 버튼 누르면 true ↔ false 바뀜
}
var body: some View {
Button("Submit", action: submit)
.disabled(!isFormValid)
.opacity(isFormValid ? 1.0 : 0.5)
}
}
```
- Boolean 값에 따라 사용자의 상호작용을 제한하거나 시각적으로 처리.

**4. Binding을 이용한 하위 뷰와의 상태 공유**
```swift
struct ParentView: View {
@State private var isPresented = false

var body: some View {
ChildView(isPresented: $isPresented)
}
}

struct ChildView: View {
@Binding var isPresented: Bool

var body: some View {
Toggle("Show modal", isOn: $isPresented)
}
}
```
- [@binding](https://github.com/binding)은 상위 뷰의 Boolean 값을 하위 뷰에서 공유 및 조작 가능하게 해줌.

**5. 애니메이션 조건에 사용**
```swift
withAnimation {
isExpanded.toggle()
}
```

**6. sheet, alert, popover 등에서 Boolean로 제어**
```swift
@State private var showSheet = false

var body: some View {
Button("Show Sheet") {
showSheet = true
}
.sheet(isPresented: $showSheet) {
Text("This is a modal sheet")
}
}
```
- isPresented: Binding은 sheet나 alert 등 표현 여부에 직접 사용됨.

**7. toggle() 메서드로 간결한 상태 전환**
```swift
Button("Toggle") {
isActive.toggle()
}
```
---
**Q.** Boolean과 enum은 각각 어떤 때 사용하는가?
A. Boolean: 상태가 단순한 두 가지 값
enum: 상태가 단순한 두 가지 값 이상, enum이 더 명확하고 확장성이 큼.
예: enum AuthState { case loggedOut, loggedIn, loading }

---
**Q.** .toggle() 에서 () 안에 들어갈 수 있는 게 뭐가 있나요?
A. 아무 것도 올 수 없어요.
.toggle()은 매개변수가 없는 메서드입니다.
괄호 안에 값을 넣을 수 없고, 넣으면 컴파일 에러가 납니다.

- [@State](https://github.com/State)나 [@binding](https://github.com/binding)인 Bool에 사용 가능
```swift
@State private var isOn = false

Button("Toggle") {
isOn.toggle() // true ↔︎ false 전환
}
```
- 옵셔널에는 직접 쓸 수 없어요
```swift
var maybeFlag: Bool? = true
maybeFlag?.toggle() // ✅ OK (Optional Chaining => 값이 있으면 'toggle()' 실행, 값이 없으면 아무 일도 안 일어남 => "만약 maybeFlag 안에 값이 있다면 그 값을 바꿔줘"의 의미.)
maybeFlag.toggle() // ❌ Error! Bool?엔 toggle() 없음
```

**Q.** 옵셔널에 쓰려면?
A. 옵셔널을 확실하게 풀어주면 돼요!

**✅ 방법 1: `if let(var)`으로 안전하게 꺼내기**
• 값이 있을 때만 꺼내서 바꾸고, 다시 넣어줌
• 값을 꺼내서 직접 처리하면, 더 복잡한 작업(예: 로그 찍기, 조건 확인 등)을 함께 할 수 있음.
```swift
if var unwrapped = maybeFlag { // 1
unwrapped.toggle() // 2
maybeFlag = unwrapped // 3
}
```

1
• maybeFlag는 옵셔널 Bool로 값이 true, false, nil의 세 가지 중 하나.
• “만약 maybeFlag 안에 값이 있으면, 그걸 꺼내서 unwrapped라는 이름으로 써볼게!”
• 만약 maybeFlag가 nil이면? → 아래 코드는 아예 실행되지 않음!
2
• unwrapped가 true 면 false로, false면 true로 값 변경.
3
• unwrapped를 다시 maybeFlag로 변경. 원래 값인 maybeFlag가 진짜로 바뀌게 됨.

**✅ 방법 2: 옵셔널 체이닝 (?)**
• 값이 있을 때만 알아서 바꿔줌
• 제일 간단하고 안전함!
```swift
maybeFlag?.toggle()
```

**✅ 방법 3: 기본값을 줌**
• 이건 값을 복사해서 바꾸는 거라 maybeFlag 자체는 바뀌지 않음.
```swift
(maybeFlag ?? false).toggle() // ❌ 이렇게 쓰면 바뀌는 건 복사본!
```

**✨ 정리 **
코드 | 작동 방식 | 안전함? | 실제 변수 값이 바뀌나?
maybeFlag?.toggle() | 값이 있을 때만 바꿈 | ✅ | ✅
maybeFlag.toggle() | 옵셔널엔 .toggle() 없음 (에러!) | ❌ | ❌
if let var ... | 값 꺼내서 바꾼 뒤 다시 넣음. | ✅ | ✅
(maybeFlag ?? false).toggle() | 복사된 값만 바뀜, 원본은 그대로 | ✅
80 changes: 80 additions & 0 deletions Fine/250602_String interpolation (Day 2).md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# 2. [How to join strings together](https://www.hackingwithswift.com/quick-start/beginners/how-to-join-strings-together)

* "+" 기호를 사용하거나 string interpolation(문자보간) 사용
## 1. + 기호 사용
```swift
let firstPart = "Hello, "
let secondPart = "world!"
let greeting = firstPart + secondPart
``` // Hello, world!

```swift
let people = "Haters"
let action = "hate"
let lyric = people + " gonna " + action
print(lyric)
```
operator overloading: 한 operator가 어떻게 사용되는가에 따라 다른 의미를 갖는 것.
예) +: string + string => string 연결
정수나, 소수에서 사용되면 값을 더함.

"+" 기호 사용은 비효율적
```swift
let luggageCode = "1" + "2" + "3" + "4" + "5"
```
한 번에 12345로 가지 못함.
"1" + "2" => "12" + "3" => "123" + "4" => "1234" + "5" => "12345"
코드가 끝날 때까지 12, 123, 1234를 모두 가지고 있음 (사용되지 않는데도).

## 2. string interpolation: \()

- 효율적. 문자와 정수/소수 등의 결합이 자유로움.
```swift
let name = "Taylor"
let age = 26
let message = "Hello, my name is \(name) and I'm \(age) years old."
print(message)
```

```swift
let number = 11
let missionMessage = "Apollo " + number + " landed on the moon." // error
```

"+" 기호로 문자를 결합할 때는 문자와 숫자를 결합하지 못함. 숫자를 문자로 바꿔줘야 함.
```swift
let missionMessage = "Apollo " + String(number) + " landed on the moon."
```

string interpolation을 사용하면
```swift
let missionMessage = "Apollo \(number) landed on the moon."
```

사칙연산도 가능
```swift
print("5 x 5 is \(5 * 5)") // 5 x 5 is 25
```

왜 Swift에서는 string interpolation을 사용하나?
사용자로부터 데이터를 받아 처리해야 하기 때문.
```swift
var city = "Cardiff" // 사용자에게 입력받은 값
var message = "Welcome to \(city)!" // 사용자에게 입력받은 값을 처리
```

# 3. [Summary: Simple data](https://www.hackingwithswift.com/quick-start/beginners/summary-simple-data)

* 상수는 let, 변수는 var
* 값의 변화를 의도하지 않는다면 let을 사용해라.

* string은 단문에서 소설 길이까지 가능. 이모지, 전세계언어, count와 윗첨자(uppercased())도 가능.
* string은 시작과 끝에 따옴표로 표시. 줄이 넘어가는 긴 문장은 """ """로 표시.

* integers(정수): 숫자. 양수/음수 가능. isMultiple(of:)
* Double(소수): 100% 정확하지 않으므로 100% 정확해야 하는 곳에는 사용하지 말 것. (예: 돈)
* 사칙연산 "+", "-", "*", "/" => "+="과 같이 간단히 사용 가능.

* Boolean: true/false 값. "!"이나 toggle()로 값 전환 가능.

* String interpolation: 문자, 상수, 변수를 효율적으로 결합할 수 있음.
Loading