Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift BASIC

[Swift] ๊ธฐ์ดˆ ๋ฌธ๋ฒ• - ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ init / ์†Œ๋ฉธ์ž deinit ์ด๋ž€?

๊ฐ์ž ๐Ÿฅ” 2022. 1. 17. 12:03
๋ฐ˜์‘ํ˜•

 

์•ˆ๋…•ํ•˜์„ธ์š” ๊ฐ์ž์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ดˆ๊ธฐํ™”๊ตฌ๋ฌธ init ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์ด์ „ ๊ฒŒ์‹œ๊ธ€ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์—์„œ ์ดˆ๊ธฐํ™”๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ์ž ๊น ๋‚˜์™”๋Š”๋ฐ, ๊ฐœ๋…์„ ์กฐ๊ธˆ ๋” ์žก์•„๋ณด๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๊ณต๋ถ€๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์‹œ์ž‘!

class ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋œ init ๊ตฌ๋ฌธ

 

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค์˜ 30๊ฐœ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐฐ์šฐ๋Š” iOS์•ฑ๊ฐœ๋ฐœ with Swift ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
 

ํŒจ์ŠคํŠธ์บ ํผ์Šค [์ง์žฅ์ธ ์‹ค๋ฌด๊ต์œก]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์˜์ƒํŽธ์ง‘, UX/UI, ๋งˆ์ผ€ํŒ…, ๋ฐ์ดํ„ฐ ๋ถ„์„, ์—‘์…€๊ฐ•์˜, The RED, ๊ตญ๋น„์ง€์›, ๊ธฐ์—…๊ต์œก, ์„œ๋น„์Šค ์ œ๊ณต.

fastcampus.co.kr

 

์ดˆ๊ธฐํ™” (initialization) ์ด๋ž€?

ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด ๋˜๋Š” ์—ด๊ฑฐํ˜•์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„ ๊ณผ์ •์ด๋‹ค. ์ธ์Šคํ„ด์Šค์˜ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ดˆ๊ธฐํ™” ์ƒ์„ฑ์ž (initializer) ์ด๋‹ค. ์ดˆ๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋งˆ๋‹ค ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ๊ณ  ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์„ค์ •์„ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

struct User {
	var nickname: String = "potato"
    var age: Int = 0
    
    init() {
    	// ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ํ˜ธ์ถœ
	}
}

let user = User() //์ธ์Šคํ„ด์Šค

์œ„ ์ฝ”๋“œ์—์„œ ๋ณด๋ฉด, user ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹คํ–‰๋  ๋•Œ init ๋ธ”๋ก ์•ˆ์—์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ด๋•Œ ํ”„๋กœํผํ‹ฐ๋“ค์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ๊ฑฐ๋‚˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ค์ •ํ•˜๊ธฐ์ „์— ์ •์˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ

์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

init (๋งค๊ฐœ๋ณ€์ˆ˜: ํƒ€์ž…, .... ) {
	// ํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐํ™”
    // ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์‹œ ํ•„์š”ํ•œ ์„ค์ •์„ ํ•ด์ฃผ๋Š” ์ฝ”๋“œ ์ž‘์„ฑ
}

๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„๋งŒ ๋‹ค๋ฅด๊ฒŒ ํ•ด์ฃผ๋ฉด, ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ƒ์„ฑ์ž ๋˜ํ•œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

โ–ถ ์˜ˆ์‹œ

class User() {
	var nickname: String
    var age: Int
    
    // init์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ์ž.
    init(nickname: String, age: Int) {
    	self.nickname = nickname
        self.age = age
	}
}

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
var user = User(nickname: "potato", age: 25)
user.nickname // prints "potato"
user.age // prints 25

 

โ–ถ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์ง€ ์•Š๊ณ  ์ƒ์„ฑ์ž ์•ˆ์—์„œ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋Œ€์ž…ํ•ด์„œ ์ดˆ๊ธฐํ™”๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

class User() {
	var nickname: String
    var age: Int
    
    // init์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ์ž.
    init(nickname: String, age: Int) {
    	self.nickname = nickname
        self.age = age
	}
    
    init(age: Int) {
    	self.nickname = "albert"
        self.age = age
	}
}

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
var user2 = User(age:30)
user2.nickname  //prints "albert"
user.age //prints 30

user2๋ฅผ ์ƒ์„ฑํ• ๋•Œ ์ž๋™์™„์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋œฌ๋‹ค.

์—ฌ๊ธฐ์„œ age๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ž…๋ ฅํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, nickname์€ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ albert๋ฅผ ๊ฐ€์ง„๋‹ค.

์ด๋ ‡๊ฒŒ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ์ƒ์„ฑ์ž ์ด์™ธ์— ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑ์ž๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ƒ์„ฑ์ž์™€ ๋ฐ˜๋Œ€๋˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ๋„ ์กด์žฌํ•œ๋‹ค. ๋ฐ”๋กœ deinit(๋””์ด๋‹ˆ์…œ๋ผ์ด์ €) ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

deinit ์ด๋ž€? (Deinitialization, ์†Œ๋ฉธ์ž)

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ, init๊ณผ ๋ฐ˜๋Œ€๋˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ํ•ด์ œ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋˜๊ณ  ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จํ•˜์—ฌ ์›ํ•˜๋Š” ์ •๋ฆฌ์ž‘์—…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, deinit(๋””์ด๋‹ˆ์…œ๋ผ์ด์ €)๋Š” ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

Swfit๋Š” ํŠน์ • ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ๋” ์ด์ƒ ํ•„์š” ์—†์–ด์งˆ ๋•Œ ์ž๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. Swift๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ Automatic Reference Counting (ARC)๋ผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค. (์ด์ „ ํด๋ž˜์Šค ๊ด€๋ จ ํฌ์ŠคํŒ…์—์„œ ํด๋ž˜์Šค๋Š” ARC ๋ฐฉ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์–ธ๊ธ‰์ด ์žˆ์—ˆ๋‹ค. ์ถ”ํ›„ ์ž์„ธํ•œ ํฌ์ŠคํŒ…์œผ๋กœ ๊ณต๋ถ€ํ•ด๋ณด๋„๋ก ํ•˜์ž.)

์ „ํ˜•์ ์œผ๋กœ ํŠน์ • ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ํ•ด์ œํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ˆ˜๋™์ ์œผ๋กœ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ์ •๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ARC๋Š” ๋”์ด์ƒ ํ•„์š”์—†๋Š” ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด์„œ ์ž๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/ํ•ด์ œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋•Œ๋•Œ๋กœ ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ์„์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿด๋•Œ๋ฅผ ์œ„ํ•ด์„œ ํด๋ž˜์Šค ๋‚ด๋ถ€์—๋Š” ์ตœ๋Œ€ ํ•œ๊ฐœ ๊นŒ์ง€ deinit ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

class User() {
	var nickname: String
    var age: Int
    
    // init์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ์ž.
    init(nickname: String, age: Int) {
    	self.nickname = nickname
        self.age = age
	}
    
    init(age: Int) {
    	self.nickname = "albert"
        self.age = age
	}
    
    deinit() {
    	//์›ํ•˜๋Š” ์ •๋ฆฌ์ž‘์—… ๊ตฌํ˜„
        print("deinit user")
}

var user3: User? = User(age: 23)
user3 = nil
//prints "deinit user."

์™œ deinit user๊ฐ€ ์ถœ๋ ฅ๋ ๊นŒ? Swift๋Š” ๋”์ด์ƒ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด, ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ฉธ์‹œ์ผœ๋ฒ„๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ nil์ด ๋˜๋ฉด, ์ธ์Šคํ„ด์Šค๊ฐ€ ๋”์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋˜์–ด deinit์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค :) 

 

 

๋ฐ˜์‘ํ˜•