최근 코딩 테스트를 치면서 2차원 배열의 좌표를 다루는 문제가 있었습니다.
거기서 2차원 좌표를 [Int] 인트 배열로 표현했는데 [1, 2] + [2, 3] = [3, 5] 로 만들어야 되는 상황이 있었습니다.
기존의 배열에서는 [1, 2] + [2, 3] 을 하면 [1, 2, 2, 3]이 되버려서
Point라는 구조체를 만들어서 operator를 추가시키려고 하였습니다. ㅎ
짠!
여기서 제가 만든 Point(x: 1, y: 2) + Point(x: 2, y: 3)을 하려면 연산자를 추가해줘야 합니다.
아래부터 추가되는 연산기호는 제가 만든 Point구조체 안에 있어서 static이 붙습니다.
짠!!
후후~ 이제 된다 !!
이렇게 +를 만들고나니 +=는 어떻게 구성될까.. 궁금해서 제가 만들어 봤습니다.
되..되나..??
오 된다 .ㅎㅎ
잠깐!
inout을 썻는데 평소에 알고리즘 문제를 풀 때 inout을 쓸때 &를 붙여서 주소값을 넘겨줬는데 여기선 안해줘도 되네요?!?!
(llim이랑 얘기하다가 함수처럼 .blabla()이렇게 안되니까 연산자라서가 아닐까?! 라는 얘기를 나눔!)
그래서 똑같은 모양의 함수를 만들어봄!! 더해라!!!!!!!!!!!!!!!!!!!!!()
더해라()는 .. 타입 메서드가 되어버렸따.. 그리고 &를 넣어줘야 한다.!
static func면 타입 메서드인데 기호가 붙어서 연산자가 되는 것 같슴다.. 연산자는 인스턴스에서만 사용이 되네요.. ( 함수처럼 뒤에 . 이 안붙고)
실제로 Int형의 += Document 를 보자 !!
제가 만든 거랑 파라미터 똑같네요 ㅋㅋㅋ (하지만 제껀 예외처리가 없... )
이렇게 하다가 ++도 괜히 만들고 싶은겁니다..
응 ? 뭐지/!!
postfix를 넣어서 해결 !!
연산자를 할 때 종류가 3종류가 있네요
postfix는 뒤에 연산자를 붙이는 거고 파라미터는 하나만! "i++" (파라미터 두개 넣으니까 infix로 하라고 경고를 해요)
prefix는 연산자가 앞에 오는 거고 파라미터 하나만. "++i"
-> postfix와 prefix같은 단항 연산자는 명시를 해줘야합니다.!
잠깐..!!
infix를 하려다가 보니까 += 는 이미 swift안에서 선언된 연산자 기호였고 infix로 돼있나봐요.
그리고 제가 만든 postfix인 ++도 swift안에 이미 선언이 되있어서 ++는 새로 선언해줄 필요가 없네요..
만약 미리 안만들어진 연산자의 경우 아래의 ++* 처럼해주면 되요!!
postfix와 prefix엔 우선순위가 없어도 됩니다.
infix 연산자에는 우선순위가 있어서 지정해줘야 해요.!! 아래의 문서 참고!
https://developer.apple.com/documentation/swift/swift_standard_library/operator_declarations
Precedence에는 좌측결합 / 우측결합, 우선순위 레벨 이렇게 들어있는 것 같아요.
짠 제가 만든 infix operator에요
infix는 따로 구조체내에서 명시를 안해줘도 되요 static infix func +++ 이렇게 하면 오류나여 postfix랑 prefix는 ++같은 기호가 동시에 쓰여질 수 있으니까 구분지어 주는 것 같아요.
operator는 여기까지!!
추가로 ++를 Point 구조체에 구현하기전에 minusX()라는 함수를 만들었어요. 값 타입 프로퍼티들은 해당 인스턴스 메소드 내에서 수정할 수 없기 때문에 mutating을 명시해줘야 합니다. (클래스는 mutating 필요없습니다. 참조 타입)
후기
평소에는 그냥 함수 만들어서 돌렸을 [1, 2] + [2, 3]를 [3, 5]로 만드려는 새로운 시도를 해봤습니다. ㅎ
이 시도에서 구조체를 짜보고 구조체에 연산자를 넣어서 계산해보게 되었고 연산자의 특징들을 알 수 있었습니다.
애플 문서도 참고하게 되었는데 NFC를 다루면서 조금 친해진 애플 문서..더 친해져 보도록 해야겠습니다. 알짜배기..
새롭게 알게 된 것
- 기존에 선언된 연산자들이 여러개 있고, 제가 새로 만드는 연산자의 경우 선언 해줘야하고 infix의 경우 우선순위등급도 줘야한다.
- 값 타입은 진짜 그 자체 값으로 보기 때문에 인스턴스 메소드로 자체 변수 값을 바꿀 수 없지만 mutating을 하면 바꿔줄 수 있다.
- 연산자에도 static을 쓰지만 타입 메서드랑은 다르게 작동한다.
'Swift' 카테고리의 다른 글
[Swift] Generic (0) | 2021.07.20 |
---|---|
[Swift] Dictionary - init, grouping, by (0) | 2021.04.06 |
[Swift] compactMap, flatMap (0) | 2021.04.06 |
[Swift] struct, class - remind (0) | 2021.03.28 |
[Swift] Completion, Closure Excaping (0) | 2021.03.25 |