Swift 정리 - Classes and Structures

김세영·2021년 12월 20일
0

Swift Doc 정리

목록 보기
8/17
post-thumbnail

Class vs. Structure

  • 공통점

    • 값의 저장을 위한 프로퍼티 정의
    • 기능 제공을 위한 메서드 정의
    • 특정 값을 접근할 수 있는 subscript 제공
    • 초기 상태를 지정할 수 있는 init 제공
    • 기능 확장을 위한 extension 사용 가능
    • 특정한 표준 기능을 제공하기 위한 protocol 채택
  • 클래스만 가능한 기능

    • Inheritance
      클래스의 여러 속성을 하위 클래스에 제공함

    • Type Casting
      런타임에 클래스 인스턴스의 타입 확인 및 해석 가능

    • Deinitialize
      클래스의 인스턴스가 할당된 리소스 해제

    • Reference counting
      클래스의 인스턴스에 하나 이상의 참조가 가능
      (구조체는 참조 카운트를 하지 않음)

Struct, Enum : Value Type

값 타입: 변수, 상수에 할당되거나 함수에 전달될 때 값이 복사되서 전달되는 타입
값 타입은 Stack영역에 할당된다.

struct Rectangle {
    var width = 0
    var height = 0
}

let square = Rectangle(width: 200, height: 200)

var anotherSquare = square
anotherSquare.width *= 2
anotherSquare.height *= 2

print(square)
// Rectangle(width: 200, height: 200)
print(anotherSquare)
// Rectangle(width: 400, height: 400)

anotherSquare을 변경해도 square에는 아무런 변화가 없다.
-> 둘은 완벽히 다른 인스턴스이다.

Class : Reference Type

참조 타입: 변수, 상수에 할당되거나 함수에 전달될 때 해당 인스턴스의 주소가 전달되는 타입
참조 타입은 Heap영역에 할당된다.

class Rectangle {
    var width = 0
    var height = 0
    
    init(width: Int, height: Int) {
        self.width = width
        self.height = height
    }
}

let square = Rectangle(width: 200, height: 200)

var anotherSquare = square
anotherSquare.width *= 2
anotherSquare.height *= 2

print("width: \(square.width), height: \(square.height)")
// width: 400, height: 400
print("width: \(anotherSquare.width), height: \(anotherSquare.height)")
// width: 400, height: 400

anotherSquare만 변경했지만 square의 값이 바뀌었다.
-> anotherSquare이 참조하는 주소에 있는 값을 변경했기 때문에, 같은 주소를 참조하는 square의 값도 바뀜

  • Identity Operator
    ===, !== 연산자로 상수 혹은 변수가 같은 인스턴스를 참조하고 있는지 확인 가능
if anotherSquare === square {
    print("same instance")
} else {
    print("another instance")
}
// same instance

Choosing Between Class and Struct

다음 조건 중 1개 이상을 만족하면 구조체 사용을 고려해 본다.

  • 주 목적이 간단한 값을 캡슐화하기 위한 것인 경우
  • 인스턴스가 참조보다 복사되기를 기대하는 경우
  • 인스턴스의 프로퍼티가 참조보다 복사되기를 기대하는 경우
  • 프로퍼티나 메서드 등을 상속할 필요가 없는 경우

String, Array, Dictionary

String, Array, Dictionary는 모두 struct로 구현되어 있다.
이는 값 타입이므로 변수나 상수에 할당할 때 값이 복사됨

  • 실제로는 할당될 때 값이 복사되지 않고,
    최적의 성능을 위해 실제로 필요할 때만 데이터가 복사된다.

반대로 NSString, NSArray, NSDictionaryclass로 구현되어 있다.
이는 참조 타입이므로 변수나 상수에 할당할 때 참조가 사용됨

profile
초보 iOS 개발자입니다ㅏ

0개의 댓글