인프런 커뮤니티 질문&답변

주땡님의 프로필 이미지
주땡

작성한 질문수

성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]

27. Closure_3

약한 참조를 할 경우 self에 ?를 붙여야 하는 이유?

작성

·

313

0

수고많으십니다.

closure_3 강의에서,

lazy var myClosure2 = {[weak self] in

print(self?.b ?? 0)

}

  1. 여기서 self뒤에 ?가 붙는 이유는 뭔가요? ?의 의미를 죄송하지만 여기서 한번 더 설명해주실 수 있으실까요?

 

  1.  

myClass?.b = 11

myClass?.b

 

여기서 제가 중간에 놓친 설명이 있는 것 같기도 하고요. optional 인 Myclass를 unwrapping 하려면 !를 붙이는게 맞지 않나요? 그리고 myClass!.b로 실행해봐도 문제는 없는것 같구요. ?의 의미 한번 더 정리해주실 수 있으실까요.

답변 2

0

주땡님의 프로필 이미지
주땡
질문자

다른 부분은 일차적인 이해는 한 것 같습니다.

그런데 class 타입의 someClass를 myClosure2 가 self라는 이름의 옵셔널 타입으로 캡쳐한다는 것에서

var myClass : someClass? = someClass()

의 myClass와 self가 같은 것이라고 해석하는게 맞을까요?

 

iOS Developer - 이정님의 프로필 이미지
iOS Developer - 이정
지식공유자

weak var `self` = self

좀 더 정확하게는 이런느낌으로 만든거라고 보시면 됩니다.

주땡님의 프로필 이미지
주땡
질문자

‘ ‘ 는 처음보는 것 같은데 무슨 의미인가요?

iOS Developer - 이정님의 프로필 이미지
iOS Developer - 이정
지식공유자

backtick이라고 부르고 이미 있는 같은이름으로 된 이름을 만들고 싶을때나 원래 변수명으로 못 만드는 단어를 변수명으로 만들고 싶을때 씁니다.

self가 이미 있으니 그냥은 못 만들어서 백틱으로 감싸야 self를 만들수 있습니다.

swift언어 스펙이며 키보드 ₩ 누르면 나오는 기호입니다.

 

주땡님의 프로필 이미지
주땡
질문자

그럼 변수 self가 인스턴스인 self를 약하게 참조하는 상태인거고, 변수 self는 는 옵셔널 타입이 되는걸까요?

iOS Developer - 이정님의 프로필 이미지
iOS Developer - 이정
지식공유자

네 맞습니다~

주땡님의 프로필 이미지
주땡
질문자

감사합니다 ~

0

iOS Developer - 이정님의 프로필 이미지
iOS Developer - 이정
지식공유자

안녕하세요

weak는 약하게 참조한다는 의미이고 약한참조 한다는 것은 몇가지 의미가 있는데 그 중 하나가 언제든지 nil이 될 수 있는 옵셔널 타입을 뜻합니다.

클로저에서 [weak self]는 캡쳐리스트라고 해서 self와 같은 이름으로 해당타입을 옵셔널 타입으로 캡쳐하고 있다는 뜻입니다.


옵셔널타입의 멤버 접근시 물음표가 나오는건 옵셔널 체이닝이 가능한 상태를 말합니다.

이건 물음표 붙은 self가 nil일 경우 하위 멤버에 접근하지 않고 안전하게 nil을 반환한다는 뜻입니다.


언래핑 방법은 여러가지가 있고 그 중 하나가 !를 사용하는 것입니다.

하위 멤버에 접근만 할경우는 언래핑은 필요 없습니다. 따라서 !를 줄 이유는 없습니다.

언래핑이 필요한 경우는 만약 self 자체를 어딘가 넘겨줄 때 받는 쪽에서 옵셔널이 아닌 타입이라고 한다면 언래핑을 해서 옵셔널이 아닌 타입으로 넘겨줘야 겠죠.


옵셔널쪽과 클로저쪽 강의에서 설명을 하고 있긴 하지만 처음엔 이해가 쉽게 안될수 있는 부분이긴 합니다.

이해가 잘 안되는 부분은 다시 질문주시면 답변 드리겠습니다.

 

주땡님의 프로필 이미지
주땡

작성한 질문수

질문하기