본문으로 바로가기

[Golang] 연산자 (Operator)

category Programming/Go 2022. 10. 29. 15:13

산술 연산자 (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