산술 연산자 (Arithmetic Operator)
구분 | 연산자 | 연산 | 피연산자 타입 |
사칙연산과 나머지 | + | 덧셈 | 정수, 실수, 복소수, 문자열 |
- | 뺄셈 | 정수, 실수, 복소수 | |
* | 곱셈 | 정수, 실수, 복소수 | |
/ | 나눗셈 | 정수, 실수, 복소수 | |
% | 나머지 | 정수 | |
비트 연산 | & | AND | 정수 |
| | OR | 정수 | |
^ | XOR | 정수 | |
&^ | 비트 클리어 | 정수 | |
시프트 연산 | << | 왼쪽 시프트 | 정수 << 양의 정수 |
>> | 오른쪽 시프트 | 정수 >> 양의 정수 |
- Go 언어에서는 모든 연산자의 각 항의 타입은 항상 같아야 한다.
- 그래서 서로 다른 타입의 연산을 하기위해서는 형변환을 통해 타입을 같도록 맞추고 연산해야 한다.
- 연산의 결과 타입도 인수 타입과 같다.
- 정수 타입과 정수 타입을 더하면 같은 정수 타입이 반환됨.
비교 연산자 (Comparison Operator)
연산자 | 설명 | 반환값 |
== | 같다. | 참이면 true, 거짓이면 false |
!= | 다르다 | |
< | 작다 | |
> | 크다 | |
<= | 작거나 같다 | |
>= | 크거나 같다 |
- 비교 연산자는 분기문(if문, switch문)과 반복문(for문)에서 주로 사용한다.
정수 오버플로
정수가 정수 타입의 범위를 벗어난 경우 비정상으로 변화하는 현상을 오버플로라고 한다.
- int8 타입에서 127에 +1을 하면 128이 아니라 -128이 됨.
- 그래서 x가 정수 타입일 때 x < x + 1을 항상 만족(true)하지 못할 수 있다.
정수 언더플로
오버플로의 반대로 정수 타입이 표현할 수 있는 가장 작은 값에서 -1을 했을 때 가장 큰 값으로 바뀌는 현상을 언더플로라고 한다.
- int8 타입에서 -128에 -1을 하면 -129가 아니라 127이 됨.
정수 타입은 값의 경계에서 오버플로와 언더플로가 발생하기 때문에 연산할 때 항상 경계값에 주의하여야 한다.
실수끼리 비교
package main
import "fmt"
func main() {
var a float64 = 0.1
var b float64 = 0.2
var c float64 = 0.3
fmt.Printf("%f + %f == %f : %v\\n", a, b, c, a+b == c)
fmt.Println(a + b)
}
위 코드를 실행하면 0.1 + 0.2 == 0.3의 결괏값이 false로 출력된다.
이는 float64 표현 방식으로 생긴 오차때문에 발생한다.
float 표현은 이런 오차를 가지고 있기 때문에 == 연산 시 예기치 못한 오류가 발생할 수 있다.
논리 연산자 (Logical Operator)
&& | AND | 양변이 모두 true이면 true를 반환한다. |
|| | OR | 양변 중 하나라도 true이면 true를 반환한다. |
! | NOT | true이면 false를 반환하고 false이면 true를 반환한다. |
대입 연산자 (Assignment Operator)
우변값을 좌변 (메모리 공간)에 복사한다. 좌변은 반드시 저장할 공간이 있는 변수가 와야한다.
var a int
var b int
a = b = 10
- b = 10 구문은 어떤 결과도 반환하지 않기 떄문에 다시 a에 대입할 수 없다. (오류 발생)
따라서 아래같이 두 줄로 나타내야 한다.
var a int
var b int
b = 10
a = b
복수 대입 연산자
var a int = 10
var b int = 20
a, b = b, a
- a와 b의 값을 서로 바꾼다.
복합 대입 연산자
var a = 10
a = a + 2
- 변수 a 선언 후 10으로 초기화하고 2를 더한결과를 다시 a에 대입함.
아래와 같이 줄여 쓸 수 있음.
var a = 10
a += 2
여기서 += 를 복합 대입 연산자라고 한다.
모든 산술 연산자는 다 복합 대입 연산자로 쓸 수 있다.
증감 연산자 (Increment Operator)
변숫값을 1 증가하거나 1 감소하는 구문은 자주 사용되기 때문에 Go언어에서는 특별한 증감문을 제공한다.
++ | 정수 타입 변수뒤에 붙여쓰며, 해당 변숫값을 1 증가시킨다. |
-- | 정수 타입 변수뒤에 붙여쓰며, 해당 변숫값을 1 감소시킨다. |
증감문 역시 값을 반환하지 않기 때문에 b = a++는 오류가 발생한다.
- Go 언어에서는 개발자의 혼란을 막기위해 전위 증감 연산자를 지원하지 않는다.
- 즉, ++a는 사용하지 못하고 a++만 가능하다.
그 외 연산자
연산자 | 설명 |
[] | 배열의 요소에 접근할 때 사용 |
. | 구조체나 패키지요소에 접근할 때 사용 |
& | 변수의 메모리 주솟값을 반환 |
* | 포인터 변수가 가리키는 메모리 주소에 접근 |
… | 슬라이스 요소들에 접근하거나 가변 인수를 만들 때 사용 |
: | 배열의 일부분을 집어올 때 사용 |
← | 채널에서 값을 빼거나 넣을 때 사용 |
연산자 우선순위
우선순위가 높은 연산자가 먼저 계산된다.
- 우선순위가 같으면 좌측부터 우측으로 연산된다.
우선순위 | 연산자 |
5 | * / % << >> & &^ |
4 | + - |
3 | == != < <= > >= |
2 | && |
1 |
'Programming > Go' 카테고리의 다른 글
[Golang] 상수 (Const) (0) | 2022.10.29 |
---|---|
[Golang] 함수 (Function) (1) | 2022.10.29 |
[Golang] 표준 입출력 (0) | 2022.10.23 |
[Golang] 변수 (0) | 2022.10.22 |
[Golang] 코드 실행과정 (0) | 2022.10.17 |