기본 연산자
Go 언어는 다른 언어들과 마찬가지로 각종 계산을 위한 다양한 연산자를 지원하고 있습니다.
오늘은 그 연산자들의 종류와 사용방법에 대해서 알아보겠습니다.
산술 연산자 (Arithmetic operator)
산술 연산자는 사칙 연산자와 증감 연산자를 나타냅니다.
package main
import "fmt"
func main() {
var a int
// 더하기 연
a = 1 + 1
fmt.Println(a) // 2
// 빼기 연산
a = 2 - 1
fmt.Println(a) // 1
// 곱하기 연산자
a = 3 * 1
fmt.Println(a) // 3
// 나누기 연산자
a = 4 / 2
fmt.Println(a) // 2
// 나머지 연산자
a = 1 % 4
fmt.Println(a) // 1
// 증감 연산자
// 1 증가
b := 5
b++
fmt.Println(b) // 6
// 1 감소
c := 5
c--
fmt.Println(c) // 4
}
Go
복사
주의해야할 점은 Go 언어의 증감 연산자는 다른 언어들과는 다르게 몇가지 제약 사항이 있습니다. 이는 개발 언어를 사용함에 있어서 발생할 수 있는 모호함을 제거하기 위해서 입니다.
아래의 소스코드는 컴파일 오류가 발생하는 증감 연산자의 잘못된 사용 방법에 대한 예제입니다.
package main
func main() {
var a int
i = 1
// Go 언어의 증감 연산자는 값을 반환을 하지 않습니다.
// 따라서 이 다음 라인의 코드는 컴파일 에러를 발생시킵니다.
sum := i++
// Go 언어의 증감 연산자는 전치 연산을 허용하지 않습니다.
// 따라서 이 다음의 라인의 코드도 컴파일 에러를 발생시킵니다.
++i
}
Go
복사
비교 연산자 (Comparison operator)
관계 연산자는 변수간의 크기를 비교하거나 동일한지 여부를 확인하는데 사용합니다.
package main
import "fmt"
func main() {
var a, b int
var c bool
a = 1
b = 2
// a, b 값이 같으면 true 아니면 false
c = a == b
fmt.Println(c) // false
// a 값이 더 크면 true 아니면 false
c = a > b
fmt.Println(c) // false
// a 값이 더 크거나 b 와 같다면 true 아니면 false
c = a >= b
fmt.Println(c) // false
// a 값이 더 작으면 true 아니면 false
c = a < b
fmt.Println(c) // true
// a 값이 더 작거나 b 와 같다면 true 아니면 false
c = a <= b
fmt.Println(c) // true
// a, b 값이 다르면 true 아니면 false
c = a != b
fmt.Println(c) // true
}
Go
복사
논리 연산자 (Logical operator)
논리 연산자는 AND, OR, NOT 등의 논리적인 관계를 표현하는데 사용합니다.
package main
import "fmt"
func main() {
var a, b, c bool
a = true
b = false
// OR 연산자
// a, b 둘 중 하나라도 true 값이면 true
// 모두 false 값이면 false
c = a || b
fmt.Println(c) // true
// AND 연산자
// a, b 둘 중 하나라도 false 값이면 false
// 모두 true 값이면 true
c = a && b
fmt.Println(c) // false
// NOT 연산자
// a 가 true 값이면 false
// a 가 false 값이면 true
c = !a
fmt.Println(c) // false
}
Go
복사
비트 연산자 (Bitwise operator)
비트 연산자는 산술 연산자의 일종으로 비트 단위 연산을 위한 연산자입니다.
package main
import "fmt"
func main() {
var a, b, c int
// ...(상위 비트 표기 생략)
a = 1 // ... 0001
b = 2 // ... 0010
// OR 게이트
// a, b 각각의 비트를 비교하여 하나라도 1이면 1로 설정
c = a | b
fmt.Printf("%04b\n", c) // ... 0011 = 3
// AND 게이트
// a, b 각각의 비트를 비교하여 하나라도 0이면 0으로 설정
c = a & b
fmt.Printf("%04b\n", c) // ... 0000 = 0
// Left Shift
// a 비트 전체를 N번 왼쪽으로 이동
c = a << 2
fmt.Printf("%04b\n", c) // ... 0100 = 4
// Right Shift
// b 비트 전체를 N번 오른쪽으로 이동
c = b >> 1
fmt.Printf("%04b\n", c) // ... 0001 = 0
}
Go
복사
할당 연산자 (Assignment operator)
할당 연산자는 값을 할당하는 = 외에 사칙 연산, 비트 연산을 축약한 연산자입니다.
package main
import "fmt"
func main() {
var a, b int
a = 1
b = 2
// b = b + a
b += a
fmt.Println(b) // 3
// b = b - a
b -= a
fmt.Println(b) // 2
// b = b * a
b *= a
fmt.Println(b) // 2
// b = b >> a
b >>= a
fmt.Println(b) // 1
// b = b | a
b |= a
fmt.Println(b) // 1
// b = b & a
b &= a
fmt.Println(b) // 1
}
Go
복사
주소 연산자 (Address operator)
주소 연산자는 C/C++ 에서 사용하는 포인터와 같이 변수의 주소를 얻어내거나 그 주소가 가르키는 변수의 값을 표현할 때 사용합니다.
단, Go 에서의 주소 연산은 포인터 산술 기능을 포함하고 있지 않습니다.
package main
import "fmt"
func main() {
var a int
a = 1
// 포인터는 변수의 데이터 타입 앞에 * 을 붙혀서 선언합니다.
var b *int
// & 연산자를 이용하여 포인터 변수에 a 변수의 주소값을 할당합니다.
b = &a
// * 연산자를 이용하여 포인터 변수가 가르키는 변수 공간을 참조할 수 있습니다.
*b = *b + 1
fmt.Printf("pointing variable b : %d\n", *b)
fmt.Printf("orginal variable a : %d\n", a)
// Go 에서 포인터 산술 기능은 허용되지 않습니다.
// 따라서 아래의 코드는 컴파일 에러를 발생시킵니다.
b = b + 1
}
Go
복사
수신 연산자 (Receive operator)
이 밖에도 Go 언어에는 수신 연산자라고 불리는 연산자가 존재합니다.
수신 연산자에 대한 내용은 현재는 이해하기 어렵기 때문에 추후에 채널에 대한 내용을 소개할 때 같이 다루도록 하겠습니다.
끝마치며
이번 시간에는 Go 언어에서 사용할 수 있는 연산자에 대해서 알아봤습니다.
다음 강의에서는 Go 에서 분기 처리를 위한 제어문의 사용방법에 대해서 알아보겠습니다.
감사합니다. 다음 강의에서 만나요!
강의 목록