Operator (연산자)
a + b
위의 코드에서 + 같은 기호는 연산자.
a와 b는 피연산자.
연산자의 종류
+a 처럼 피연산자가 하나라면 Unary Operator(단항연산자)
a + b처럼 피연산자가 두개라면 Binary Operator(이항연산자)
a ? b : c처럼 피연산자가 세개라면 Ternary Operator(삼항연산자 / 조건연산자) 라고 한다.
단항연산자와 이항연산자는 이해하기 쉽다.
그럼 삼항 연산자를 한번 보자.
이런식으로 사용된다.
a ? b : c
question ? answer1 : answer2
// ex)
let hour = 12
hour < 12 ? "오전" : "오후" //"오후"
a와 b와 c.
각각 질문과 답1 답2라고 해석할 수 있다.
질문의 답이 true면 답1을 출력하고, false라면 답2를 출력하는 형식이다.
question을 제외한 answer1과 2의 자료형은 똑같아야 한다.
연산자를 사용할 때는 공백이 중요한데, 예를 들어 단항연산자로 사용하려면 +a라고 공백없이 붙여서 사용해야 한다.
하지만 Binary Operator에서는 공백없이 a+b라고 쓰는것도 가능한데, 코드에 따라서 에러가 발생하는 경우도 있고,
가독성 측면에서도 좋지 않으니 a + b처럼 공백을 주는것이 좋다.
또한 a+ b나 a +b처럼 쓰면 안된다. 이렇게 쓴다면 단항연산자로 인식해버릴 것이다.
그냥 이항연산자를 사용할 때는 a + b의 형식말고는 머릿속에서 지우는 것이 좋다.
또한 연산자의 위치에 따라 +a는 Prefix Operator(전치 연산자), a+는 Postfix Operator(후치 연산자)로 구문한다.
a + b와 같이 연산자가 피연산자 사이에 있는 경우는 Infix Operator라고 한다.
Swift의 연산자는 우선순위를 가지고 있는데,
예를 들어 a + b * c가 있다면 원래는 b * c를 먼저 계산해야하지만,
이때 괄호로 묶어주면 그것을 우선으로 실행할 수 있다.
ex) (a + b) * c // 이때는 괄호에 묶인 a + b가 우선순위가 된다.
마찬가지로 괄호를 여러개 사용할 수 있으며 이때는 가장 안쪽에 있는 괄호부터 먼저 실행하게 된다.
Swift의 기본 연산자
- ! (부정)
- ~ (Tilde, 비트연산자에서 사용)
- ` (Back Tick / Grave Accent, 키워드를 identifiers로 바꾸는 문법에서 사용)
- @ (At Symbol, 코드 자체의 특성을 지정하는 용도로 사용)
- # (Sharp / Pound / Hashtag, Swift에서 제공하는 특별한 명령어는 전부 #으로 시작함)
- $ (클로저에서 파라미터의 이름을 대체할 때 주로 사용)
- % (주로 나머지를 구할 때 사용(정수만 지원함))
// 실수에서 나머지를 구할때는
let a = 11
let b = 14
let c = Double(a)
let d = Double(b)
c % d // d가 c보다 크기때문에, 실수라서 나머지를 구할 수 없음.
c.truncatingRemainder(dividingBy : d) // 나머지를 구할 수 있음.
- ^ (Caret, 비트연산에서 사용)
- * (Asterisk, 곱하기 연산)
- ( ) (Parentheses, 함수 호출, 계산 순서 지정 등 다양하게 사용)
- _ (Underscore, 와일드카드 패턴을 구현할 때 자주 사용)
- = (Equal Sign, 변수나 상수의 값을 저장할 때 사용, 두개 사용시 두개의 값을 비교)
- + (덧셈할 때 사용)
- [ ] (Square Bracket, 주로 컬렉션에 저장된 값에 접근할 때 사용)
- { } (Curly Bracket / Brace, 코드 블럭의 범위를 지정할 때 사용)
- \ (스트링 인터콜레이션 문법이나, 키패스 표현식엣 ㅓ사용)
- | (Vertical Bar / Pipe, 주로 논리연산이나 비트 연산에서 사용)
- ; (두개 이상의 문장을 연달아 사용할 때 사용
- : (자료형을 지정할 때, 딕셔너리에서 키와 값을 구분할 때 사용)
- . (Period, 메소드를 호출하거나 속성에 접근할 때 사용)
- < > (Angle Bracket, 크기를 비교할 때 사용, 제네렉에서는 형식 파라미터를 설정할 때 사용)
- / (경로를 지정하는데 사용, 혹은 나눗셈 연산자. 정수의 경우 소숫점은 저장할 수 없어서 몫만 나타냄.)
- ? (Optional에서 주로 사용)
- & (Overflow 연산자로 사용. ex. &+, &*, &-)
연산자는
상수와 변수에 저장할 수 있다.
Parameter로 전달할 수 있다.
함수에서 Return 할 수 있다.
a + b에서 +가 바로 연산자(Operator)이고, a와 b가 피연산자(Operand).
단항연산자를 사용할 때는 항상 붙여서 써야 한다. (ex. +a)
이항연산자는 a + b로 사용하는 것이 좋다. 연산자 양쪽에 공백없이 붙여쓸수도 있지만, 일부 코드에서 오류가 발생할 가능성이 있다.
삼항연산자에서도 마찬가지로 공백을 주는 것이 좋다. (ex. a ? b : c)
+a 처럼 연산자가 앞에 오는 것을 전치연산자(Prefix Perator)라고 한다.
반대로 a+ 처럼 뒤로 오는 것을 후치연산자(Postfix Operator)라고 한다.
a + b에서는 Infix Operator라고 한다.
연산자는 우선쉰위를 가지고 있다.
( ) 는 흔히 알고있는 순서대로 계싼하면 된다. = 괄호 안에 들어있는 계산 먼저
Associativity(결합 규칙)
- Left Associative(좌결합성)
- Right Associative(우결합성)
Overflow Operators
말 그대로 넘치는 것.
let a: Int8 = 9 * 9 * 9 //에러메시지 발생.
// Int8로 선언하면 9 * 9 * 9는 너무 커서 Overflow가 발생한다.
// Swift는 Overflow를 허용하지 않는다. (산술연산자가 허용하지 않음)
자료형에 저장할 수 있는 가장 큰 값에 1을 더하면 자료형에 저장할 수 있는 가장 작은 값이 된다.
반대로 자료형에 저장할 수 있는 가장 작은 값에 1을 빼면 가장 큰 값이 된다.
// ex)
let a: Int8 = Int8.max // 127
let b: Int8 = a &+ 1 // -128
let c: Int8 = Int8.min //-128
let d: Int8 = c &- 1 // 127
비교연산자
비교연산자는 모두 이항연산자
비교연산자의 결과 값은 항상 Boolean이다.
Equal to 연산자 ( == ) - 두 값이 같은지 비교함. 같은 자료형만 비교 가능
Not equal to 연산자 ( != ) - 값이 같지 않아야 true. !를 붙이는 것은 항상 반대라고 이해하면 됨.
Greater than 연산자 ( > ) - 예를들어, a > b 일때 a가 b보다 커야 true.
Greater than or equal 연산자 ( >= ) - a에 저장된 값이 b를 초과하거나 같다면 true.
Less than 연산자 ( < ) - Greater than 연산자와 반대
Less than or equal 연산자 ( <= ) - Greater than or equal 연산자와 반대
Logic Operator(논리연산자)
!false // true
!(a > b)
! - 반대로 바꿈, 참을 거짓으로, 거짓을 참으로. (표현식의 결과를 뒤집을 때는 괄호로 감싸야 한다.)
let a = 10
let b = 20
a > 5 && b > 10 //true
a > 20 && b > 20 //false
&& - and. 두가지 조건 모두 true일 경우에만 true를 return한다.
let a = 10
let b = 20
a > 9 || b > 9 //true
a > 15 || b > 15 //true
a > 15 || b > 25 //false
|| - or. a거나 b중 하나만 true면 true를 return.
Assignment Operator(할당 연산자)
왼쪽 피연산자(LValue)에 오른쪽 피연산자(RValue)의 값을 저장하는 연산자.
쉽게 말해서, " = "
값을 리턴하지 않고 값을 저장한다.
LValue(왼쪽에 있는 값) = 메모리 공간을 나타내는 표션식. 할당 연산자 양쪽에 올 수 있다.
RValue(오른쪽에 있는 값) = 저장하는 값을 나타내는 표현식. 항상 오른쪽에 와야 한다.
LValue는 RValue로 사용될 수 있다. (like, a = b)
var a = 999
// a는 LValue, 999는 RValue
복합할당 연산자
a += b // ( a = a + b )와 같다. a에 a와 b를 더한 값을 저장한다.
a *= b // ( a = a * b )와 같다. a에 a와 b를 곱한 값을 저장한다.
//위의 두개말고도 다양한 종류가 있다. 원리는 모두 같다.
LValue는 항상 메모리 공간을 가지고 있어야하며, RValue는 메모리 공간을 가지고 있지 않아도 된다.
위에서는 변수로 선언했기때문에, 선언과 동시에 메모리 공간이 할당된다.
Range Operator(범위 연산자)
Closed Range Operator
- 단항 연산자로 사용한다면 피연산자와 공백없이 붙여써야 한다.
- 오름차순 범위는 사용할 수 있지만 내림차순 범위는 사용할 수 없다.
- 내림차순 범위를 사용해야 한다면,
(1 ... 10.reversed()
'Language > Swift' 카테고리의 다른 글
Swift 기본 문법 - 데이터 타입 (0) | 2024.09.20 |
---|---|
Swift 기본 문법 - 반복문 (0) | 2024.09.12 |
Swift 기본 문법 - Collection 컬렉션(Array, Dictionary, Set) (0) | 2024.09.12 |
Swift 기본 문법 - 변수와 상수 (2) | 2024.09.12 |
Swift 기본 문법 - CamelCase (0) | 2022.08.09 |
살아남는 iOS 개발자가 되기 위해 끊임없이 노력하고 있습니다.