IOS/Swift

[TIL] Swift. Structure(Class, Struct, Enum)

  1. Swift의 구조적 이점

  • 속도 : 값타입은 시스템 리소스를 적게 먹는다
  • 안정성 : 구조체는 근본적으로 기본값을 변형 시킬수 없기 때문에 코딩시에 안전한 코딩을 할수있다.

  2. Class와 Struct의 차이점

import UIKit
class ViewController: UIViewController {
}

  위 코드는 iOS 개발을 할때 가장 흔하게 볼수 있는 코드이다. 처음 시작할때는 그냥 이렇게 하는구나 라고만 생각했는데 블로그 내용을 보고 쉽게 구조를 파악할수 있어서 한번 정리하게 되었다.

  • Class
    • class로 선언된 ViewController는 UIViewController를 상속받는 것을 볼수있다.
    • 상속 받는다는 것의 의미는 부모클래스에 있는 기능들을 자식클래스에서 쓸 수 있다는 것이다
    • 만약 iOS가 Struct구조 였다면 이렇게 쓸수 없다 (상속 불가능 하기 때문)
    • 최적용도
      • 구조체의 주목적이 몇몇 연관성있는 간단한 데이터 값의 캡슐화일 경우
      • 캡슐화된 값들이 그 구조체의 인스턴스가 할당될때나 전달될때 참조보다는 복사가 예상될 경우
      • 구조체에 저장되는 모든 프로퍼티들이 참조보다는 복사가 예상되는 값형식일 경우
      • 구조체가 다른 형(type)에서부터 프로퍼티나 기능이 상속될 필요가 없을 경우
      • 실질적으로 대부분의 사용자 데이터 형은 구조체가 아닌 클래스로 정의됨
  • Struct
    그러면 큰 뼈대를 담당하고 있다는 말은 무엇일까
    우리가 선언할때 자주 쓰이는 타입들의 정의는 구조체로 구현되어있다

public struct Int : SignedInteger, Comparable, Equatable
public struct Double
public struct String
  • : 뒤에 나오는 SignedInteger, .. 같은 경우는 프로토콜 이라고 볼수있다
  • 설명하자면 : 뒤에 있는 내용을 채택 하겠다 와 같은 것이다.
  • 최적용도
    • 참조가 아닌 복사를 원할 때
    • 자신을 상속할 필요가 없거나 자신이 다른타입을 상속받을 필요가 없을때
    • 연관된 몇몇의 값들을 모아서 하나의 데이터 타입으로 표현하고 싶을때

    3. Class와 Struct의 공통점

  1. 서로 다른 타입(자료형)들을 하나로 묶을 수 있다.
  2. 이러한 묶은 자료형들을 새로운 타입처럼 사용 가능하다
  3. 클래스/구조체 안에서 함수/프로퍼티 정의 가능
  4. extension 기능

  4. Structure VS Class

  • Structure : Value Types, Copy - STACK(메모리공간), 상속이 불가능하다
  • Class : Reference Types, Share - HEAP(메모리공간), 단일상속 가능
  • Enum : Value Types, 상속이 불가능하다, 정수의 경우 (Auto-incrementation)가능, 원시값을 참조가능하고, 이름이 곧 값이다.
Enum 예시
enum Animal {
 case tiger
 case leopard
 case dog
}
 let dog2: Animal = .dog (Animal 생략가능. 이유는 앞에 타입을 이미 Animal이라 해둬서)

print(dog2)  // dog ( 이름 그자체로 값을 전달함 )
  • 관계가 있는 데이터를 표현 할 때에는 Structure구조가 좋다

    • 인스턴스는 특정타입이 메모리에 적재된 시점의 타입
    • Structure와 Class 선언 예시

      Structure는 관계가 있는 것 들을 코드에서 나타내 주기 때문에 다른사람이 보았을때 이 코드가 어떤 녀석이고 어디에 쓰일지 쉽게 유추가 가능하다.

class PersonClass {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}


struct PersonStruct {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

 

'IOS > Swift' 카테고리의 다른 글

[TIL] Swift. Method  (0) 2020.10.06
[TIL] Swift. Property  (0) 2020.10.01
[TIL] Swift. Function Expression  (0) 2020.09.29
[TIL] Swift. Collection  (0) 2020.09.29
[TIL] Swift. Optional  (0) 2020.09.24