본문 바로가기

Swift

[Swift] - Operator

최근 코딩 테스트를 치면서 2차원 배열의 좌표를 다루는 문제가 있었습니다. 

거기서 2차원 좌표를 [Int] 인트 배열로 표현했는데  [1, 2] + [2, 3] = [3, 5] 로 만들어야 되는 상황이 있었습니다.

 

기존의 배열에서는 [1, 2] + [2, 3] 을 하면  [1, 2, 2, 3]이 되버려서 

배열에서 +는 append랑 같다구.. 뒤에 붙어버린다구...

 

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

 

Apple Developer Documentation

 

developer.apple.com

 

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