Skip to content

Latest commit

Β 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 

README.md

클래슀의 상속(Inheritance)κ³Ό μ΄ˆκΈ°ν™”(Initialization)

클래슀의 상속과 μž¬μ •μ˜

  • 클래슀의 상속
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(){ }