<TIL>
์ค๋์ ๊ณผ์ ์ ์ถํ ๋ ํจ๊ป ์์ฑํด์ผํ๋ ๊ธฐ์ ์ง๋ฌธ๋ค ์ ๋ฆฌํด์ ์ ์ถํ๋ค.
(๊ฐ์ธ๊ณผ์ ๋!! - ์์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ์ ๋ํด์๋ ์ถํ์ ์ ๋ฆฌ ์์ )
์ดํ ์๋ 7๊ฐ์ง์ ๋ํด์ ๊ณต๋ถํ๋ ์๊ฐ์ ๊ฐ์ก๋ค.
1. Class ์ Struct
2. override์ overload / overriding๊ณผ overloading
3. mutating ํค์๋
4. final
5. Escaping Closure
6. protocol
7. Eqautable
์ด๋์ ๊ฐ ๋ค์๊ฑฐ๋ ์๊ณ ๋ ์์ง๋ง ์ ๋๋ก ์ดํดํ์ง ๋ชปํ ๋ด์ฉ๋ค
ํน์ ๊ณต๋ถํ๋ฉด์ ์ฒ์ ๋ณด๋ ๊ฒ๋ค์ด๋ค.
์ด ๋ฐ์๋ ๋ค์ํ์ง๋ง ์ค๋์ ์์ 7๊ฐ์ง์ ๋ํด์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
Class / Struct
Class์ Struct์ ๋ํด์ ์์๋ณด์!
Class์ Struct๋ ๊ฐ์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OPP)๋ฅผ ์ํ ํ์์์์ด๊ณ ,
์ฝ๋๋ฅผ ์ถ์ํํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
<Class>
โ ์ฐธ์กฐ ํ์
(Reference Type)์ด๋ค.
-> ํ๋์ ๋ณต์ ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ ์ธ์คํด์ค๋ค์ด ํจ๊ป ๊ณต์
โก ์์์ด ๊ฐ๋ฅํ๋ค.
โข ํ๋กํ ์ฝ(Protocol) ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
โฃ extension์ ํ ์ ์๋ค.
โค subscript ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
(subscript: ์ฝ๋ ์
, ๋ฆฌ์คํธ ๊ทธ๋ฆฌ๊ณ ์ํ์ค ๋ฑ์ ๋ณ๋์ ๋ฉ์๋ ์์ด index๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋๋ก ํด์ค.
๋ํ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ์ ์ฉํ ์ ์๊ณ , ์
๋ ฅ ๊ฐ์ ํ์
์ ๋ฐ๋ผ ์ค๋ฒ๋ก๋ฉ๋ ๊ฐ๋ฅํจ.)
โฅ ํ์
์บ์คํ
(Type Casting)์ด ๊ฐ๋ฅํ๋ค.
- as
โฆ ๋ฉ๋ชจ๋ฆฌ๋ heap ์์ญ์ ์ ์ฅ๋๋ค.
โง ===๋ฅผ ํตํด ๋ ์ฐธ์กฐ ํ์
์ ๋น๊ตํ ์ ์๋ค.
(๋ ์ธ์คํด์ค์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ ๊ฐ์์ง ๋น๊ต)
<Struct>
โ ๊ฐ ํ์
(Value Type)์ด๋ค.
-> ์์ ์ ๋ฐ์ดํฐ ๊ฐ์ ๋ณต์ ํ์ฌ ํ ๋นํ ์ธ์คํด์ค๋ง๋ค ์ ๋ํฌํ๊ฒ ๊ฐ์ง
โก ์์์ด ๋ถ๊ฐ๋ฅํ๋ค.
โข ํ๋กํ ์ฝ(Protocol) ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
โฃ ๋ฉ๋ชจ๋ฆฌ๋ Stack ์์ญ์ ์ ์ฅ๋๋ค.
โค ==๋ฅผ ํตํด ๋ ๊ฐ ํ์
์ ๋น๊ตํ ์ ์๋ค.
(๋ ์ธ์คํด์ค๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๋์ง ๋น๊ต)
class Person {
let name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let yeggrrr = Person(name: "YeBao", age: 27) // ์ธ์คํด์ค let
var keen = Person(name: "HyeBao", age: 29)
์ธ์คํด์ค๋ก let์ด ์ ์ธ๋์ด ์์ด๋ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค!
yeggrrr.name = "YeBao2" // error: cannot assign to property -> let ํ๋กํผํฐ
keen.name = "keen2" // error: cannot assign to property -> let ํ๋กํผํฐ
yeggrrr.age = 20
keen.age = 22
struct Car {
let color: String
var owner: String
}
let newCar = Car(color: "Black", owner: "yeggrrr")
var oldCar = Car(color: "White", owner: "keen")
์ธ์คํด์ค๋ก let์ด ์ ์ธ๋์ด ์์ผ๋ฉด ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค!
newCar.owner = "keen" // error: Cannot assign to property: 'newCar' is a 'let' constant -> let ์ธ์คํด์ค
newCar.color = "Red" // Cannot assign to property: 'color' is a 'let' constant -> let ํ๋กํผํฐ
oldCar.owner = "yeggrrr"
oldCar.color = "Blue" // Cannot assign to property: 'color' is a 'let' constant -> let ํ๋กํผํฐ
class & struct ๋ ๋ค ๋ด๋ถ ํ๋กํผํฐ๊ฐ let์ผ๋ก ์ ์ธ๋์ด ์์ผ๋ฉด ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค!
override์ overload /
overriding๊ณผ overloading
- override: ์ฌ์ ์ํ๋ ๊ฒ
- overload: ์ธ์์ ๊ฐฏ์๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ ์ฒ๋ฆฌํ๋ ๊ฒ
- overriding:
-> ์ํผํด๋์ค์์ ์์ํ ๋ฉ์๋, ํ๋กํผํฐ, ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์๋ธ ํด๋์ค์์ ์ฌ์ ์ํ๋ ๊ฒ
-> ์์ ๊ด๊ณ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง๋ง ํจ์ ๋ด์ฉ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ์์ ํด๋์ค์์ ํจ์๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ.
(์์ ํด๋์ค์์๋ ์ค๋ฒ๋ผ์ด๋ฉํ๊ณ ์ ํ๋ ๋ฉ์๋์ ์ด๋ฆ, ๋งค๊ฐ๋ณ์, ๋ฆฌํด ๊ฐ์ด ๋ชจ๋ ๊ฐ์์ผ ํจ)
- overloading:
-> ๋ฆฌํดํ์
, ์ธ์์ ๊ฐฏ์, ์ธ์ํ์
์ด ๋ค๋ฅผ ๊ฒฝ์ฐ ํจ์๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ.
-> ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ ๋ค๋ฅด๊ฒ ์ ์ธ ํ ์ ์๋ ๊ฒ์ ์๋ฏธ.
mutating ํค์๋
swfit์์ ๊ตฌ์กฐ์ฒด(struct)๋ ๊ฐ ํ์
์ ๋ถ๋ณ ๊ฐ์ฒด(immutable object)์ด๋ค.
๊ทธ๋ฌ๋, ๋ฉ์๋ ์์ mutating ํค์๋๋ฅผ ๋ถ์ด๋ฉด
๊ตฌ์กฐ์ฒด(struct)๋ ์ด๊ฑฐํ(enum) ์ธ์คํด์ค์์ ํ๋กํผํฐ๋ฅผ ์์ ํ ์ ์๊ฒ ๋๋ค.
mutating ํค์๋๊ฐ ๋ถ์ ๋ฉ์๋๋ฅผ ์คํํ๊ฒ ๋๋ฉด,
swift๋ ์๋ก์ด ์๋ก์ด ๊ตฌ์กฐ์ฒด(struct)๋ฅผ ์์ฑํ์ฌ ๋ณ๊ฒฝ๋ ํ๋กํผํฐ ๊ฐ์ ํ ๋นํ๊ณ ๋ฐํํ์ฌ
๊ธฐ์กด์ ๊ตฌ์กฐ์ฒด๋ฅผ ๋์ฒดํ๋ค.
mutating์ ์ฐ๋ ์ด์ ๋ ๊ตฌ์กฐ์ฒด(struct)์ ๋ถ๋ณ์ฑ์ ์งํค๊ธฐ ์ํด์์ด๋ค.
struct ExStruct {
var value: Int = 0
mutating func increaseValue(increment: Int) {
self = ExStruct(value: value + increment)
}
}
์ฌ๊ธฐ์์ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค๋ฅผ let์ผ๋ก ์ ์ธํ๋ค๋ฉด?
let constantStruct = ExStruct()
constantStruct.increaseValue(increment: 30) // error : change 'let' to 'var' to make it mutable
error๊ฐ ๋ฐ์ํ๋ค.
๊ทธ ์ด์ ๋ ์์๋ก ์ ์ธ๋ ๊ฐ์ฒด์ ์๋ก์ด ๊ฐ์ ํ ๋นํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
let์ด ์๋ var๋ก ๋ฐ๊พธ์ด ์คํํ๋ฉด, ์ ์์ ์ผ๋ก ์ ์๋ํ ๊ฒ์ด๋ค.
final ํค์๋
final ํค์๋๋ ํด๋น class, method, property๊ฐ ์์์ด ๋ถ๊ฐ๋ฅํ๊ณ ,
ํ์ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉํ ์ ์๋ค๋ ๊ฒ์ ๋ช
์ํ๋ ํค์๋์ด๋ค.
final class ExClass {
var exValue: Int = 0
}
class derivedExampleClass : ExClass { // ERROR: Inheritance from a final class 'ExClass'
}
์ด์ฒ๋ผ final ํค์๋๊ฐ ๋ถ์ ํด๋์ค๋ฅผ ์์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
์ด ํค์๋๋ ์์๋ฐ์ ํด๋์ค ์์ ์ผ๋ถ ํจ์๋ฅผ override ํ์ง ๋ชปํ๊ฒ ํ ๋ ์ฌ์ฉํ๋ค.
Escaping Closure
'Escaping Closure'๋
ํด๋ก์ ๊ฐ ํจ์ ์ธ์๋ก ์ ๋ฌ๋์์ ๋, ํจ์์ ์คํ์ด ์ข
๋ฃ๋ ํ ์คํ๋๋ ํด๋ก์ ๋ฅผ ๋งํ๋ค.
๋ฐ๋๋ก ํจ์์ ์คํ์ด ์ข
๋ฃ๋๊ธฐ ์ ์ ์คํ๋๋
'Non-Escaping Closure'๋ ์๋ค.
.
.
.
(์์๋ ์ถํ์ ์ถ๊ฐํ ์์ )
ํ๋กํ ์ฝ(protocol)
ํ๋กํ ์ฝ์ด ๋ฌด์์ผ๊น?
ํน์ ์ญํ ์ ํ๊ธฐ ์ํ ๋ฉ์๋, ํ๋กํผํฐ, ๊ธฐํ ์๊ตฌ์ฌํญ ๋ฑ์ ์ฒญ์ฌ์ง์ ๋งํ๋ค.
์ฝ๊ฒ ๋งํ๋ฉด,
'๊ท์ฝ, ์ง์ผ์ผํ๋ ์ฝ์'
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๋ณ์, ํจ์ ๋๋ค ๊ตฌํ ๊ฐ๋ฅํ๊ณ ,
๋ณ์์๋ get, set ์ค ์ด๋ค๊ฑฐ ํ ์ง ์ ํํด์ผ ๋๋ค.
(๋จ, set์ ํผ์ ์์ ์ ์์. get ํน์ get set ์ ํ)
(get์ ๋ฐ๊ธฐ๋ง ํ ์ ์์. get set์ ๋ฐ๊ฟ ์ ์์.)
protocol LivingAnimal {
var canTalk: Bool { get set }
func canEat()
func canSleep()
}
์ด๋ ๊ฒ ํ๋กํ ์ฝ์ ์ ์ํ๊ณ ,
struct Cat: LivingAnimal {
}
์ด๋ ๊ฒ ํด๋น ํ๋กํ ์ฝ์ ์์๋ฐ์ผ๋ ค๊ณ ํ๋ฉด,
์ ์ํ ๋๋ก ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ error ๊ฐ ๋ฐ์ํ๋ค.
Fix๋ฅผ ๋๋ฌ์ฃผ๋ฉด
struct Cat: LivingAnimal {
var canTalk: Bool
func canEat() {
}
func canSleep() {
}
}
์์์ ์ ์ํ๋๋ก ์๋์ผ๋ก ๋ฃ์ด์ค๋ค.
์ด์ฒ๋ผ ์์ ๋ฐ๋ ํ๋กํ ์ฝ์ ์๊ตฌ์ฌํญ์ ๋ชจ๋ ๊ตฌํํด์ผ ํ๋ค.
Equatable
์ฐ๋ฆฌ๊ฐ ๋ง๋ ๊ตฌ์กฐ์ฒด, ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋น๊ตํ๋ ค๊ณ ==์ ์ฌ์ฉํ๊ฒ ๋๋ฉด,
์๋ฌ๊ฐ ๋จ๊ฒ ๋๋ค.
์ด๋ ์ด Equatable์ ์ฌ์ฉํ๋ฉด,
ํ์
๋ผ๋ฆฌ ==์ ์ฌ์ฉํ์ฌ ๋น๊ตํ ์ ์๊ฒ ๋๋ค.
์ฆ, Equatable์ ํ์
๋ผ๋ฆฌ ๋น๊ต์ฐ์ฐ์ ํ๊ธฐ ์ํด์ ํ์์ ์ผ๋ก ๊ตฌํํด์ผํ๋ ํ๋กํ ์ฝ์ด๋ค!
Equatable์ ์ค์ํ๊ฒ ๋๋ฉด, ==ํจ์๋ฅผ ์ ์ํ ์ ์๋ค!
(์์ธํ ๋ด์ฉ์ ๊ณต์ ๋ฌธ์ ํ์ธ)
class Person: Equatable {
let name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
// lhs: left hand side / rhs: right hand side
static func == (lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name
&& lhs.age == rhs.age
}
}
let a = Person(name: "bob", age: 16)
let b = Person(name: "bob", age: 16)
a == b // true
let a = Person(name: "bob", age: 8)
let b = Person(name: "bob", age: 16)
a == b // false
'iOS ์ฑ ๊ฐ๋ฐ ์ข ํฉ๋ฐ > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
8์ฃผ์ฐจ_3์ผ์ฐจ_์ฑ ๊ฐ๋ฐ ์ฌํ_๋์์ ์ฑ ๋ง๋ค๊ธฐ_TIL (4) | 2024.05.01 |
---|---|
7์ฃผ์ฐจ_5์ผ์ฐจ_์ฑ ๊ฐ๋ฐ ์๋ จ_Closure(ํด๋ก์ )_๊ฐ์ธ๊ณต๋ถ_TIL (0) | 2024.04.19 |
7์ฃผ์ฐจ_2์ผ์ฐจ_์ฑ ๊ฐ๋ฐ ์๋ จ_ScrollView & Pull to Refresh_TIL (0) | 2024.04.16 |
7์ฃผ์ฐจ_iOS ์ฑ ๊ฐ๋ฐ ์๋ จ_3~4์ผ์ฐจ_Standard๋ฐ AutoLayout_TIL (0) | 2024.04.11 |
7์ฃผ์ฐจ_iOS ์ฑ ๊ฐ๋ฐ ์๋ จ_2์ผ์ฐจ_TIL (0) | 2024.04.09 |