Deep_Dev
article thumbnail

 

μΈμŠ€ν„΄μŠ€ 생성 및 μ†Œλ©Έ

μΈμŠ€ν„°λ₯Ό μƒμ„±ν•˜λŠ” 방법과 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μ†Œλ©Έν•  λ•Œ μ§„ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•΄μ„œ..

 

μΈμŠ€ν„΄μŠ€ 생성

μ΄ˆκΈ°ν™” κ³Όμ • = μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•  μ€€λΉ„λ₯Ό ν•˜κΈ° μœ„ν•˜μ—¬ μ €μž₯ ν”„λ‘œνΌν‹°μ˜ μ΄ˆκΉƒκ°’μ„ μ„€μ •ν•˜λŠ” 일

  • μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μ •μ˜ν•˜λ©΄ μ΄ˆκΈ°ν™” κ³Όμ • 직접 κ΅¬ν˜„ κ°€λŠ₯ ( μ΄λ‹ˆμ…œλΌμ΄μ €μ˜ 역할은 κ·Έμ € μΈμŠ€ν„΄μŠ€μ˜ 첫 μ‚¬μš©μ„ μœ„ν•΄ μ΄ˆκΈ°ν™”ν•˜λŠ” 것뿐 )
  • init ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ΄λ‹ˆμ…œλΌμ΄μ € λ§€μ„œλ“œμž„μ„ ν‘œν˜„

 

클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ˜ 기본적인 ν˜•νƒœμ˜ μ΄λ‹ˆμ…œλΌμ΄μ €

Class SomeCLass{
	init(){
    	// μ΄ˆκΈ°ν™”ν•  λ•Œ ν•„μš”ν•œ μ½”λ“œ
    }
}

struct SomeStruct{
	init(){
    	// μ΄ˆκΈ°ν™”ν•  λ•Œ ν•„μš”ν•œ μ½”λ“œ
    }
}

enum SomeEnum{
	case someCase
    
    init(){
    	// μ—΄κ±°ν˜•μ€ μ΄ˆκΈ°ν™”ν•  λ•Œ λ°˜λ“œμ‹œ case쀑 ν•˜λ‚˜κ°€ λ˜μ–΄μ•Ό ν•œλ‹€.
        self = .someCase
        // μ΄ˆκΈ°ν™”ν•  λ•Œ ν•„μš”ν•œ μ½”λ“œ
    }
}

 

 

ν”„λ‘œνΌν‹° κΈ°λ³Έκ°’

ꡬ쑰체와 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” 처음 생성할 λ•Œ μ˜΅μ…”λ„ μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μ œμ™Έν•œ λͺ¨λ“  μ €μž₯ ν”„λ‘œνΌν‹°μ— μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν•΄μ•Ό 함

ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜μ‹œ, ν”„λ‘œνΌν‹° 기본값을 ν• λ‹Ήν•˜λ©΄ μ΄λ‹ˆμ…œλΌμ΄μ €μ—μ„œ λ”°λ‘œ μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν•˜μ§€ μ•Šμ•„λ„ ν”„λ‘œνΌν‹° κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”

 

Area ꡬ쑰체와 μ΄λ‹ˆμ…œλΌμ΄μ €

struct Area{
	var squareMeter: Double
    
    init() {
    	squareMeter = 0.0 // squareMeter의 μ΄ˆκΉƒκ°’ ν• λ‹Ή
    }
}

let room: Area = Area()
print(room.squareMeter) // 0.0

 Area κ΅¬μ‘°μ²΄λŠ” squareMeter λΌλŠ” Double νƒ€μž…μ˜ μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό 가지고 μžˆλ‹€. init μ΄λ‹ˆμ…œλΌμ΄μ €λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λ©°

squareMeter의 μ΄ˆκΈ°κ°’μ€ 0.0이 λœλ‹€.

 

μ•žμ„œ μ„€λͺ…ν–ˆλ“―이 μ΄λ‹ˆμ…œλΌμ΄μ €λ‘œ μ €μž₯ ν”„λ‘œνΌν‹°μ— μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜λŠ” 방법도 μžˆμ§€λ§Œ, ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•  λ•Œ ν”„λ‘œνΌν‹°μ— 기본값을 ν• λ‹Ήν•˜λŠ” 방식을 μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

 

ν”„λ‘œνΌν‹° κΈ°λ³Έκ°’ 지정

struct Area{
	var squareMeter: Double = 0.0 // ν”„λ‘œνΌν‹° κΈ°λ³Έκ°’ ν• λ‹Ή
}

let room: Area = Area()
print(room.squareMeter) // 0.0

 

μ΄λ‹ˆμ…œλΌμ΄μ € λ§€κ°œλ³€μˆ˜

μ΄λ‹ˆμ…œλΌμ΄μ €λ„ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

즉, μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 과정에 ν•„μš”ν•œ 값을 전달받을 수 μžˆλ‹€.

 

μ΄λ‹ˆμ…œλΌμ΄μ € λ§€κ°œλ³€μˆ˜ 

srtuct Area{
	var squareMeter : Double
    
    init(fromPy py: Double) {	// 첫번째 μ΄λ‹ˆμ…œλΌμ΄μ €
    	squareMeter = py * 3.3058 
    }
    
    init(fromSquareMeter squareMeter: Double) { // λ‘λ²ˆμ§Έ μ΄λ‹ˆμ…œλΌμ΄μ €
    	self.squareMeter = squareMeter
    }
    
    init(value: Double){	// μ„Έλ²ˆμ§Έ μ΄λ‹ˆμ…œλΌμ΄μ €
    	squareMeter = value
    }
    
    init(_value : Double) {    // λ„€λ²ˆμ§Έ μ΄λ‹ˆμ…œλΌμ΄μ €	
    	squareMeter = value
    }
}

let roomOne: Area = Area(fromPy: 15.0)
print(roomOne.squareMeter) // 49.587

let roomTwo: Area = Area(fromSquareMeter : 33.06)
print(roomTwo.squareMeter) // 33.06

let roomThree: Area = Area(value: 30.0)
let roomFour: Area = Area(55.0)

Area() // 였λ₯˜ λ°œμƒ

 

 

μ˜΅μ…”λ„ ν”„λ‘œνΌν‹° νƒ€μž…

μ΄ˆκΈ°ν™” κ³Όμ •μ—μ„œ 값을 μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ”, 즉 μΈμŠ€ν„΄μŠ€κ°€ μ‚¬μš©λ˜λŠ” λ™μ•ˆμ— 값을 κΌ­ 갖지 μ•Šμ•„λ„ λ˜λŠ” 

μ €μž₯ ν”„λ‘œνΌν‹°κ°€ μžˆλ‹€λ©΄ ν•΄λ‹Ή ν”„λ‘œνΌν‹°λ₯Ό μ˜΅μ…”λ„λ‘œ μ„ μ–Έν•  수 μžˆλ‹€.

 

μ˜΅μ…”λ„λ‘œ μ„ μ–Έν•œ μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μ΄ˆκΈ°ν™” κ³Όμ •μ—μ„œ 값을 할당해주지 μ•ŠλŠ”λ‹€λ©΄ μžλ™μœΌλ‘œ nil 이 ν• λ‹Ή λœλ‹€.

 

Person 클래슀

class Person{
	var name: String
    var age: Int?
    
    init(name: String){
    	self.name = name
    }
}

let yagom: Person = Person(name: "yagom")
print(yagom.name) // "yagom"
print(yagom.age) // nil

yagom.age = 99
print(yagom.age) // 99

yagom.name = "Eric"
print(yagom.name) // "Eric"

 

μƒμˆ˜ ν”„λ‘œνΌν‹°

μƒμˆ˜λ‘œ μ„ μ–Έλœ μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” κ³Όμ •μ—μ„œλ§Œ 값을 ν• λ‹Ήν•  수 있으며, 처음 ν• λ‹Ήλœ μ΄ν›„λ‘œλŠ” 값을 λ³€κ²½ν•  수 μ—†λ‹€.

 

🍎 μƒμˆ˜ ν”„λ‘œνΌν‹°μ™€ 약속
클래슀 μΈμŠ€ν„΄μŠ€μ˜ μƒμˆ˜ ν”„λ‘œνΌν‹°λŠ” ν”„λ‘œνΌν‹°κ°€ μ •μ˜λœ ν΄λž˜μŠ€μ—μ„œλ§Œ μ΄ˆκΈ°ν™”ν•  수 μžˆλ‹€.
ν•΄λ‹Ή 클래슀λ₯Ό 상속받은 μžμ‹ν΄λž˜μŠ€μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €μ—μ„œλŠ” λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μƒμˆ˜ ν”„λ‘œνΌν‹° 값을 μ΄ˆκΈ°ν™”ν•  수 μ—†λ‹€.

μƒμˆ˜ ν”„λ‘œνΌν‹°μ˜ μ΄ˆκΈ°ν™”

class Person {
	let name: String
    var age: Int?
    
    init(name: String) {
    	self.name = name
    }
}

let yagom: Person = Person(name : "yagom")
yagom.name = "Eric" // 였λ₯˜ λ°œμƒ

 

κΈ°λ³Έ μ΄λ‹ˆμ…œλΌμ΄μ €μ™€ λ©€λ²„μ™€μ΄μ¦ˆ μ΄λ‹ˆμ…œλΌμ΄μ €

κΈ°λ³Έ μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” ν”„λ‘œνΌν‹° κΈ°λ³Έκ°’μœΌλ‘œ ν”„λ‘œνΌν‹°λ₯Ό μ΄ˆκΈ°ν™”ν•΄μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€. 즉, κΈ°λ³Έ μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” μ €μž₯ ν”„λ‘œνΌν‹°μ˜ 기본값이 λͺ¨λ‘ μ§€μ •λ˜μ–΄ 있고, λ™μ‹œμ— μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ€ μƒνƒœμ—μ„œ μ œκ³΅λœλ‹€.

 

κ΅¬μ‘°μ²΄λŠ” μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œνΌν‹°μ˜ μ΄λ¦„μœΌλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό κ°–λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €μΈ λ©€λ²„μ™€μ΄μ¦ˆ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 기본으둜 μ œκ³΅ν•œλ‹€.

 

μ΄ˆκΈ°ν™” μœ„μž„

ꡬ쑰체와 μ—΄κ±°ν˜•μ€ μ½”λ“œμ˜ 쀑볡을 ν”Όν•˜κΈ° μœ„ν•˜μ—¬ μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ λ‹€λ₯Έ μ΄λ‹ˆμ…œλΌμ΄μ €μ—κ²Œ 일뢀 μ΄ˆκΈ°ν™”λ₯Ό μœ„νž˜ν•˜λŠ” μ΄ˆκΈ°ν™” μœ„μž„μ„ κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ, ν΄λž˜μŠ€λŠ” 상속을 μ§€μ›ν•˜λŠ” 터라 κ°„λ‹¨ν•œ μ΄ˆκΈ°ν™” μœ„μž„λ„ ν•  수 μ—†λ‹€.

 

κ°’ νƒ€μž…μ—μ„œ μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ λ‹€λ₯Έ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό ν˜ΈμΆœν•˜λ €λ©΄ self.init 을 μ‚¬μš©ν•œλ‹€.

 

μ‹€νŒ¨ κ°€λŠ₯ν•œ μ΄λ‹ˆμ…œλΌμ΄μ €

μ‹€νŒ¨ κ°€λŠ₯성을 λ‚΄ν¬ν•œ μ΄λ‹ˆμ…œλΌμ΄μ €λ‘œμ¨, μ‹€νŒ¨ν–ˆμ„λ•Œ nil 을 λ°˜ν™˜ν•΄μ£Όλ―€λ‘œ λ°˜ν™˜ νƒ€μž…μ΄ μ˜΅μ…”λ„λ‘œ μ§€μ •λœλ‹€.

λ”°λΌμ„œ μ‹€νŒ¨ κ°€λŠ₯ν•œ μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” init λŒ€μ‹ μ— init? ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.


μ΄λ‹ˆμ…œλΌμ΄μ €μ˜ λ§€κ°œλ³€μˆ˜

μ‹€νŒ¨ν•˜μ§€ μ•Šμ€ μ΄λ‹ˆμ…œλΌμ΄μ €μ™€ μ‹€νŒ¨ κ°€λŠ₯ν•œ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 같은 이름과 같은 λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ 갖도둝 μ •μ˜ν•  수 μ—†λ‹€.

μ‹€νŒ¨ κ°€λŠ₯ν•œ μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” μ‹€μ œλ‘œ νŠΉμ • 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄ˆκΈ°ν™”λ₯Ό μ‹€νŒ¨ν–ˆμ„ λ•ŒλŠ” return nil을
λ°˜λŒ€λ‘œ μ΄ˆκΈ°ν™”μ— μ„±κ³΅ν–ˆμ„ λ•ŒλŠ” return 을 적어 μ΄ˆκΈ°ν™”μ˜ 성곡과 μ‹€νŒ¨λ₯Ό ν‘œν˜„ν•  뿐, μ‹€μ œ 값을 λ°˜ν™˜ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

 

ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ ν”„λ‘œνΌν‹° κΈ°λ³Έκ°’ μ„€μ •

μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œ ν•¨μˆ˜λ‚˜ ν΄λ‘œμ €κ°€ ν˜ΈμΆœλ˜λ©΄μ„œ μ—°μ‚° 결과값을 ν”„λ‘œνΌν‹° κΈ°λ³Έκ°’μœΌλ‘œ μ œκ³΅ν•΄μ€€λ‹€.

λ•Œλ¬Έμ— ν΄λ‘œμ €λ‚˜ ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μ€ ν”„λ‘œνΌν‹°μ˜ νƒ€μž…κ³Ό μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.

 

즉, ν΄λ‘œμ € λ‚΄λΆ€μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€μ˜ λ‹€λ₯Έ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°μ‚°ν•  μˆ˜λŠ” μ—†λ‹€λŠ” 것이닀. λ‹€λ₯Έ ν”„λ‘œνΌν‹°μ— 기본값이 μžˆλ‹€κ³  해도 μ•ˆλœλ‹€. λ˜ν•œ, ν΄λ‘œμ € λ‚΄λΆ€μ—μ„œ self ν”„λ‘œνΌν‹°λ„ μ‚¬μš©ν•  수 μ—†μœΌλ©°, μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  μˆ˜λ„ μ—†λ‹€.

 

ν΄λ‘œμ €λ₯Ό ν†΅ν•œ ν”„λ‘œνΌν‹° κΈ°λ³Έκ°’ μ„€μ •

class SomeClass {
	let someProperty: SomeType = {
    	// μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ‚¬μš©μž μ •μ˜ 연산을 ν†΅ν•œ ν›„ λ°˜ν™˜ν•΄μ€€λ‹€.
        // λ°˜ν™˜λ˜λŠ” κ°’μ˜ νƒ€μž…μ€ SomeTypeκ³Ό 같은 νƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€.
        return someValue()
    }()
}

ν΄λ‘œμ € 뒀에 μ†Œκ΄„ν˜Έκ°€ 뢙은 μ΄μœ λŠ” ν΄λ‘œμ €λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.

ν΄λ‘œμ € 뒀에 μ†Œκ΄„ν˜Έκ°€ λΆ™μ–΄ ν΄λ‘œμ €λ₯Ό μ‹€ν–‰ν•œ 결과값은 ν”„λ‘œνΌν‹°μ˜ 기본값이 λœλ‹€.

 

 

μΈμŠ€ν„΄μŠ€ μ†Œλ©Έ

클래슀의 μΈμŠ€ν„΄μŠ€λŠ” λ””μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€. ( μ΄λ‹ˆμ…œλΌμ΄μ €μ™€ λ°˜λŒ€ μ—­ν•  )

즉, λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜κΈ° 직전 클래슀 μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨ν•˜μ—¬ μ›ν•˜λŠ” 정리 μž‘μ—…μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

πŸ’‘ λ””μ΄λ‹ˆμ…œλΌμ΄μ €

  • λ””μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ λ©”λͺ¨λ¦¬μ—μ„œ μ†Œλ©Έλ˜κΈ° λ°”λ‘œ 직전에 ν˜ΈμΆœλœλ‹€. 
  • deinit ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜λ©΄ μžλ™μœΌλ‘œ ν˜ΈμΆœλœλ‹€.
  • 클래슀의 μΈμŠ€ν„΄μŠ€μ—μ„œλ§Œ κ΅¬ν˜„ν•  수 μžˆλ‹€
  • ν΄λž˜μŠ€μ—λŠ” λ””μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 단 ν•˜λ‚˜λ§Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.
  • λ§€κ°œλ³€μˆ˜λ₯Ό 갖지 μ•ŠμœΌλ©°, μ†Œκ΄„ν˜Έλ„ 적어주지 μ•ŠλŠ”λ‹€. 또 μžλ™μœΌλ‘œ 호좜되기 λ•Œλ¬Έμ— λ³„λ„μ˜ μ½”λ“œλ‘œ ν˜ΈμΆœν•  μˆ˜λ„ μ—†λ‹€.

λ””μ΄λ‹ˆμ…œλΌμ΄μ €μ˜ κ΅¬ν˜„

class SomeClass{
	deinit(){
    	print("Instance will be deallocated immediately")
    }
}

var instance: SomeClass? = SomeClass()
instance = nil // Instance will be deallocated immediately"