[Golang] 연산자

2021-10-01 hit count image

Golang에서 사용할 수 있는 연산자에 대해서 살펴보도록 하겠습니다.

개요

이번 블로그 포스트에서는 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를 사용해야함을 기억해둘 필요가 있습니다.

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

앱 홍보

책 홍보

블로그를 운영하면서 좋은 기회가 생겨 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통
Posts