다른언어에서도 많은 연산자가 존재하듯이 Go에도 여러가지의 연산자가 존재한다.
여러 연산자를 알아야 앞으로 프로그래밍을 진행해 나갈수 있으므로 연산자에 대해서 알아보도록 하자.
부호 연산자 : +, -
package main
import "fmt"
func main() {
a := 10
fmt.Println(+a, -a)
}
부호 연산자는 단항연산자로 해당 변산자의 부호를 바꿀 수 있다.
+연산자는 사실상 사용하지 않는다고 봐도 무방하다.
산술 연산자 : -, +, *, /, %
package main
import "fmt"
func main() {
a := 10
b := 3
fmt.Println(a + b)
fmt.Println(a - b)
fmt.Println(a * b)
fmt.Println(a / b)
fmt.Println(a % b)
}
나머지 연산자는 여러분들이 잘 아는 연산자는 여러분들이 잘 알지만 마지막 연산자는 모를 수 도 있다.
라지만 어자피 여러분들 중에 go가 첫 언어인 사람은 없을 것이므로 뭔지 모를 일은 없을 것 같다.
%연산자는 나머지 연산자이다.
연산 결과 값을 보면 /연산의 결과가 3.333이 아니라 3이다.
이는 값이 int와 int의 연산 결과가 int로 나와서 그렇다. 따라서 여러분이 원하는게 3.333이라면 int와 float의 연산으로 바꿔줘야한다.
package main
import "fmt"
func main() {
a := 10
b := 3
fmt.Println(a + b)
fmt.Println(a - b)
fmt.Println(a * b)
fmt.Println(float32(a) / float32(b))
fmt.Println(a % b)
}
이렇게 정수형을 실수형으로 업그레이드 시켜서 계산하면 서로 실수형이 되므로 계산결과도 실수로 나오게된다.
제대로 값이 나오는 것을 확인할 수 있다.
비교 연산자(관계 연산자) : ==, !=, <=, >=, <, >
package main
import "fmt"
func main() {
a := 10
b := 3
fmt.Println(a == b)
fmt.Println(a != b)
fmt.Println(a <= b)
fmt.Println(a >= b)
fmt.Println(a < b)
fmt.Println(a > b)
}
비교연산자는 총 6개가 존재한다.
순서대로
a가 b와 같다
a와 b가 같지 않다
a가 b 이하이다
a가 b 이상이다
a가 b 미만이다
a가 b초과이다.
이다.
첫번째꺼는 아마 처음보는 사람들은 많이 왜 동등이 =가 아니지?라고 할 수 있다.
라지만 아마도 이걸 처음보는 사람은 없을거 같다.. 오히려 반대로 현실에서 동등의 뜻을 ==로 쓰는 경지에 오른 사람들이 이거 보고 있을거니까.
수학에서 a = b라는 꼴은 a와 b는 항등식이다이므로 같다는 뜻이다.
그러나 컴퓨터언어에서 a = b꼴은 a에 b값을 할당해라는 뜻이다.
int a = 5;라는 구문은 a와 5는 같다, 라는 뜻이 아니라 a에 5를 할당해라는 뜻이다.
즉 둘을 비교하는 연산자가 아니라는 뜻이다.
그리고 비교연산자들의 값은 무조건 true아니면 false인 부울린 값으로 나오게 된다.
값이 제대로 나오는지 확인하자.
논리 연산자 : &&, ||, !
package main
import "fmt"
func main() {
a := true
b := false
fmt.Println(a && b)
fmt.Println(a || b)
fmt.Println(!a)
}
논리 연산자는 3개가 존재한다. 각각 and와 or과 not으로 묶이며 님들이 아시는 그 불대수식과 동등하다.
모르시는 분들을 위해서 설명을 첨언하자면
A and B의 경우 A와 B 모두가 참이여야만 참이나오고
A or B의 경우 A나 B 둘중하나가 참이면 참이나온다.
!의 경우 참이면 거짓으로 거짓이면 참을 바꿔주는 단항 연산자이다.
이렇게 말하면 햇갈릴거 같으니까 한국말로 번역하자면 A and B는 A면서 B일경우이고
A or B는 A거나 B일 경우이며 not A는 A가 아닌경우라는 뜻이다.
그래도 다들 수학 하셨으니까 모르시는분은 없을거라 믿는다.
그리고 고등학교 수학을 마쳤으면 다른건 몰라도 전부 집합 마스터지않나?? 집합이 1장에 있으니까.
논리연산자 역시 위의 비교연산자처럼 연산결과가 부울린 값으로 나온다.
한쪽이 true과 한쪽은 false다.
그러면 and연산은 당연히 false이며 or은 true이고 true의 반대는 false가 된다.
증감 연산자 : ++, --
package main
import "fmt"
func main() {
a := 10
b := 20
a++
fmt.Println(a)
b--
fmt.Println(b)
}
증감연산자는 1올리거나 1내리는 연산자이다.
++의 경우 1을 올리고 --는 1을 내린다.
go에서는 다른 언어의 증감 연산자와는 조금 다른데 전위, 후위의 구분이 없다.
그리고 값이 반환되지 않기 때문에 println등에 바로 쓸 수 없다.
대입 연산자 : =, +=, -=, /=, *=, %= ...
package main
import "fmt"
func main() {
a := 10
b := 10
c := 10
d := 10
e := 10
f := 10
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
fmt.Println(f)
a = 3
b += 3
c -= 3
d /= 3
e *= 3
f %= 3
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
fmt.Println(f)
}
대입연산자는 =과 (단항연산자)= 조합들이 있다.
먼저 대입 연산자는 오른쪽 항에 존재하는 값을 왼쪽 항에 대입한다. 왼쪽항 값을 연산결과로 내놓는다.
나머지는 만약 a += 5라는 식이 있다면 a = a + 5가 된다. 나머지 역시 같다.
포인터 연산 : *, 주소 연산 : &
package main
import "fmt"
func main() {
a := 10
b := &a
fmt.Println(&a)
fmt.Println(*b)
}
&연산자는 해당 변수가 메모리상으로 저장되어있는 주소를 반환한다.
*연산자는 해당 포인터 변수가 가지고있는 원래 값을 반환한다.
포인터에 대해서는 할말이 엄청 많으므로 여기서는 간단하게 말하고 생략하겠다.
'Programming > Go' 카테고리의 다른 글
[Go-06]switch(스위치) (0) | 2018.08.31 |
---|---|
[Go-05]조건문 (0) | 2018.08.31 |
[Go-03]상수 (0) | 2018.08.31 |
[Go-02]변수 (0) | 2018.08.31 |
[Go-01]Hello world! (0) | 2018.08.13 |