짧은인사, 하루의 사건, 나의 행동

휴,,, 다행이 오늘도 게을러지지 않게 TIL을 작성하려 합니다.. 아침에 무심코 늦잠을 잘 뻔 했지만 이겨냈습니다 ^_^ㅋㅋ
아침에 운동을 다녀온 후 집근처 카페에 들려 공부를 하니 집에서 에어컨도 안틀고 절약이 되는거 있죠..
절약은 절약이지만 와서 카야토스트와 말차라떼를 시킨 저는 다이어트는 안된다는점~~
이번에 산 책인 "객체지향의 사실과 오해"를 가지고 와서 읽고 싶었지만 아직 배송중.. ㅜㅜ
따라서 어제 하지못한 클로저의 뒷부분을 공부했습니다~~
(어제쓴 TIL한번 정독후~)
배운점
연산자 메서드
클래스와 구조체는 기존 연산자의 자체 구현을 제공할수 있습니다. -> 연산자 오버로딩
(오버라이딩(Overriding) : 서브 클래스는 슈퍼 클래스에서 상속할 메서드, 프로퍼티, 서브스크립트를 서브클래스에서 원하는대로 재정의 할 수 있다.
오버로딩(Overloading) : 함수 이름은 같으나 매개변수, 리턴타입 등을 다르게 하여 함수를 중복으로 선언할 수 있다.)
잠깐 오버라이딩과 오버로딩을 상기시키고~
struct Vector2D {
var x = 0.0, y = 0.0
}
extension Vector2D {
static func + (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
}
위의 예제는 2차원 벡터에 대한 구조체를 정의 한 후 벡터 구조체의 인스턴스를 함께 더하기 위해 연산자 메서드의 정의를 합니다.
+와 일치하는 메서드의 이름을 가진 타입 메서드로 정의됩니다.
덧셈은 벡터의 필수 동작의 일부가 아니므로 메인 구조체에서의 선언이 아닌 확장에서 정의된다고 합니다!!
let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector + anotherVector
// combinedVector는 값이(5.0, 5.0)인 Vector2D 인스턴스 입니다.
접두사와 접미사 연산자
위에서의 예제는 이진 중위 연산자의 사용자 정의 구현입니다. 클래스와 구조체는 표준 단항연산자의 구현도 제공합니다!
-a 와 같이 대상의 앞에오면 접두사(prefix)연산자, a!와 같이 뒤에오면 접미사(postfix)연산자 입니다.
함수의 마지막 인수로 함수에 클로저 표현식을 전달해야 하고 클로저 표현식이 긴 경우 후행 클로저로 작성하는것이 유용!
extension Vector2D {
static prefix func - (vector: Vector2D) -> Vector2D {
return Vector2D(x: -vector.x, y: -vector.y)
}
}
let positive = Vector2D(x: 3.0, y: 4.0)
let negative = -positive
// negative는 (-3.0, -4.0)의 값을 가진 Vector2D의 인스턴스 입니다.
let alsoPositive = -negative
// alsoPositive (3.0, 4.0)의 값을 가진 Vector2D의 인스턴스 입니다.
단항 마이너스 연산자 -a 를 구현한 예제입니다. 결과값은 -를 +로 +를 -로 바꾸어서 반환합니다.
복합 할당 연산자
복합 할당 연산자는 다른 연산과 할당(=)을 결합합니다. Ex) (+=)
extension Vector2D {
static func += (left: inout Vector2D, right: Vector2D) {
left = left + right
}
}
var original = Vector2D(x: 1.0, y: 2.0)
let vectorToAdd = Vector2D(x: 3.0, y: 4.0)
original += vectorToAdd
// original은 현재 (4.0, 6.0)의 값을 가지고 있습니다.
※ 기본 할당 연산자 (=)는 오버로드가 불가능 하다고 합니다! 복합 할당 연산자만 오버로드 될 수 있습니다. 삼항 조건 연산자(a ? b : c)또한 오버로드 할 수 없습니다.
등가 연산자
사용자 정의 클래스와 구조체는 (==)와 (!=)라고 하는 등가 연산자의 구현을 가지지 않습니다. 일반적으로 표준 라이브러리의 기본 구현을 사용합니다. (==), (!=) 연사자를 구현하는 경우 표준 라이브러리의 Equatable 프로토콜의 준수성을 추가합니다.
extension Vector2D: Equatable {
static func == (left: Vector2D, right: Vector2D) -> Bool {
return (left.x == right.x) && (left.y == right.y)
}
}
let twoThree = Vector2D(x: 2.0, y: 3.0)
let anotherTwoThree = Vector2D(x: 2.0, y: 3.0)
if twoThree == anotherTwoThree {
print("These two vectors are equivalent.")
}
// Prints "These two vectors are equivalent."
많은 간단한 경우에 합성 구현을 사용하여 프로토콜 채택 (Adopting a Protocol Using a Synthesized Implementation) 에서 설명 된대로 Swift에 등가 연산자의 합성 구현을 제공하도록 요청할 수 있습니다.
위의 글을 읽고 합성된 구현을 사용하여 프로토콜 채택 으로 가서 문서를 확인했습니다.
합성된 구현을 사용하여 프로토콜 채택
struct Vector3D: Equatable {
var x = 0.0, y = 0.0, z = 0.0
}
let twoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0)
let anotherTwoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0)
if twoThreeFour == anotherTwoThreeFour {
print("These two vectors are also equivalent.")
}
// Prints "These two vectors are also equivalent."
위의 예제를 보았을때 x, y, z 모두 Equatable 타입이므로 Vector3D는 등가 연산자의 합성된 구현을 받습니다. Vector3D는 등가 연산자의 기본 구현을 사용합니다.
등가 연산자의 합성된 구현...
- Equatable 프로토콜을 준수하는 속성만 저장된 구조
- Equatable 프로토콜을 준수하는 연관된 타입만 포함하는 열거형
- 연관된 타입들이 없는 열거형
생각과 감정
문서를 볼때마다 새롭네요... 아직 많이 부족한것 같슴다..
클로저또한 완벽히 이해한것은 아니니 계속 보아야 할거같아요,,ㅎㅎ
앞으로의 계획선언
합성된 구현에 대한 이해가 아직 부족한것 같으니 관련 문서와 블로그를 보고 공부를 해야겠씀미다...
집에가면 책이 도착했겠죠..? ㅎㅎ 조금은 읽어보고 자야겠네요~~
https://kka7.tistory.com/132?category=919617
Advanced Operators
[최종 수정일 : 2018.09.13]원문 : 애플 개발 문서 Swift 4.2 Language Guide - Advanced Operators고급 연산자(Advanced Operators)기본 연산자(Basic Operators)에서 설명된 연산자 외에, Swift는 더 복잡한 값을 다루기 위한
kka7.tistory.com
'TIL' 카테고리의 다른 글
TIL_20230921 (0) | 2023.09.21 |
---|---|
TIL_20230918 (0) | 2023.09.18 |
TIL_20230914 (0) | 2023.09.14 |
TIL_20230913 (0) | 2023.09.13 |
TIL_20230911 (0) | 2023.09.11 |