- ν΄λμ€μ μμ
class Person { // Base ν΄λμ€
var id = 0
var name = "μ΄λ¦"
var email = "[email protected]"
}
class Student: Person {
// id, name, email λ³μ μ‘΄μ¬
var studentId = 0
}
class Undergraduate: Person {
// id, name, email λ³μ μ‘΄μ¬
var major = "μ 곡"
}μ€μννΈμμ λ€μ€μμμ λΆκ°λ₯νλ€.
final ν€μλλ₯Ό μ¬μ©νμ¬ μμμ κΈμ§ ν μ μλ€.
- μ¬μ μ(Overriding): ν΄λμ€μ μμμμ μμ ν΄λμ€μ μμ±/λ©μλλ₯Ό μ¬μ μ νλκ²
class Aclass {
func doSomething() {
print("Do something")
}
}
class Bclass: Aclass {
override func doSomething() {
print("Do Something. Do another job")
}
}μμ ν΄λμ€μμ μ‘΄μ¬νλ λ©€λ²λ₯Ό λ³ννλ κ²μ μ¬μ μλΌκ³ νλ©° override ν€μλλ₯Ό ν΅ν΄ νμ ν΄λμ€μμ μμ ν΄λμ€μ λ©μλλ₯Ό μ¬μ μ ν μ μλ€.
- μ μ₯μμ±(λ°μ΄ν°)λ μ¬μ μκ° λΆκ° (νμ§λ§ μλ μ½λμ²λΌ μμΈμ μΌλ‘ μ μ₯μμ±μμ κ³μ° μμ±μΌλ‘μ μ¬μ μλ κ°λ₯νλ€.)
class Aclass {
var aValue = 0 // μ μ₯ μμ±
func doSomething() {
print("Do something")
}
}
class Bclass: Aclass {
override var aValue: Int { // κ³μ°μμ±μΌλ‘ μ¬μ μ
get {
return 1
}
set { // selfκ° μλ superμμ μ£Όμνμ
super.aValue = newValue
}
}
- κ³μ° μμ±μ μ¬μ μ(κ³μ° μμ± β κ³μ°μμ±μΌλ‘μ μ¬μ μ)
class Vehicle {
var currentSpeed = 0.0
var halfSpeed: Double {
get {
return currentSpeed /2
}
set {
currentSpeed = newValue * 2
}
}
}
class Bicycle: Vehicle {
var hasBasket = false
override var currentSpeed: Double {
get {
return super.currentSpeed
}
set {
currentSpeed = newValue
}
}
}κ³μ°μμ±(μμ ν΄λμ€) β κ³μ°μμ±(νμ ν΄λμ€)μ μ¬μ μλ κ°λ₯νλ°, κΈ°λ₯μ μΆμλ‘μ μ¬μ μλ λΆκ°λ₯νλ€.
(μ½κΈ° O, μ°κΈ° Xλ₯Ό μ½κΈ° X, μ°κΈ° Oμ΄λ°μμΌλ‘μ μ¬μ μλ λΆκ°λ₯ν¨)
- μμ±μ(μ΄κΈ°ν λ©μλ) β ꡬ쑰체, ν΄λμ€ λͺ¨λ κ°λ₯
class Color {
let red, green, blue: Double
init() {
red = 0.0
blue = 0.0
green = 0.0
}
init(red: Double, green: Double, blue: Double) {
self.red = red
self.blue = blue
self.green = green
}
}
var color1 = Color()
var color2 = Color(red: 0.9, blue: 0.2, green: 0.1)μμ±μλ μ€λ²λ‘λ©(overloading)μ μ§μνκΈ° λλ¬Έμ μ¬λ¬κ°μ§ λ°©λ²μΌλ‘ μ μν μ μλ€.
- λ©€λ² μμ΄μ¦ μ΄λμ λΌμ΄μ : ꡬ쑰체μμ μλμΌλ‘ μμ±ν΄μ£Όλ νΉλ³ν μμ±μμ΄λ€.
struct Color {
var red: Double
var green: Double
var blue: Double
}
var color = Color(red: 0.9, blue: 0.2, green: 0.1)μ μ½λ μ²λΌ ꡬ쑰체μμλ Memberwise μ΄λμ λΌμ΄μ λ₯Ό μλμΌλ‘ μ 곡νλ€.
- ν΄λμ€μ νΈμ μμ±μ(Convenience) + μμ β κ°λ°μκ° μΈμ€ν΄μ€λ₯Ό μμ±ν λ λ νΈνκ² μμ±ν μ μλλ‘ λμμ£Όλ μμ±μ(ꡬ쑰체μλ μμ)μ΄λ€.
class Aclass {
var x: Int
var y: Int
init(x: Int, y: Int) { // μ§μ μμ±μ
self.x = x
self.y = y
}
convenience init() { // νΈμ μμ±μ
self.init(x: 0, y: 0)
}
}
// μμμ΄ μΌμ΄λλ κ²½μ°
class Bclass: Aclass {
var z: Int
init(x: Int, y: Int, z: Int) {
self.z = z // νμ
super.init(x: x, y: y) // νμ
}
convenience init(z: Int) { // νΈμ μμ±μ
self.init(x: 0, y: 0, z: z)
}
convenience init() { // νΈμ μμ±μ
self.init(z: 0)
}
}μ°λ¦¬κ° κ·Έλμ μ¬μ©ν μμ±μλ μ§μ (Designated)μμ±μμ΄λ©° νΈμ(Convenience) μμ±μλ μ§μ μμ±μλ³΄λ€ μ μ κ°―μμ νλΌλ―Έν°λ‘ λ³΄λ€ νΈλ¦¬νκ² μμ±νκΈ° μν μλΈκ°λ μ μμ±μλΌκ³ μ΄ν΄νλ©΄ λλ€.
λ³΄λ€ λ°λμ§ν ꡬνμ μ€μ§μ μΌλ‘ κ°λ₯ν μ§μ μμ±μμ κ°―μλ₯Ό μ€μ΄κ³ , νΈμ μμ±μμμ μ§μ μμ±μλ₯Ό νΈμΆνλλ‘ νλκ²μ΄ λ°λμ§νλ€.
- μμ±μμ μμκ³Ό μ¬μ μ
class Aclass {
var x = 0
// init() {}
}
// μμμ μ§μ μμ±μ -> init()
class Bclass: Aclass {
var y: Int
// μ ν 1: override μ¬μ μ
override init() { // νμμ μ§μ μμ±μλ μμμ μ§μ μμ±μλ₯Ό νΈμΆν΄μ£Όμ΄μΌ ν¨
self.y = 0
super.init()
}
}
// μμμ μ§μ μμ±μ -> init()
class Cclass: Aclass {
var y: Int
// μ ν 2: override convenience μ¬μ μ + νμ ν΄λΌμ€ μ§μ μμ±μ μ μ
override convenience init() {
self.init(y: 0)
}
init(y: Int) {
self.y = y
super.init()
}
}
class Dclass: Aclass {
var y: Int
// μ ν 3: μμ μ¬μ μ μνκΈ°
init(y: Int) {
self.y = y
super.init()
}
}μμμ μ§μ μμ±μμ νμ¬ λ¨κ³μ μ μ₯μμ±μ κ³ λ €ν΄μ ꡬννλ€.
- μ§μ μμ±μ μλ μμμ μμΈ μν© β μ μ₯μμ±μ κΈ°λ³Έκ° μ€μ
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "[Unnamed]"
}
}
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
// μμ μ§μ μμ±μλ₯Ό νΈμ μμ±μλ‘ μ¬μ μ ν κ²½μ°
override convenience init(name: String) {
self.init(name: name, quantity)
}
// μμ ν΄λΌμ€μ convenience init() { } μλ μμλ¨
}- νΈμ μμ±μ μλμμμ μμΈ μν© β μμ μ§μ μμ±μ λͺ¨λ μμ
class ShoppingListItem: RecipeIngredient {
var purchased = true
var description: String {
var output = "\(quantity) x \(name)"
output += purchased ? "O" : "X"
return output
}
// init(name: String, quantity: Int) μ§μ μμ±μ λͺ¨λ μλ μμ
// override convenience init(name: String) μλμμ
// Food ν΄λΌμ€μ convenience init() { } μλ μμ
}- νμ μμ±μ(Required)
class Aclass {
var x: Int
required init(x: Int) {
self.x = x
}
}
class Bclass: Aclass {
// μλ μμ
}
class Cclass: Aclass {
// λ€λ₯Έ μ§μ μμ±μ ꡬν νκΈ° λλ¬Έμ λ°λμ ν΄λΉ νμ μμ±μλ₯Ό ꡬνν΄μΌνλ€.
init() {
super.init(x: 0)
}
required init(x: Int) {
super.init(x: x)
}
}ν΄λμ€ μμ±μ μμ required ν€μλ μ¬μ©μ νμ μμ±μλ λ°λμ ν΄λΉ νμ μμ±μλ₯Ό ꡬνν΄μΌνλ€. νμ§λ§ μμΈ μ μΌλ‘ λ€λ₯Έ μ§μ μμ±μλ₯Ό ꡬν μνλ©΄ μλμμλλ€.
μ νμ΄ λ§λ€μ΄λμ νλ μμν¬λλ¬Έμ required ν€μλλ₯Ό μμλμΌνλ€.(UIKit λ±λ±..)
- μ€ν¨κ°λ₯ μμ±μ(Failable): μΈμ€ν΄μ€ μμ±μ μ€ν¨ν μλ μλ κ°λ₯μ±μ κ°μ§ μμ±μ
struct Animal {
let species: String
init?(species: String) {
if species.Empty {
return nil // μμ±μ λ΄μμ μ€ν¨κ°λ₯ λΆλΆμ nilμ 리ν΄νλ©΄ λ¨
}
self.species = species
}
}
let a = Animal(species: "Giraffe")
let b = Animal(species: "") // nilμ€ν¨κ° λΆκ°λ₯νκ² λ§λ€μ΄μ, μμ μλ¬κ° λκ³ μ±μ΄ μμ ν κΊΌμ Έλ²λ¦¬λ μν©μ΄ μ¬ μ μκΈ° λλ¬Έμ μ€ν¨ κ°λ₯ μμ±μλ₯Ό μ μ νμ¬ κ·Έμ λ§λ μμΈ μ²λ¦¬λ₯Ό νμ¬ μ΄ μν©μ λ°©μ§ ν μ μλ€.
λν λ²μλ‘ λ°μ‘μλ μ€ν¨ κ°λ₯ μμ±μμ λ²μκ° λ ν¬κΈ° λλ¬Έμ νμμμ μ€ν¨ λΆκ°λ₯ μμ±μλ‘μ μ μκ° κ°λ₯ νλ©° κ·Έ λ°λλ λΆκ°λ₯νλ€.(μ€ν¨ λΆκ°λ₯ β μ€ν¨ κ°λ₯μΌλ‘ μ¬μ μλ X)
- μλ©Έμ(Deinitialers): μΈμ€ν΄μ€κ° λ©λͺ¨λ¦¬μμ ν΄μ λκΈ° μ§μ μ λ¦¬κ° νμν λ΄μ©μ ꡬννλ λ©μλμ΄λ€.
class Aclass {
var x = 0
var y = 0
deinit {
print("μΈμ€ν΄μ€μ μλ©Έ μμ ")
}
}
var: a Aclass? = Aclass()
a = nil // λ©λͺ¨λ¦¬μ μλ aμΈμ€ν΄μ€κ° μ κ±°λ¨μλ©Έμλ μΈμ€ν΄μ€κ° λ©λͺ¨λ¦¬μμ μ κ±°λκΈ° μ§μ μ μλμΌλ‘ νΈμΆλλ€. λν μλ©Έμλ ν΄λμ€λΉ μ΅λ 1κ°λ§ μ μ κ°λ₯νλ€. (ꡬ쑰체μμλ λΆκ°λ₯ν¨)
- μ 체 μ 리
| κ΅¬λΆ | ꡬ쑰체(Struct) | ν΄λμ€(Class) |
|---|---|---|
| 1. μ§μ μμ±μ | ||
| (Designated) | init() { } or init(parameters) { } | |
| β μμ±μ ꡬν μν μ, λ©€λ²μμ΄μ¦ μμ±μ μ 곡 | init() { } or init(parameters) { } | |
| β μμ±μ ꡬν μν μ κΈ°λ³Έμμ±μ μ 곡 | ||
| 2. νΈμ μμ±μ | ||
| (Convenience) | μ§μ x | convenience init(parameters) { } |
| 3. νμ μμ±μ | ||
| (Required) | μ§μ x | required init(parameters) { } |
| 4. μ€ν¨κ°λ₯ μμ±μ | ||
| (Failable) | init?(parameters) { } | |
| init!(parameters) { } | init?(parameters) { } | |
| init!(parameters) { } | ||
| 5. μλ©Έμ | ||
| (Deinitializers) | μ§μ x | deinit(){ } |