ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift :: 구조체와 클래스 차이 (struct VS class)
    Swift 2019. 2. 5. 17:20

    안녕하세요! 상어입니다.

    오늘은 swift를 배운다 하면 필수적으로 알아야 하는 개념인

    struct와 class에 대해 써볼까합니다 :-)


    struct와 class는 같다면 같고.. 다르다면 참 다른 아이들인데, 공통점과 차이점을 보시면 쉽게 이해가 되실거에요!


    공통점

    • 프로퍼티 정의가 가능합니다.
    • 메소드 정의가 가능합니다.
    • initializer 정의가 가능합니다.
    • extension이 가능합니다.
    • protocol이 가능합니다.

    차이점
    • 구조체 value type, 클래스는 reference type 입니다.
    • 구조체는 상속이 불가능합니다.
    • 구조체에서는 AnyObject로 타입캐스팅이 불가능합니다.
    • 구조체는 생성자를 구현하지 않을 시 기본 initializer를 사용할 수 있습니다.
    • 클래스는 reference counting으로 메모리 관리가 가능합니다.

    네 그렇다고 합니다.
    사실 아무리 이렇게 봐도 직접 해보지 않으면 전 잘 모르겠더라구욤 헤헤헿
    그래서 바로 예제로!!!

    struct UserData {
        var name: String
        var age: Int
    
        mutating func updateUser(_ name: String, _ age: Int) {
            self.name = name
            self.age = age
            
            print("이름 : \(name), 나이 : \(age)")
        }
    }
    
    var shark = UserData(name: "상어", age: 16)
    print("이름 : \(shark.name), 나이 : \(shark.age)")
    // 이름 : 상어, 나이 : 16
    
    var candy = shark
    candy.name = "캔디"
    candy.age = 30
    
    print("이름 : \(shark.name), 나이 : \(shark.age)")
    // 이름 : 상어, 나이 : 16
    
    print("이름 : \(candy.name), 나이 : \(candy.age)")
    // 이름 : 캔디, 나이 : 30
    
    shark.updateUser("띠용", 33)
    // 이름 : 띠용, 나이 : 33
    
    struct의 핵심은 값 복사입니다. 
    그래서 candy에 shark의 값을 복사하고 candy의 속성을 변경해도 shark의 속성은 변경되지 않습니다.

    하지만, 
    값 복사이면서 copy-on-write이기 때문에 대입할 때 복사가 일어나는 것이 아닌,
    수정이 발생할 때 값이 복사됩니다.
    그렇기 때문에

    candy.name = "캔디"
    이 부분에서 실제로 복사가 일어나는 것이지요옹 ><!

    그리고,
    struct안 updateUser메서드 앞에 mutating해주지 않는다면 아래와 같은 에러메세지가 출력됩니다.
    왜냐면 구조체는 value type이기 때문에 method안에서 property변경이 불가능하답니다.
    그래서 mutating을 붙이면 해당 객체가 다시 생성되면서 변경이 가능하게 됩니다.


    mutating func updateUser(_ name: String, _ age: Int) { self.name = name

    self.age = age print("이름 : \(name), 나이 : \(age)") }


    다음 예제는 class에 관련된 예제입니다.

    이번 예제에서는 struct와 class의 차이점을 보여주기 위한 예제이기 때문에 차이점에 주모오오옥!


    class Phone { var name: String var color: String // struct와 달리 class는 이니셜라이즈를 지정해야합니다. init(name: String, color: String) { self.name = name self.color = color } func updatePhone(name: String, color: String) { self.name = name self.color = color print("폰 : \(name), 색상 : \(color)") } } let iPhone8 = Phone(name: "iPhone8", color: "red") print("폰 : \(iPhone8.name), 색상 : \(iPhone8.color)") // 폰 : iPhone8, 색상 : red var iPhoneXs = iPhone8 iPhoneXs.name = "iPhoneXs" iPhoneXs.color = "grey" print("폰 : \(iPhone8.name), 색상 : \(iPhone8.color)") // 폰 : iPhoneXs, 색상 : grey print("폰 : \(iPhoneXs.name), 색상 : \(iPhoneXs.color)") // 폰 : iPhoneXs, 색상 : grey iPhoneXs.updatePhone(name: "iPhoneX", color: "black") // 폰 : iPhoneX, 색상 : black

    struct에서는 candy에 shark를 대입한 후 candy를 변형해도 shark에는 아무런 지장이 없었지요?!

    그런데 class는 reference type이기 때문에 iPhoneXs를 iPhone8을 대입하고 iPhoneXs의 속성을 변형하면 iPhone8에 대한 속성도 함께 변형이 된답니다.


    뿐만 아니라, class는 method안에서 property 변경이 가능하기 때문에 mutating을 붙이지 않아도 됩니다 XD


    그럼 이제 가장 중요한 언제 struct를 쓰느냐!

    • 관계된 간단한 값을 캡슐화 하기 위한 것일 때
    • 인스터스가 참조되기 보다 복사되기를 바랄 때
    • 프로퍼티가 참조되기 보다 복사되기를 바랄 때
    • 프로퍼티나 메소드 등을 상속할 필요가 없을 때
    입니다. 


    아직 저는 일일히 고려하고 사용하는게 아닌데,, 언젠가는 고려하면서 쓰게 되겠지요?
    얼릉 분발해야겠습니다 히히

    안뇽!


    댓글

Designed by Tistory.