이 글은 골든래빗 《Tucker의 Go 언어 프로그래밍》의 06장 써머리입니다.
06 연산자
6.1 산술 연산자
표 산술 연산자
6.1.1 연산의 결과 타입
- Go는 초 강타입 언어이기 때문에 모든 연산자의 각 항의 타입은 항상 같아야 한다(시프트 연산 제외).
- 타입 변환을 통해 타입을 맞춰준 이후 연산해야 한다.
- 결과 또한 인수의 타입과 같다.
6.1.2 비트 연산자
&
, |
, ^
, &^
는 비트 단위로 연산하는 비트 연산자이다.
- 비트 연산자는 각 비트 단위로 연산을 수행한다.
- 비트연산은 정수값을 2진수로 변환한 뒤 계산된다.
6.1.3 시프트 연산자
- 비트를 왼쪽 또는 오른쪽으로 밀거나 당기는 연산자이다.
<<
왼쪽 시프트와 >>
오른쪽 시프트 지원
6.2 비교 연산자
- boolean을 반환
비교 연산자를 사용할 때 주의사항!
1. 정수 오버플로우
2. 정수 언더플로우
3. 실수끼리 비교
6.2.1 정수 오버플로우
- 정수가 정수 타입의 범위를 벗어난 경우 값이 비정상적으로 변화하는 현상을 말한다.
- x가 정수일때 x < x + 1 이 false가 될 수 있다.
- ex) int8은 -128~127까지 표현이 가능한데, x가 127인 경우 x+1는 -128이 된다.
6.2.2 정수 언더플로우
- ex) int8은 -128~127까지 표현이 가능한데, x가 -128인 경우 x-1는 127이 된다.
6.2.3 float 비교 연산
- 실수끼리의 == 연산에서 의도치 않은 결과가 나올 수 있다.
- ex) 0.1 + 0.2 == 0.3 (false)
6.3 실수 오차
- 컴퓨터는 실수를 완벽하게 표현할 수 없기 때문에(4.7.2) 오차가 발생할 수밖에 없다.
6.3.1 작은 오차 무시하기
- epsilon이라는 매우 작은 값의 상수를 사용하여 연산시 그보다 작은 차이는 무시하도록 코딩하는 방법이 있다.
6.3.2 오차를 없애는 더 나은 방법
- Math 패키지에서 제공하는 Nexafter()를 사용한다.
6.4 논리 연산자
&&(AND)
, ||(OR)
, !(NOT)
연산자를 제공한다.
&& (AND 논리 연산자)
- 둘 다 true일 때 true
|| (OR 논리 연산자)
- 둘 중 하나가 true일 때 true
! (NOT 논리 연산자)
- 피연산자가 하나 오는 단항 연산자
- !true == false, !false == true
6.5 대입 연산자
=
우변값을 좌변에 복사한다.
- 대입 연산자는 어떤 결과도 반환하지 않는다.
6.5.1 복수 대입 연산자
- 여러 값을 한 번에 대입할 수 있다.
- 이때, 우변과 좌변 개수를 맞춰줘야함
- ex1) a, b = 3, 4
- ex2) a, b = b, a (a, b 값을 서로 바꿈)
6.5.2 복합 대입 연산자
- 모든 산술 연산자는 복합 대입 연산자로 사용 가능하다.
- +=, -=, *= 등 사용 가능!
6.5.3 증감 연산자
- 변수값을 1 증가시키거나 1 감소시킴
a++
은 a += 1
과 같고,a--
는 a -= 1
과 같다.
++a
, --a
는 없다!
6.5.4 그 외 연산자
<-
중요!
6.6 연산자 우선순위
- 높은 우선순위부터 차례대로 계산된다.