Struct VS Class VS Enum

bromp 2023년 1월 2일 PM 02:45 26 0
bromp Profile Image Level 7

  • 참조 타입 VS 값 타입

    class는 참조 타입이고 structure, enumeration은 값 타입이다.

    클래스의 object를 변수에 할당하면 그들은 모두 같은 인스턴스를 가르킨다. 따라서 하나가 수정되면 모두 수정된다.

    class Cat {
        var name:String
        init(name:String) {
            self.name = name
        }
    }
    var cat1 = Cat(name: "Kitty")
    var cat2 = cat1
    cat1.name = "Oscar"
    // Both cats are the same
    print("cat1 name : \(cat1.name), cat2 name : \(cat2.name)")
    // cat1 name : Oscar, cat2 name : Oscar
    
    struct Cat {
    var name:String
    }
    var cat1 = Cat(name: "Kitty")
    var cat2 = cat1
    cat1.name = "Oscar"
    print("cat1 name : \(cat1.name), cat2 name : \(cat2.name)")
    //cat1 name : Oscar, cat2 name : Kitty
    
  • Mutability(변덕)

    • struct가 let을 사용해서 상수로 만들어지면 instance는 변경할 수 없다. 즉 proterty를 변경할 수 없다.

      struct Cat {
          var name:String
      }
      let cat1 = Cat(name: "Kitty")
      cat1.name = "Oscar"
      // error: cannot assign to property
      
    • class는 상수로 선언 되면 참조만 변경할 수 없고 property는 변경할 수 있다

      class Cat {
          var name:String?
      }
      let cat1 = Cat()
      cat1.name = "Oscar"
      // Working fine
      
    • enum, strut는 변수로 선언 됐고 method를 통해서 property를 변경하려면 method앞에 mutating 키워드를 붙여 인스턴스 내부의 값을 변경하는것을 명시 해야합니다.

      struct Cat {
          private var vaccinated:Bool
          init() {
              self.init()
          }
          // Will not work without mutating keyword
          mutating func vaccinate() {
              self.vaccinated = true
          }
      }
      var cat1 = Cat()
      cat1.vaccinate()
      
  • deinitializer(소멸자)

    • init(생성자)는 값 타입, 참조 타입 모두 갖지만, deinit(소멸자)는 값 타입에만 존재합니다.
    • class의 인스턴스는 참조 타입이므로 더 이상 참조할 필요가 없을 때 메모리에서 해제되고 소멸 직전에 deinit method 호출됩니다.
  • Generated init

    • struct만 Generated init method를 갖습니다.
    struct Cat {
    var name:String
    var age:Int
    }
    let cat1 = Cat(name: "Lucy", age: 3)
    
  • Inheritance(상속)

    • class 에서만 가능하다.
    struct Pet {
            var name:String
    }
    struct Cat : Pet {
    }
    // ERROR : Inheritance from non-protocol type 'Pet'
    
  • Stored property(저장 프로퍼티)

    • enum은 저장 프로퍼티를 갖을수 없다.
    enum Pet {
    
        var name:String 
    //  error: enums must not contain stored properties
    }
    

    참고

댓글