[Swfit] 연산자

Soomin Kim·2024년 7월 9일

Swift

목록 보기
5/12
post-thumbnail

Swift 기본 표현식

var myresult = 1 + 2
  • 하나의 연산자 (operator) : ' + '
  • 두 개의 피연산자 (operand) : 1과 2
  • 할당자 (assignment) : ' = '

대입 연산자 (=)

a = b b의 값을 a에 대입(할당)한다.

let b = 10
let a = 5
a = b
// a는 10

대입의 오른쪽 항이 튜플이라면 튜플의 요소는 여러개의 상수(변수)로 분해된다.

let (x,y) = (1,2)
// x는 1, y는 2

산술 연산자 (+, -, *, /)

1+2 // 3 (덧셈)
5-3 // 2 (뺄셈)
2*3 // 6 (곱셈)
10.0 / 2.5 // 4.0 (나눗셈)

덧셈 연산자 +String 연결도 지원한다.

"hello, " + "world" //hello, world

하나의 표현식 안에 여러 개의 연산자를 사용할 수도 있다.

x = y * 10 + z - 5 / 4

나머지 연산자 (%)

a % b a 안에 들어갈 b의 배수가 몇인지를 계산하고 남은 값을 반환한다.

a = (b x some multiplier) + remainder
some multiplier는 a에 들어갈 b의 최대 배수

9 % 4 // 1
// 9 = (4 x 2) + 1

단항 뺄셈 연산자

숫자 값의 부호단항 뺄셈 연산자- 접미사를 사용하여 변경할 수 있다.

let three = 3
let minusThree = -three // -3
let plusThree = -minusThree // 3

단항 덧셈 연산자

단항 덧셈 연산자는 어떠한 변경없이 그 값을 그대로 반환한다.

실제로 아무런 동작을 하지 않지만 양수와의 대칭을 위해 사용할 수 있다.

let minusSix = -6
let alsoMinusSix = +minusSix // -6

복합 대입 연산자

  • x += y
    x와 y를 더한 결과를 x에 저장한다.
  • x -= y
    x와 y를 뺀 결과를 x에 저장한다.
  • x *= y
    x와 y를 곱한 결과를 x에 저장한다.
  • x /= y
    x를 y로 나눈 결과를 x에 저장한다.
  • x %= y
    x를 y로 나눈 나머지를 x에 저장한다.

덧셈 대입 연산자 사용 예

var a1 = 1
a1 += 2 //a1 = a1 + 2 
//a1 = 3

비교 연산자

비교연산자는 프로그램 흐름 제어 로직을 만드는데 가장 많이 사용된다.

  • 같음 a == b
  • 다름 a != b
  • 보다 큼 a > b
  • 보다 작음 a < b
  • 보다 크거나 같음 a >= b
  • 보다 작거나 같음 a <= b
1 == 1   // true 
2 != 1   // true 
2 > 1    // true 
1 < 2    // true 
1 >= 1   // true 
2 <= 1   // false
//if구문에서 사용
let name = "world"
if name == "world" {
	//name과 "world"가 갖기 때문에
    //if문이 실행된다.
    print("hello, world")
} else {
    print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world"

삼항 연산자 (? :)

조건문 ? 참(true)인 경우의 표현식 : 거짓(false)인 경우의 표현식

ex) question ? answer1 : answer2
question이 참 또는 거짓인지에 따라 2개의 표현식 중 하나를 나타내는 식
question이 참이면 answer1 반환 / 거짓이면 answer2 반환

삼항연산자는 아래의 코드를 줄여서 표현한 것이다.

if question {
    answer1
} else{
    answer2
}
//true면 answer1
//false면 answer2
let contentHeight = 40
let hasHeader = true 
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
//rowHeight의 값은 90(50+40)

nil-결합 연산자 (??)

nil-결합 연산자(??)를 사용하면 옵셔널에 nil 값이 있는 경우 디폴트 값을 사용할 수 있다.

a??b
a != nil ? a! : b
옵셔널 a에 값이 있다면 a를 강제 언래핑하고 a가 nil이면 기본값 b를 반환한다.

  • 표현식 a는 항상 옵셔널 타입
  • 표현식 b는 a에 저장된 타입과 같아야함.
let defaultColorName = "red"
var userDefinedColorName: String? //nil인 옵셔널 String

var colorNameToUse = userDefinedColorName ?? defaultColorName
//userDefinedColorName이 nil이기 때문에
//colorNameTouse는 deaultColorName("red")를 반환

let defaultColorName2 = "red"
var userDefinedColorName2 = "green" //nil이 아님.

var colorNameToUse2 = userDefinedColorName2 ?? defaultColorName2
//colorNameToUse2 = "green"

범위 연산자

(1) 닫힌 범위 연산자 (a..b)

a...b a와 b가 포함된 a부터 b까지의 범위 실행을 정의한다.

  • a값은 b보다 클 수 없다.
for index in 1...5 {
	//index는 1부터 5
    print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

(2) 반-열림 범위 연산자 (a..<b)

a..<b b가 포함되지 않은 a부터 b까지의 범위 실행을 정의한다.

  • a의 값은 b보다 클 수 없다.
  • 배열과 같은 0부터 시작하는 리스트와 함께 사용할 때 유용하다.
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
	//i는 0부터 3(count-1)까지
    print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack

배열은 4개의 아이템을 갖고 있지만 0..<count는 반열림 범위이기 때문에
3까지 카운트한다.

(3) 단-방향 범위 연산자 (a.../...a)

a... ...a 연산자가 오직 한쪽의 값만 가지고 있는 경우

for name in names[2...]{
    //인덱스 2부터 끝까지
    print(name)
}
//Brian
//Jack

for name in names[...2] {
    //처음부터 2까지
    print(name)
}
//Anna
//Alex
//Brian

for name in names[..<2]{
    //처음부터 2 직전까지
    print(name)
}
//Anna
//Alex

단-방향 연산자는 컨텍스트에서도 사용 가능하다.

let range = ...5
range.contains(7) //false
range.contains(4) //true
range.contains(-1) //true

논리연산자

부울 로직 값을 true와 false로 수정하거나 결합한다.

  • 논리적 NOT !a
  • 논리적 AND a && b
  • 논리적 OR a || b

(1) 논리적 NOT 연산자 (!a)

!a 부울 값을 ture->false / false->true 와 같이 반대로 만든다.

논리적 NOT 연산자는 접두사 연산자이며 동작할 값 바로 앞에 공백없이 위치한다.

let allowedEntry = false 
if !allowedEntry {
    //엔트리가 허락되지 않는다면
    //allowedEntry가 false일 경우에만 실행
    print("ACCESS DENIED")
}
// 출력 : "ACCESS DENIED"

(2) 논리적 AND 연산자 (a && b)

a && b 두 값이 모두 true여야 true를 표현하는 논리적 표현식을 만든다.

두 값 중 하나라도 false면 결과는 false 이다.

let enteredDoorCode = true 
let passedRetinaScan = false 
if enteredDoorCode && passedRetinaScan {
	//T && F = F
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
//출력 : "ACCESS DENIED"

(3) 논리적 OR 연산자 (a || b)

a || b 두 값중 하나라도 true이면 표현식이 true가 되는 논리적 표현식을 만든다.

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
	// F || T = T
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "Welcome!"

(3) 논리적 연산자 결합

긴 복합 표현식을 생성하기 위해 여러개의 논리적 연산자를 결합할 수 있다.

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    //3개의 작은 표현식이 함께 엮어있는 형태
    // F || F || T
    // F || T
    // T
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// 출력 : "Welcome!"

논리적 연산자 &&|| 은 왼쪽 우선결합 (left-associative) 이다.
가장 왼쪽부터 판단한다 !

(4) 명시적 소괄호

복합 표현식을 읽기 쉽게 하기위해 소괄호를 포함하는 것은 유용하다.

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    // (F) || F || T
    // T
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// 출력 : "Welcome!"
// 의도를 명확하게 하는데 도움이 되는 곳에 소괄호를 사용해야 합니다.
``

0개의 댓글