ν΄λμ€μ ꡬ쑰체λ μΈμ μΈκΉ?
- λ³μμ μμ, κΈ°λ³Έ μλ£νλ§μΌλ‘ μ°κΈ° μ΄λ ΅κ³ λ°μ΄ν°λ€μ΄ μ°κ΄λμμλ
- μ¬μ€ νλ‘μ νΈμ μ¬λ‘ μ ν©μ±μ λ°λΌ μ ν
π‘ ν΄λμ€λ λΆμ΄λΉ΅μ μ°μ΄λΌ μ μλ ν(frame)μ ν΄λΉνλ©°, μ°μ΄λΈ λΆμ΄λΉ΅μ κ°μ²΄λΌκ³ λΉμ ν μ μλ€.
class Dog {
var name = "κ°μμ§ μ΄λ¦"
var weight = 0.0
func sit() {
print("\(self.name)κ° μμμ΅λλ€."
}
}
var bori = Dog()
bori.name = "보리"
bori.weight = 3.2
var danji = Dog()
danji.name = "λ¨μ§"
danji.weight = 2.2ν΄λμ€λ₯Ό μ΄μ©νμ¬ μμκ°μ κ°μμ§(μΈμ€ν΄μ€)λ₯Ό λ λ§λ¦¬λ μμ±ν΄λ²λ €λ°!
name,weightβ μμ±(property)sit()β λ©μλ(method)
- ν΄λμ€μ μμ±μλ₯Ό μ¬μ©νλ©΄ ν΄λμ€ λ΄μ μμ±λ€μ μ΄κΈ°ν ν΄μ€ μ μλ€.
class Dog {
var name: String
var weight: Double
init(name: String, weight: Double) {
self.name = name
self.weight = weight
}
}
var bori = Dog(name: "보리", weight: 15.0)
var danji = Dog(name: "λ¨μ§", weight: 2.2)μ μ½λλ₯Ό 보면 λ°μ΄ν°λ₯Ό λ£μ΄μ μμ±μλ₯Ό ν΅ν΄ λ°λ‘ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ λ³Ό μ μλ€.
- μμ±μ΄ μ΅μ λ νμ μΈ κ²½μ°
class Dog {
var name: String?
var weight: Double
init(weight: Double) {
self.weight = weight
}
}
var bori = Dog(weight: 15.0)
print(bori.name) // nilκ°μ μ£Όλ©΄ Optional, κ°μ μμ£Όλ©΄ nilμ μΆλ ₯νλ€.
π‘ ꡬ쑰체λ ν΄λμ€μ λΉμ·νμ§λ§ λ©λͺ¨λ¦¬ μ μ₯λ°©μμ μ°¨μ΄κ° μλ€. ꡬ쑰체λ κ°νμ(value type)μ΄λ©° ν΄λμ€λ μ°Έμ‘°νμ(reference type)μ΄λ€. λ°λΌμ ꡬ쑰체μ μΈμ€ν΄μ€ λ°μ΄ν°λ μ€νμ μ μ₯λκ³ ν΄λμ€μ μΈμ€ν΄μ€ λ°μ΄ν°λ νμ μ μ₯λλ€.
- ν΄λμ€μ ꡬ쑰체μ λ©λͺ¨λ¦¬
class Person {
var name = "μ¬λ"
}
struct Animal {
var name = "λλ¬Ό"
}
var p = Person()
var p1 = p // p1κ³Ό pλ κ°μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κ°λ¦¬ν΄
p.name = "μΉμ¬"
print(p1.name) // μΉμ¬
var a = Animal()
var a1 = a // 볡μ¬
a1.name = "κ°μμ§"
print(a.name) // λλ¬Ό
print(a1.name) // κ°μμ§κ΅¬μ‘°μ²΄κ° ν΄λμ€λ³΄λ€ κ°λ³κΈ° λλ¬Έμ λ³΄ν΅ λ λ§μ΄ μ¬μ©νλ€.
μμ±μ ꡬ쑰체μ ν΄λμ€μμ κ±°μ μ°¨μ΄κ° μλ€.
- μ μ₯μμ±: κ°μ΄ μ μ₯λλ μΌλ°μ μΈ μμ±μ΄λ€.(λ©λͺ¨λ¦¬ 곡κ°μ κ°μ§λ μμ±)
struct Bird {
var name: String
var weight: Double
init(name: String, weight: Double) {
self.name = name
self.weight = weight
}
}
var birdA = Bird(name: "μ°Έμ", weight: 2.2) // μ μ₯μμ± μ΄μ©!
var birdB = Bird(name: "λ±μ", weight: 3.2) // μ μ₯μμ± μ΄μ©!μμ±μ κ° μΈμ€ν΄μ€λ κ³ μ μ λ°μ΄ν° μ μ₯곡κ°μ κ°μ§κΈ° λλ¬Έμ λ°μ΄ν°λ₯Ό μ μ₯ν μ μλ€.
- μ§μ°μ μ₯ μμ±(Lazy Stored Properties)
struct Bird {
var name: String
lazy var weight: Double = 0.0 // μ μΈμ κΈ°λ³Έκ°μ λ°λμ μ μ₯ν΄μΌν¨
init(name: String) {
self.name = name
}
}
var birdA = Bird(name: "μ°Έμ")
birdA.weight = 2.2 // μ΄λ λ©λͺ¨λ¦¬ κ³΅κ° ν보μ§μ°μ μ₯ μμ±μ μ²μμλ λ°μ΄ν° μ μ₯곡κ°μ κ°μ§μ§ μμ§λ§ lazyν€μλλ₯Ό κ°μ§ μμ±μ μ κ·Όμ νλ©΄ κ·Έλ μμ±λλ€. λ°λΌμ lazy letμ λΆκ°λ₯νλ€.
- κ³μ° μμ± β κ°μ μ»κΈ° μνλ€λ©΄
getλΈλ‘, μ μ₯νλ €κ³ νλ€λ©΄setλΈλ‘μ μ€ννλ€.
struct Person {
var birth: Int = 0
var age: Int {
get { // getter
return 2021 - birth
}
set { // setter
self.birth = 2021 - newValue
}
}
}
p1.birth = 2000
p1.age // get λΈλ‘ μ€ν
p1.age = 10 // set λΈλ‘ μ€νκ³μ° μμ±μ μ¬μ©νλ©΄ ν΄λμ€ λ΄μ λ°λ‘ get, setλ©μλλ₯Ό ꡬνν΄μ μ°λ κ²λ³΄λ€ κ°λ
μ±λ μ’κ³ μ½λκΈΈμ΄λ μ§§λ€. λν, set λΈλ‘μμ λ§€κ°λ³μλ₯Ό λͺ
μν΄λ λμ§λ§ μ μ½λμ²λΌ μλ΅νκ³ newValueλ₯Ό μΈ μλ μλ€.
- νμ μμ± β μΈμ€ν΄μ€μ μνμ§μκ³ νμ μ체μ μνλ μμ±μ΄λ€.
class Circle {
// μ μ₯ νμ
μμ±
static let pi: Double = 3.14 // piλ μ΄λ€ μΈμ€ν΄μ€μμλ λΆλ³μ΄λ€.
static var count: Int = 0 // μΈμ€ν΄μ€λ₯Ό λͺκ°λ₯Ό μ°μ΄λλμ§ μΈλ μ©λλ‘ μ¬μ©ν μ μλ€.
// μ μ₯ μμ±
var radius: Double // μΈμ€ν΄μ€λ§λ€ λ€λ₯΄κΈ° λλ¬Έμ κ·Έλ₯ μ μ₯μμ±μΌλ‘ μ¬μ©νλ€.
// κ³μ° νμ
μμ±
static var multiPi: Double { // multi piμ κ³μ°λ²μ λͺ¨λ μΈμ€ν΄μ€κ° λμΌνλ€.
return Circle.pi * 2
}
// κ³μ° μμ±
var diameter: Double {
get {
return radius * 2
}
set {
radius = newValue / 2
}
}
init(radius: Double) {
self.radius = radius
Circle.count += 1
}
func getArea() -> Double {
let area = Circle.pi * radius * radius
return area
}
}μ μ½λμ κ°μ΄ pi, count(μ μ₯ μμ±), multiPi(κ³μ° μμ±) λͺ¨λ νμ
μμ±μ΄ λ μ μλ€.
λν μ μ₯ μμ±μ κΈ°λ³Έμ μΌλ‘ lazyμ μ±κ²©μ κ°μ§λ€.
- μμ± κ°μμ(Property Observer) β λ³μκ° λ³ν λ λ³κ²½ λ΄μ©μ λ€λ₯Έκ³³μ λ°μνκ³ μΆμλ νμν¨(μ λ°μ΄νΈ μ²λΌβ¦)
class Profile {
var name: String = "μ΄λ¦"
var statusMessage: String = "κΈ°λ³Έμν λ©μμ§" {
willSet(message) { // λ°λ κ°μ΄ νλΌλ―Έν°λ‘ μ λ¬λ¨
print("λ©μμ§κ° \(statusMessage)μμ \(message)λ‘ λ³κ²½λ μμ μ
λλ€.")
}
// willSet {
// print("λ©μμ§κ° \(statusMessage)μμ \(newValue)λ‘ λ³κ²½λ μμ μ
λλ€.")
// }
didSet(message) { // λ°λκΈ° μ μ κ³Όκ±°κ°μ΄ νλΌλ―Έν°λ‘ μ λ¬λ¨
print("λ©μμ§κ° \(message)μμ \(statusMessage)λ‘ λ³κ²½λμμ΅λλ€.")
}
// didSet {
// print("λ©μμ§κ° \(oldValue)μμ \(statusMessage)λ‘ λ³κ²½λμμ΅λλ€.")
// }
}
}
let p = Profile()
p.statusMessage // κΈ°λ³Έμν λ©μμ§
p.statusMessage = "ν볡ν΄" //λ©μμ§κ° κΈ°λ³Έ μνλ©μμ§μμ ν볡ν΄λ‘ λ³κ²½λ μμ μ
λλ€.μ±κ²©μ λ©μλ ννλ₯Ό λλ©° μ μ₯ μμ±μ κ°μνλ€. willSet()μ μ κ°μ΄ μ μ₯λκΈ° μ΄μ μ νΈμΆλλ©°, didSet()μ μ κ°μ΄ μ μ₯λ μ§ νμ νΈμΆλλ€. μ μ½λλ₯Ό λ³΄κ³ κ°κ°μ νλΌλ―Έν°λ₯Ό μ μνλ©΄μ 보μ.
(κΈ°λ³Έμ μΌλ‘ λ§€κ°λ³μ λμ μ oldValue, newValueλ‘λ μ¬μ©ν μ μμ )
- μΈμ€ν΄μ€ λ©μλ β κ°μ₯ κΈ°λ³Έμ μΈ λ©μλ
class Dog {
var name = "κ°μμ§ μ΄λ¦"
var weight = 0.0
func sit() {
print("\(self.name)κ° μμμ΅λλ€."
}
func layDown() {
print("\(self.name)κ° μλλ Έμ΅λλ€."
}
func trainning() {
self.sit()
self.layDown()
}
func changeName(newName name: String) {
self.name = name
}
}
var bori = Dog()
bori.sit() // λ³΄λ¦¬κ° μμμ΅λλ€.μ μ½λ μ²λΌ self ν€μλλ₯Ό μ¬μ©νμ¬(μλ΅λ κ°λ₯) λ©μλ μμμ λ€λ₯Έ λ©μλλ₯Ό νΈμΆ ν μ μλ€.
- ꡬ쑰체μμ μΈμ€ν΄μ€ λ©μλ
struct Dog {
var name = "κ°μμ§ μ΄λ¦"
var weight = 0.0
func sit() {
print("\(self.name)κ° μμμ΅λλ€."
}
func layDown() {
print("\(self.name)κ° μλλ Έμ΅λλ€."
}
func trainning() {
self.sit()
self.layDown()
}
mutating func changeName(newName name: String) {
self.name = name
}
}
var bori = Dog()
bori.sit() // λ³΄λ¦¬κ° μμμ΅λλ€.ꡬ쑰체μ μΈμ€ν΄μ€ λ©μλ λ΄μμ μμ μ μμ±κ° μμ μ μμΉμ μΌλ‘ λΆκ°νκΈ° λλ¬Έμ(κ°νμ
μ΄κΈ° λλ¬Έμ) mutatingν€μλλ₯Ό μ¬μ©νμ¬ μμ±κ°μ μμ ν μ μλ€.
- λ©μλ μ€λ²λ‘λ©(Overloading)
class Dog {
var name = "κ°μμ§ μ΄λ¦"
var weight = 0.0
func sit() {
print("\(self.name)κ° μμμ΅λλ€."
}
func sit(a: String) {
print("\(a)κ° λ°λ§ μμμ΅λλ€."
}
}
var bori = Dog()
bori.sit() // λ³΄λ¦¬κ° μμμ΅λλ€.
bori.sit(a: "보리") // aκ° λ°λ§ μμμ΅λλ€.μΌλ° ν¨μμ κ°μ΄ μΈμ€ν΄μ€μ λ©μλλ μ€λ²λ‘λ©μ μ§μνλ€.
- νμ λ©μλ(type method)
class Dog {
static var species = "Dog"
var name = "κ°μμ§ μ΄λ¦"
var weight = 0.0
init(name: String, weight: Double) {
self.name = name
self.weight = weight
}
func sit() {
print("\(self.name)κ° μμμ΅λλ€."
}
static func letmeKnow() { // νμ
λ©μλ
print("μ’
μ νμ \(species)μ
λλ€.")
}
}
var bori = Dog()
bori.sit() // λ³΄λ¦¬κ° μμμ΅λλ€.
Dog.letmeKnow() // μ’
μ νμ Dogμ
λλ€.staticν€μλλ‘ μ μΈμ μμν λ μ¬μ μλ λΆκ°νλ€.
- μλΈμ€ν¬λ¦½νΈ(subscripts) β λκ΄νΈλ₯Ό μ¬μ©νλ λ¬Έλ²μ΄λ€. ex)
array[2]
class someData {
var datas = ["Apple", "Swift", "iOS", "Hello"]
subscript(index: Int) -> String {
get {
return datas[index]
}
set {
datas[index] = newValue
}
}
}
var data = someData()
data[0] = "AAA"- νμ μλΈμ€ν¬λ¦½νΈ(Type subscripts)
enum Planet: Int {
case mercuray = 1, venus, earth, mars
static subscript(n: Int) -> Planet {
return Planet(rawValue: n)!
}
}
let mars = Planet[4] //Planet.mars