๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/swift

[Swift] ํด๋ž˜์Šค(Class)์™€ ๊ตฌ์กฐ์ฒด(Struct)

by hyebin (Helia) 2023. 2. 6.
๋ฐ˜์‘ํ˜•

ํด๋ž˜์Šค(Class)

  • ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์ธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ
  • ํด๋ž˜์Šค ์•ˆ์˜ ๋ณ€์ˆ˜ ํ”„๋กœํผํ‹ฐ(Property)์™€ ํด๋ž˜์Šค ์•ˆ์˜ ํ•จ์ˆ˜ ๋ฉ”์„œ๋“œ(Method)๋กœ ๊ตฌ์„ฑ
class Name {
    var name = "Hyebin" //ํ”„๋กœํผํ‹ฐ
    
    //๋ฉ”์„œ๋“œ
    func my_name() {
        print("my name is \(name)")
    }
}

//์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
let hyebin : Name = Name()

print(hyebin.name)	// Hyebin
hyebin.my_name()	// my name is Hyebin

hyebin.name = "yoo"
hyebin.my_name()	// my name is yoo

 

ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” (Initialization)

  • ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ์ดˆ๊ธฐํ™” ์ฒ˜๋ฆฌ ์ „์šฉ์˜ ๋ฉ”์„œ๋“œ
class Name {
    var name : String
    var age : Int
    
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
    
    func my_name() {
        print("my name is \(name) and \(age) year's old")
    }
}

let name1 : Name = Name(name: "hyebin", age: 25)
let name2 : Name = Name(name: "abc", age: 32)

name1.my_name() //my name is hyebin and 25 year's old
name2.my_name() //my name is abc and 32 year's old

Name ํด๋ž˜์Šค ์•ˆ์˜ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  init() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ดˆ๊ธฐํ™”

self๋Š” ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ, self. ์ด ๋ถ™์€ ๋ณ€์ˆ˜๋“ค์€ ํด๋ž˜์Šค ๋‚ด์˜ ๋ณ€์ˆ˜๋ผ๋Š” ๊ฒƒ

 

ํด๋ž˜์Šค ์ƒ์† (Inheritance)

  • ๊ธฐ์กด์˜ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ด์–ด๋ฐ›์•„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ
  • ์ด๋ฏธ ํŽธ๋ฆฌํ•œ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ธฐ๋Šฅ์„ ๋ง๋ถ™์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ
class Name { //๋ถ€๋ชจ ํด๋ž˜์Šค
    var name = "Hyenbin"
    
    func my_name() {
        print("my name is \(name)")
    }
}

class Email : Name {  //์ž์‹ ํด๋ž˜์Šค
    var email = "123@naver.com"
    
    func myInfo() {
        print("my name is \(name) and my email is \(email)")
    }
}

let hyebin : Email = Email()

print(hyebin.name)  // Hyenbin
print(hyebin.email) //123@naver.com

hyebin.my_name()    //my name is Hyenbin
hyebin.myInfo()     //my name is Hyenbin and my email is 123@naver.com

 

 

๊ตฌ์กฐ์ฒด (Struct)

  • ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’(ํ”„๋กœํผํ‹ฐ)์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋Šฅ(๋ฉ”์„œ๋“œ)์„ ์ œ๊ณตํ•˜๊ณ  ์ด๋ฅผ ์บก์Аํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์Šค์œ„ํ”„ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž…(named type)
  • ๊ตฌ์กฐ์ฒด ์•ˆ์˜ ๋ณ€์ˆ˜ ํ”„๋กœํผํ‹ฐ(Property)์™€ ๊ตฌ์กฐ์ฒด ์•ˆ์˜ ํ•จ์ˆ˜ ๋ฉ”์„œ๋“œ(Method)๋กœ ๊ตฌ์„ฑ
struct Name {
    var name : String = "Hyebin"
    
    func my_name() {
        print("my name is \(name)")
    }
}

var hyebin : Name = Name()

print(hyebin.name)  //Hyebin
hyebin.my_name()    //my name is Hyebin

hyebin.name = "Yoo"
hyebin.my_name()    //my name is Yoo
  • ํด๋ž˜์Šค์™€ ๋‹ฌ๋ฆฌ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์ธ์Šคํ„ด์Šค ์„ ์–ธ ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„ ์–ธ ๊ฐ€๋Šฅ
struct Name {
    var name : String
    
    func my_name() {
        print("my name is \(name)")
    }
}

var hyebin : Name = Name(name: "hyebin")

print(hyebin.name)  //Hyebin
hyebin.my_name()    //my name is Hyebin

 

๊ตฌ์กฐ์ฒด ์ดˆ๊ธฐํ™” (Initialization)

  • ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ ๋„ค์ž„์œผ๋กœ ํ•˜์—ฌ ์Šค์œ„ํ”„ํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์คŒ
  • ์ง์ ‘ init()์„ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ, ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ์ง์ ‘ ์ž‘์„ฑ ์‹œ ์ž๋™ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ์ œ๊ณต ์•ˆ๋จ
struct Name {
    var name : String = "Hyebin"
    var age: Int
    
    func my_name() {
        print("my name is \(name) and \(age) year's old")
    }
    
    init(name: String){
        self.name = name
        self.age = 25
    }
}

var hyebin : Name = Name(name: "hyebin")

print(hyebin.name)  //hyebin
hyebin.my_name()    //my name is hyebin and 25 year's old

 


ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์˜ ๊ณตํ†ต์ 

  • ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง
  • ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ์คŒ
  • ์ดˆ๊ธฐํ™”(init)์„ ์ •์˜ํ•˜์—ฌ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ • ๊ฐ€๋Šฅ
  • ํ™•์žฅ(extension) ๊ฐ€๋Šฅ
  • ํ”„๋กœํ† ์ฝœ(protocol) ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
  •  ํŠน์ • ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ(subscript) ๋ฌธ๋ฒ•์ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
  • ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ (dot) ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉ

ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์˜ ์ฐจ์ด์ 

  • ํด๋ž˜์Šค
    • ์ฐธ์กฐ ํƒ€์ž… (Reference Type) 
      • ์ฐธ์กฐ ํƒ€์ž…: ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌ๋  ๋•Œ ๊ทธ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ๋œ๋‹ค๋Š” ์˜๋ฏธ
      • Call by reference : ํ• ๋‹น ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ ์‹œ์— ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ ๊ฐ’์ด ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.
    • Heap Memory ์˜์—ญ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์†๋„๊ฐ€ ๋А๋ฆผ
    • ๋Ÿฐํƒ€์ž„์— ์ง์ ‘ allocate ํ•˜๋ฉฐ reference counting ์„ ํ†ตํ•ด deallocate๊ฐ€ ํ•„์š”
    • ์ƒ์†์ด ๊ฐ€๋Šฅ
    • ๋Ÿฐํƒ€์ž„์— ํƒ€์ž…์บ์ŠคํŒ…์„ ํ†ตํ•ด ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋™์ž‘์ด ๊ฐ€๋Šฅ
    • deinitializer ๊ฐ€ ์กด์žฌ, ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œ ๊ฐ€๋Šฅ
  • ๊ตฌ์กฐ์ฒด
    • ๊ฐ’ ํƒ€์ž… (Value Type) 
      • ๊ฐ’ ํƒ€์ž…: ํ•จ์ˆ˜์—์„œ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋  ๋•Œ ๊ทธ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์„œ ์ „๋‹ฌ๋œ ๋‹ค๋Š” ์˜๋ฏธ
      • Call by value : ํ• ๋‹น ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ ์‹œ value copy๊ฐ€ ๋ฐœ์ƒ
    • ๊ฐ’ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ณต์œ  ๋ณ€์ˆ˜๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ํ™•๋ฅ ์ด ์ ์Œ
    • Stack Memory ์˜์—ญ์— ํ• ๋‹น๋˜๋ฏ€๋กœ ์†๋„๊ฐ€ ๋น ๋ฆ„
    • Scope based lifetime : ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ธ์ œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น/ํ•ด์ œํ• ์ง€ ์ •ํ™•ํžˆ ์•Œ๊ณ ์žˆ์Œ
    • Data loclity : CPU ์บ์‰ฌ ํžˆํŠธ์œจ์ด ๋†’์Œ
    • ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅ
    • AnyObject๋กœ ํƒ€์ž… ์บ์ŠคํŒ…์ด ๋ถˆ๊ฐ€
๋ฐ˜์‘ํ˜•