마지막 챕터 쪽은 예습을 다 하지 않았었다(다행히 중요도가 높지는 않은 내용들)
처음 듣긴 했지만 이해하기는 어렵지않은 내용들이었다 + 가볍게 보고 넘기라는 말씀도 많았던 챕터인지라 괜찮았다.
가볍게 정리
논리연산자 => 스위프트의 논리평가식 : 단락평가방식 => 최소한의 코드실행 => 함수내에서 외부변수를 건드릴때 사이드이펙트가 발생가능해짐 (if문에 함수를 직접 호출하면 단락평가방식에 의한 함수 실제 실행횟수 차이 발생으로 if문 등의 논리평가식 구조 전개(순서 등)에 따라 외부변수의 값이 달라짐 )
=> 실행결과를 변수에 담아서 논리평가식에 사용하면 실행횟수고정으로 해결가능
비트연산자 => 논리연산자 4개 / 이동연산자 2개
^(XOR) <<(2곱하기) >>(2나누기) 남는공간 0삽입, 넘는공간 버림 / 부호있는 signed비트연산자에서의 라이트 시프트주의(부호비트 유지)
연산자메서드 => 기존에 있는 연산자를 구현할때는 연산자를 선언해주는 과정은 불필요(구현만 하면됨)
구조체를 만들고 구조체끼리 기본연산을 하고싶다면 연산자 메서드를 구조체버전으로 구현가능하다 (타입메서드로 구현 static func) + prefix / postfix / infix => 파라미터로 lhs, rhs도 자주씀(infix 이항연산자경우)
inout 키워드 => 복합할당 메서드 구현시 사용가능(연산 후 다시 넣어주는 것이므로)
비교연산자 => Equatable / Comparable 프로토콜
== != 연산을 위해서는 Equatable 프로토콜 채택필요 => 예외(연관값없는 열거형)적으로 프로토콜 채택없이고 메서드구현되있음 => 프로토콜 채택해야하는 그외의 경우에는 열거형(연관값이 있고, 연관값이 모두 Equatable채택타입일시) / 구조체(저장속성만, 해당 저장속성이 Equtable채택타입일시) 예외적으로 원칙과 달리 프로토콜 요구사항을 직접 구현필요 없음(컴파일러 자동구현)
커스텀연산자 구현 : 연산자선언(중위연산자일때 우선그룹지정여부 고려하여 표기 => preceduregroup으로 커스텀 구현 or 기존 연산자그룹 사용) => 해당 타입에서 타입메서드로 선언했던 연산자내용 구현
멀티쓰레드에서 발생했던 race condition => 싱글쓰레드에서도 발생가능 (같은 메모리 동시적 접근 / 메모리충돌)
주로 값을 복사해서 쓰는게 아니라 직접 해당 메모리에 접근하여 사용하는 inout 키워드파라미터(정의) &아규먼트(호출)에서 발생
현상예시) 함수실행시 아규면트로 변수접근 도중에 함수내부에서 같은 변수를 또 접근시도 => 해결 변수를 복사하여 사용
현상예시) 동일함수에서 다른아규먼트로 같은 변수접근시
현상예시) 구조체에서 동일 인스턴스 접근시(인스턴스 내의 메서드가 받는 파라미터로 또다시 같은 인스턴스를 줄때)
현상예시) 동일한 튜플의 속성들을 다른 파라미터로 접근하는 함수를 실행할때
현상예시) 동일 인스턴스의 속성들을 다른파라미터로 접근하는 함수를 실행할때
컴파일러의 메모리 안전 판단기능을 통해 동시접근으로 보여도 상호영향이 실제로 없는경우를 판단하여 안전을 증명하는 경우도 있음(예: 전역변수아닌 지역변수로 인스턴스를 선언 후 동일 인스턴스의 속성들을 함수 파라미터에 넣어 실행등으로 접근하는 경우)