Safety

swift에서 safety란? 스위프트는 다양한 방식으로 안정성을 제공하는데 Optional이 대표적인 예임. Optional을 사용하면 null포인터 이슈를 쉽게 처리 가능 safety하다는 예상을 벗어난 동작을 사전에 미리차단하는 것을 의미함.

Swift Unsafe APIs

swift가 제공하는 안전 영역에서 벗어났다는 것을 명확히 알려주기 위해 Swift는 각각의 포인터 타입에 Unsafe로 시작하는 이름을 붙임. 따라서 Unsafe를 사용할때에는 개발자가 직접 안정성을 제공해 주어야함. 포인터를 이용하면 메로리에 직접 접근이 가능함.

var age = 5
withUnsafePointer(to:&age) { agePointer in
	print(agePointer.pointee)
}
>5

agePointer는 값이 아니라 메모리에서의 위치를 나타냅니다. 만약 포인터가 가리키는 값에 접근하고 싶은 경우 pointee속성을 사용하면 됨.

Unsafe 포인터 타입

Swift 표준 라이브러리에는 8가지 unsafe포인터 타입이 있습니다.

Type pointer와 Raw포인터

타입 포인터의 경우 이들 포인터가 가르키는 메모리주소에는 특정 타입의 값이 저장되어 있음. Int로 제너릭값을 설정한 경우 pointee로 접근시 Int값을 얻게됨. 타입 포인터의 경우 미리 가르키는 데이터의 타입을 알고있기 때문에 Stride나 alignment에 대해 고민하지 않아도된다고함. 또한 배열에 접근하는 경우 좀더 안전함.

Raw포인터의 경우 저장된 값에 타입 정보를 알 수 없음.메모리 바인딩을 통해 raw포인터를 type포인터로 변환이 가능함.

Mutable포인터와 Immutable포인터

수정 불가 가능한 포인터로 구분이 가능함. 포인터를 let으로 선언 하더라도 포인터가 참조하는 메모리의 값을 변경 가능함.