본문 바로가기

Programming•프로그래밍/Swift•스위프트

Swift 5 프로그래밍 / #2. 연산

반응형

 

Swift

#2. 연산

 

PC 혹은 태블릿에서

보는 것을 추천드립니다!

 


대부분 프로그래밍에서

산술 연산 부분은 대부분 동일합니다

 

산술 연산자

 

A + B   // A 와 B 를 더한 값을 반환합니다 (더하기 연산자)
A - B   // A 에서 B 를 뺀 값을 반환합니다 (빼기 연산자)
A * B   // A 와 B 를 곱한 값을 반환합니다 (곱하기 연산자)
A / B   // A 를 B 로 나눈 값을 반환합니다 (나누기 연산자)
A % B   // A 를 B 로 나눈 나머지 값을 반환합니다 (나머지 연산자)

 

 

예를 들어

 

let A = 5
let B = 3

A + B   // 8
A - B   // 2
A * B   // 15
A / B   // 1 (Int 값 이라서)
A % B   // 2 (5를 3으로 나눈 나머지 값 이라서)

 

이렇게 됩니다

 


비교 연산자

A = B    // *A에 B의 값을 할당합니다. 이 친구는 할당 연산자 입니다. 대입 연산자라고도 불립니다. 비교 연산자는 아니지만
         // A = B 와 A == B 와 차이를 설명하기 위해서 초대했습니다.

A == B   // A 와 B가 같으면 True 다르면 False 를 반환합니다.
A != B   // A 와 B가 다르면 True 같으면 False 를 반환합니다.
A <= B   // A 가 B보다 작거나 같으면 True 다르면 False 를 반환합니다.
A >= B   // A 가 B보다 크거나 같으면 True 다르면 False 를 반환합니다.
A < B    // A 가 B보다 작으면 True 다르면 False 를 반환합니다.
A > B    // A 가 B보다 크면 True 다르면 False 를 반환합니다.
/* 일단 여기까지만 알아도 충분 */

A === B  // A 와 B가 레퍼런스 타입일때 같은 인스턴스를 가리키면 True 다르면 False 를 반환합니다.
A !== B  // A 와 B가 레퍼런스 타입일때 다른 인스턴스를 가리키면 Ture 같으면 False 를 반환합니다.
A ~= B   // A 와 B의 패턴이 매치되면 True 다르면 False 를 반환합니다.

 

예를 들어

 

let A = 5
let B = 3

A == B   // False
A != B   // True
A <= B   // False
A >= B   // True
A < B    // False
A > B    // Ture

 

이렇게 됩니다


범위 연산자

 

Swift는 범위 연산자를

특이하게 표현합니다

 

A...B   // A 이상 B 이하 
A..<B   // A 이상 B 미만
A...    // A 이상
...A    // A 이하
..<A    // A 미만

 

역시나 예를 들어

 

let A = 3
let B = 10

A...B   // 3 ~ 10 
A..<B   // 3 ~ 9
A...    // 3 ~
...A    // ~ 3
..<A    // ~ 2

 

이렇게 됩니다


비트 연산자

Drop the bea..t

 

~A      // NOT 비트 연산자: 비트 반전
A & B   // AND 비트 연산자: AND 논리 연산
A | B   // OR 비트 연산자: OR 논리 연산
A ^ B   // XOR 비트 연산자: XOR 논리 연산
A >> B  // 시프트 연산자 ( > 이쪽으로 ): A(정수) >> B(만큼) 시프트 연산
A << B  // 시프트 연산자 ( < 이쪽으로 ): A(정수) << B(만큼) 시프트 연산

 

예를 들어

 

var A = 5 // 0 0 1 1
var B = 2 // 0 0 1 0

~A      // -6
~B      // -3

A|B     // 7
A^B     // 7

A >> B  // 1
A << B  // 20

 

이렇게 됩니다

 

팁을 조금 드리자면

~A와 ~B 같은 NOT 비트 연산의 경우

-(A) -1이 NOT 비트 연산의 값이 되고

 

만약 A 가 -5(음수) 였다면?

-(-5) - 1 =?

4

가 되겠죠?

 

시프트 연산의 경우

오른쪽 (>>)으로 한 번씩 이동할 때마다

절반의 값이 사라지고

왼쪽 (<<)으로 한 번씩 이동할 때마다

두 배씩 값이 증가합니다

 

그냥...

편법입니다.. ㅎ


복합 할당 연산자

 

복합 할당 연산 또한

대부분 프로그래밍 언어에서 지원합니다

 

A = A + B   // A 와 B 의 합을 A 에 할당합니다.
A = A - B   // A 와 B 의 차를 A 에 할당합니다.
A = A * B   // A 와 B 의 곱을 A 에 할당합니다.
A = A / B   // A 와 B 를 나눈 후 몫을 A 에 할당합니다.
A = A % B   // A 와 B 를 나눈 후 나머지를 A 에 할당합니다.
A = A >> B  // A 를 B 만큼 (오른쪽 >>) 시프트 한 값을 A 에 할당합니다.
A = A << B  // A 를 B 만큼 (왼쪽 <<) 시프트 한 값을 A 에 할당합니다.
A = A & B   // A 와 B 의 AND 연산 값을 A 에 할당합니다.
A = A | B   // A 와 B 의 OR 연산 값을 A 에 할당합니다.
A = A ^ B   // A 와 B 의 XOR 연산 값을 A 에 할당합니다.

 

중요한 점은 A 와 같다는 뜻이 아니라

아까 할당 연산자 ( = ) 기억하셔야 합니다

할당한다는 의미입니다

 

같다와( == ) 할당한다( = )가 다른 의미를 가진다는 것을

아셔야 합니다!


기타 연산자

// [추후 옵셔널 에서 사용합니다.]
A ?? B  // A가 nil이 아니면 A를 반환하고, nil이면 B를 반환합니다.
A!      // (옵셔널)A를 강제 추출합니다.
A?      // (옵셔널)A를 안전하게 추출하거나, A가 옵셔널임을 표시합니다.

// [오버플로(Overflow) 방지]
&+   // 오버플로를 대비한 덧셈 연산입니다.
&-   // 오버플로를 대비한 뺄샘 연산입니다.
&*   // 오버플로를 대비한 곱셈 연산입니다.

 

스위프트에서 사용하는 옵셔널에 대해

잘 모르시는 분들이 많을 테니

오버플로에 대한 예제만 보여드리겠습니다

 

/* 255ml 를 담을 수 있는 물통이 있는데 1ml 만 더 담아도 모두 쏟아져 버리는 그런 말도안되는 물통이 있다고 칩시다 */
UInt8.max // 255 (UInt8 의 최대값은 255 입니다)

var 물통255ml = UInt8.max - 2 // 253
// 물통255ml += 256 | 잘못된 표현 255 가 최대값이기 때문에 256을 담을 수 없다

// 오버플로 연산자에 할당 연산자를 더한 오버플로 할당 연산자 입니다.
물통255ml &+= 1  // 254
물통255ml &+= 1  // 255 (최대)
물통255ml &+= 1  //  0  (모두 쏟아짐)

print(물통255ml) // 0

 

원래대로라면 마지막

물통255ml &+= 1

에서 런타임 오류로

컴파일이 불가능했을 텐데

 

오버플로 연산자를 이용해서

컴파일이 가능했습니다

 

하다 보니 분량이 너무 길어져서...

#3. 제어로 찾아오겠습니다

: )

 

 






반응형