기본 연산자
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 에서 분기 처리를 위한 제어문의 사용방법에 대해서 알아보겠습니다.
감사합니다. 다음 강의에서 만나요! 
강의 목록





