개요
이번 블로그 포스트에서는 Golang에서 사용할 수 있는 연산자들에 대해서 살펴보도록 하겠습니다. 이 블로그 포스트에서 소개하는 코드는 다음 링크를 통해 확인하실 수 있습니다.
사칙 연산자
Golang에서는 다음과 같은 사칙 연산을 사용할 수 있습니다.
+
: 덧셈 (정수, 실수, 문자열)-
: 뺄셈 (정수, 실수)*
: 곱셈 (정수, 실수)/
: 나눗셈 (정수, 실수)%
: 나머지 (정수만 가능)
main.go
파일을 생성하여 다음과 같이 코드를 작성하여 확인할 수 있습니다.
package main
import "fmt"
func main() {
a := 6
b := 5
fmt.Println("Result:", a+b)
fmt.Println("Result:", a-b)
fmt.Println("Result:", a*b)
fmt.Println("Result:", a/b)
fmt.Println("Result:", a%b)
}
이렇게 작성한 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Result: 11
Result: 1
Result: 30
Result: 1
Result: 1
비트 연산자
Golang에서는 다음과 같은 비트 연산을 사용할 수 있습니다.
&
: AND 비트연산 (정수)|
: OR 비트연산 (정수)^
: XOR 비트연산 (정수)&^
: 비트 클리어 (정수)
main.go
파일을 수정하여 다음과 같이 코드를 작성하여 확인할 수 있습니다.
package main
import "fmt"
func main() {
a := 6
b := 5
fmt.Printf("Result: %08b\n", a&b)
fmt.Printf("Result: %08b\n", a|b)
fmt.Printf("Result: %08b\n", a^b)
fmt.Printf("Result: %08b\n", a&^b)
}
이렇게 작성한 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Result: 00000100
Result: 00000111
Result: 00000011
Result: 00000010
시프트 연산자
<<
: 왼쪽 시프트 (양의 정수)>>
: 오른쪽 시프트 (양의 정수)
main.go
파일을 수정하여 다음과 같이 코드를 작성하여 확인할 수 있습니다.
package main
import "fmt"
func main() {
a := 6
fmt.Printf("Result: %08b\n", a)
fmt.Printf("Result: %08b\n", a<<2)
fmt.Printf("Result: %08b\n", a>>1)
}
이렇게 작성한 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Result: 00000110
Result: 00011000
Result: 00000011
비교 연산자
==
: 같다!=
: 다르다<
: 작다>
: 크다<=
: 작거나 같다>=
: 크거나 같다
main.go
파일을 수정하여 다음과 같이 코드를 작성하여 확인할 수 있습니다.
package main
import "fmt"
func main() {
a := 6
b := 5
fmt.Println("Result:", a == b)
fmt.Println("Result:", a != b)
fmt.Println("Result:", a < b)
fmt.Println("Result:", a > b)
fmt.Println("Result:", a <= b)
fmt.Println("Result:", a >= b)
}
이렇게 작성한 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Result: false
Result: true
Result: false
Result: true
Result: false
Result: true
논리 연산자
&&
: AND 연산자||
: OR 연산자!
: NOT 연산자
main.go
파일을 수정하여 다음과 같이 코드를 작성하여 확인할 수 있습니다.
package main
import "fmt"
func main() {
a := true
b := false
fmt.Println("Result:", a && b)
fmt.Println("Result:", a || b)
fmt.Println("Result:", !a)
}
이렇게 작성한 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Result: false
Result: true
Result: false
대입 연산자
Golang에서는 다음과 같이 대입 연산자를 사용할 수 있습니다.
a = 1
a, b = 1, 2
대입 연산자를 다음과 같이 사용하면, 두 변수의 값을 교환할 수 있습니다.
a, b = b, a
복합 대입 연산자
Golang에서는 다음과 같이 연산과 동시에 값을 대입할 수 있습니다.
+=
: a += 1 / a = a + 1-=
*=
/=
%=
&=
|=
^=
<<=
>>=
증감 연산자
++
: a ++ / a = a + 1--
증감 연산자는 값을 반환하지 않는다. 따라서 다음과 같이 사용할 수 없습니다.
b = a++
연산자 우선 순위
Golang의 연산자는 다음과 같이 우선 순위를 가지고 있습니다.
우선 순위 | 연산자 |
---|---|
1 | * , / , % , << , >> , & , &^ |
2 | + , - , | , ^ |
3 | == , != , < , <= , > , >= |
4 | && |
5 | || |
물론, 괄호((,)
)안에 식이 가장 먼저 실행됩니다.
Nextafter
비트로는 실수를 정확히 표현할 수가 없습니다. 그래서 실수를 표현할 때는, 원래 수보다 1비트 크거나 1비트 작은 근접수로 실수를 표현한다.
package main
import (
"fmt"
"math"
)
func main() {
var a float64 = 0.1
var b float64 = 0.2
var c float64 = 0.3
fmt.Printf("%0.18f\n", c)
fmt.Printf("%0.18f\n", a+b)
fmt.Printf("%0.18f == %0.18f (%v)\n", c, a+b, c == a+b)
}
위와 같이 프로그램을 작성하고 실행해 보면, 다음과 같은 결과를 확인할 수 있습니다.
0.299999999999999989
0.300000000000000044
0.299999999999999989 == 0.300000000000000044 (false)
기대했던 결과와는 다르게 false
가 표시되는 것을 확인할 수 있습니다.
이를 해결하기 위해서는 우리는 math
패키지의 Nextafter
함수를 사용할 필요가 있습니다.
fmt.Printf("%0.18f == %0.18f (%v)\n", c, a+b, c == math.Nextafter(a+b, c))
이를 실행해보면 다음과 같은 결과를 얻을 수 있습니다.
0.299999999999999989 == 0.300000000000000044 (true)
Nextafter
는 전달받은 두 수중에서, 앞에 수를 뒤에 수를 향해 1비트만큼 이동한 값을 반환합니다. 따라서, 정확하게 실수의 값을 비교할 수 있습니다.
완료
이것으로 Golang에서 사용할 수 있는 연산자에 대해서 살펴보았습니다. 다른 프로그래밍 언어와 대부분 동일하므로, 다른 언어를 공부해보신 분들은 쉽게 이해할 수 있는 부분이라고 생각합니다.
다만, 실수를 비교할 때, 실수의 오차를 고려하여 Nextafter
를 사용해야함을 기억해둘 필요가 있습니다.
제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!
앱 홍보
Deku
가 개발한 앱을 한번 사용해보세요.Deku
가 개발한 앱은 Flutter로 개발되었습니다.관심있으신 분들은 앱을 다운로드하여 사용해 주시면 정말 감사하겠습니다.