Skip to content

Latest commit

Β 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 

README.md

클래슀(Class)와 ꡬ쑰체(Struct)

ν΄λž˜μŠ€μ™€ κ΅¬μ‘°μ²΄λŠ” μ–Έμ œμ“ΈκΉŒ?

  • λ³€μˆ˜μ™€ μƒμˆ˜, κΈ°λ³Έ μžλ£Œν˜•λ§ŒμœΌλ‘œ μ“°κΈ° μ–΄λ ΅κ³  데이터듀이 μ—°κ΄€λ˜μ—ˆμ„λ•Œ
  • 사싀 ν”„λ‘œμ νŠΈμ˜ 사둀 적합성에 따라 선택

클래슀(Class)λž€?

πŸ’‘ ν΄λž˜μŠ€λŠ” 뢕어빡을 찍어낼 수 μžˆλŠ” ν‹€(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을 좜λ ₯ν•œλ‹€.


ꡬ쑰체(Struct)λž€?

πŸ’‘ ꡬ쑰체도 ν΄λž˜μŠ€μ™€ λΉ„μŠ·ν•˜μ§€λ§Œ λ©”λͺ¨λ¦¬ μ €μž₯λ°©μ‹μ˜ 차이가 μžˆλ‹€. κ΅¬μ‘°μ²΄λŠ” κ°’ν˜•μ‹(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) // κ°•μ•„μ§€

ꡬ쑰체가 ν΄λž˜μŠ€λ³΄λ‹€ 가볍기 λ•Œλ¬Έμ— 보톡 더 많이 μ‚¬μš©ν•œλ‹€.


속성(property)

속성은 ꡬ쑰체와 ν΄λž˜μŠ€μ—μ„œ 거의 차이가 μ—†λ‹€.

  • μ €μž₯속성: 값이 μ €μž₯λ˜λŠ” 일반적인 속성이닀.(λ©”λͺ¨λ¦¬ 곡간을 κ°€μ§€λŠ” 속성)
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λ‘œλ„ μ‚¬μš©ν•  수 있음 )


λ©”μ„œλ“œ(method)

  • μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ β†’ κ°€μž₯ 기본적인 λ©”μ„œλ“œ
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