TIL(Today I Learned)
1월 11일(월)
학습내용
- Kahoot
- 동시성(Concurrency)은 논리적 개념, 병렬성(Parallelism)은 물리적 개념이다.
- 병렬처리는 멀티코어 환경에서만 가능하다.
- 멀티코어 환경은 물리적 환경이지만 동시성 프로그래밍과 상관 있다.
- 스위프트 타입의 모든 프로퍼티는 Thread-safe 하지 않다.
- Thread-safe 이란? 여러 쓰레드에서 동시에 변수에 접근할때 race condition이 발생하지 않는 것.
- 스위프트 타입의 모든 프로퍼티는 atomic 하지 않다.
- atomic 이란? 값이 변경되는 등의 연산이 진행될 때 다른 연산에 의해 간섭받지 않는 것.
- 두 개 이상의 프로세스나 스레드가 하나의 데이터를 공유할 때 데이터가 동기화되지 않는 상황을 뜻하는 용어는 Race Condition이다.
- ARC에 대한 활동학습
- String은 struct이지만, heap에 저장된다. 동적으로 길이가 변할 수 있기 때문이다. Array, Dictionary도 마찬가지이다. 따라서 struct이라고 무조건 stack 영역에 저장된다고 생각하면 안된다. 그리고 성능을 극대화하기 위해서 type의 property를 String으로 사용하는 것을 지양해야할때도 있다. (String이 value type으로 작동하지 않을 수 있으므로?)
- ARC이란 무엇인가?
- Heap 영역 메모리의 reference count를 자동으로 관리하는 기능. (클로져와 객체의 reference count를 관리)
- Reference Count는 왜 관리해줘야 하는가?
- Heap 영역의 메모리는 동적으로 할당되고 해제되기 때문에 관리해줘야 한다. (Stack 영역은 호출되면 할당되고 반환하면 해제되기 때문에 관리해주지 않아도 된다.)
- ARC는 어떻게 작동하는가?
- MRC일때는 retain과 release를 수동으로 작성해줬지만, 컴파일러가 이를 자동으로 작성해준다.
- ARC를 왜 이해해야 하는가?
- 동적으로 할당된 메모리가 언제 생성되고 언제 해제되는지 알아야하기 때문에.
- 언제 구조체를 선택하고 언제 클래스를 선택할까?
- 값 자체를 전달하는 것 보다 값을 참조하여 유지하거나 변경해야할때(?)
- WWDC 2016에서 언급한 3가지 이유(Allocation, Reference Counting, Method dispatch)도 고려할 수 있음 (4년 전 이야기 이므로 무조건은 아니다.)
- Swift 값타입은 복사 때문에 일어나는 성능저하를 크게 걱정하지 않아도 된다. Copy-On-Write 덕분이다.
- Copy-On-Write : 읽을때는 복사하지 않고 쓸때만 복사해서 사용.
문제점/고민한점
- inout 키워드, mutating 키워드란?
해결방법
- inout 키워드, mutating 키워드?
- inout은 copy-in, copy-out을 의미한다. 함수의 파라미터 형 앞에 inout 키워드를 붙여서 copy-in, copy-out 방식으로 파라미터가 작동할 수 있게 한다. 이를 통해 함수 내부에서 파라미터로 전달된 변수에 값을 변경할 수 있다.
- mutating 키워드는 value type의 메서드(struct, enum)에서 프로퍼티의 값을 변경할 수 있도록 하는 키워드이다. 구조체 메서드 앞에 mutating 키워드를 붙여서 사용 가능하다.
참고