[swift] 7. struct vs class

8894 단어 swiftiOSiOS

📖 struct과 class 차이

struct복사 , class공유
즉, struct 는 참조하는 값이 바뀌어도 기존의 값에 영향을 미치지 않고 class 는 영향을 미칩니다.

💬 유튜브 첫 페이지를 떠올려봅니다. 한 영상 당 해당되어 있는 영역에 나타내는 정보는 이름, 영상 썸네일, url, 조회수 등이 있습니다. 이렇게 정해져 있는 데이터 종류를 하나하나 관리하기 힘들어, 프로그래밍에서는 하나의 모델 에 묶어두고 관리합니다.

💬 데이터를 모델에 묶는 방식은 두 가지가 있습니다.

  • struct
  • class

📌 struct (구조체)

struct 구조체 이름 { 구조체 내용 }

ex)

struct YoutuberStruct {
    var name : String
    var subscribersCount : Int
}

💬 선언한 구조체 안에 두 가지 정보를 입력할 수 있습니다.

var devJeong = YoutuberStruct(name:"정대리", subscribersCount: 99999)

💬 원하는 정보를 담은 구조체를 devJeong 이라는 이름으로 선언했습니다.

var devJeongClone = devJeong

💬 devJeong 을 복제한 devJeongClone 을 선언합니다.

print("값 넣기 전 devJeongClone.name : \(devJeongClone.name)")

>>> 값 넣기 전 devJeongClone.name : 정대리

💬 devJeongClone 안의 name 값은 devJeong 과 동일합니다.

devJeongClone.name = "하하"

💬 이제, devJeongClone 안의 name 값을 변경해봅시다.

print("값 넣은 후 devJeongClone.name : \(devJeongClone.name)")
print("값 넣은 후 devJeong.name : \(devJeong.name)")

>>> 값 넣은 후 devJeongClone.name : 하하
값 넣은 후 devJeong.name : 정대리 

💬 결과를 확인해보면, devJeongClone 내부의 값이 변했음에도 devJeong 에는 영향을 주지 않았음을 알 수 있습니다.

⭐️ struct는 복제하면 다른 개체 (영향 X)


📌 class

class class 이름 { class 내용 }

ex)

struct YoutuberClass {
    var name : String
    var subscribersCount : Int
    
    // 메모리에 올린다! 시작한다! - 생성자
    // 두 변수에 값이 없음
    // init으로 매개변수를 가진 생성자 메소드를 만들어야
    // 매개변수를 넣어서 그 값을 가진 객체(object)를 만들 수 있다.
    
    init(name:String, subscribersCount: Int) {
        self.name = name // 외부에서 넘어오는 name 값을 넣을게요
        self.subscribersCount = subscribersCount
    }
}

💬 선언한 class 안에 두 가지 정보를 입력할 수 있습니다. (구조체와 달리 생성자가 있음을 확인)

var jeongDaeRi = YoutuberClass(name:"정대리", subscribersCount: 99999)

var jeongDaeRiClone = jeongDaeRi

print("값 넣기 전 jeongDaeRiClone.name : \(jeongDaeRiClone.name)")

>>> 값 넣기 전 jeongDaeRiClone.name : 정대리

💬 위에서와 같은 방식으로 jeongDaeRi 라는 class를 만들고 jeongDaeRiClone 안에 복제합니다.

jeongDaeRiClone.name = "바보"

print("값 넣은 후 jeongDaeRiClone.name : \(jeongDaeRiClone.name)")

print("값 넣은 후 jeongDaeRi.name : \(jeongDaeRi.name)")

>>> 값 넣은 후 jeongDaeRiClone.name : 바보
값 넣은 후 jeongDaeRi.name : 바보

💬 struct와 달리, 복제한 class의 한 값에 참조해 변경하였을 때 기존 class의 값에도 영향을 미침을 깨달을 수 있습니다.

⭐️ class 는 서로 연결이 되어있습니다.
본따서 똑같은 걸 만들고 한 쪽을 훼손하면, 다른 한 쪽도 훼손되며
내가 수정한 내용을 다른 사람들이 다 볼 수 있습니다.
같은 메모리 공간을 공유하고 있기 때문입니다.

💬 유튜브에서 내 영상의 정보를 수정하면, 다른 사람에게 똑같이 보여진다는 점을 생각하면 이해가 편합니다.


좋은 웹페이지 즐겨찾기