Noncopyable 은 무엇인가? 2 - 소유권

김재형·2024년 10월 23일
1

들어가기에 앞서

Noncopyable 1편부터 이어지는 내용입니다.
꼭 1편을 보시고 이어서 봐주시길 바랍니다.

소유권

복사가 불가능한 구조체를 생각해 보겠습니다.
원래 copyable한 구조체 일때는
함수가 매개변수로 구조체를 복사해 가져오게 되는데
Noncopyable일때는 어떠한 상황이 발생할까요?

위와 같은 경우를 생각해 보겠습니다.
복사가 불가능해지니 format 함수에 경우 문제가 발생하게 됩니다.
이때 어떠한 소유권 을 갖는지 선언해야 합니다.

Consuming

번역으론 "소비" 라고 하는데
함수가 호출로부터 인수를 받을것이라는 의미를 가집니다.

하지만 문제가 있어 보입니다.
다시 아래코드를 살펴보겠습니다.

format 함수에게 소유권을 넘겼지만 다시 구조체를 받아오지 못하고 있습니다.
하지만 소유권이 없는 result를 반환하고 있습니다.

Borrowing

자 그럼 다시 원점으로 돌아와서
임시적으로 권한을 가져오고자 할때에 사용할수있는 키워드를 생각해보죠
Borrowing 빌리다 라는 키워드를 통해 이를 해결해 볼수 있을것 같습니다.

소유권중에 빌리는 이 키워드로는 읽기: Read 권한을 받아올 수 있습니다.
이말은 즉 위의 코드처럼 var 키워드를 통해 값을 복사한후 수정할수 있다라고 생각할수 있죠.

하지만 명시적으로 borrowing 키워드를 통해 가져온 매개변수는
소비, 변이 가 불가능 합니다.
format 함수의 목적은 변이를 해야함으로 이번 방식으로 해결은 힘들 것 같습니다.

inout

저번 블로그 글에서 inout 을 다루었었는데
반갑게 다시 등장하였습니다.

inout을 다시한번 간단하게 정의 하자면
호출의 변수에 대한 임시적인 쓰기 접근 권한을 제공합니다.

하지만 disk 즉 임시적으로 가져온 구조체를 다시 초기화 하기를 바라는데
원래는 copyable 에서 알아서 해주던 것을 Noncopyable 에선 해주지 않기 때문에
직접 값을 덮어 씌어주는 방법이 필요합니다.

마무리하며

이번 시간에는 소유권 에 대해서 학습 하였습니다.
오늘의 핵심은 consumming, borrowing, inout 의 차이점 정도가 될 것 같습니다.
사실 Noncopyable에서만 inout을 제외한 키워드 들이 등장하는 개념이라
이런 것들이 있었구나 생각해 주셔도 될것 같습니다.
예를들어, 은행앱에서 돈을 이체하거나 할때의 작업등에선 Noncopyable을 통해 안정성을 높일 수
있습니다만, 그 외에는 거의 필요 없을 것 같은 개념이지만, 알아두면 멋있잖아요?
마무리 멘트가 길어 졌군요!
오늘 하루도 고생 하셨습니당

profile
IOS 개발자 새싹이
post-custom-banner

0개의 댓글