GO

Go언어 기초: 연산자

SeaPlus 2021. 7. 3. 12:05

수식연산자

package main

import "fmt"

func main() {
	num1, num2 := 17, 5
	str1, str2 := "Hello", "goorm!"
	
	fmt.Println("num1 + num2 =", num1+num2)
	fmt.Println("str1 + str2 =", str1+str2)
	fmt.Println("num1 - num2 =", num1-num2)
	fmt.Println("num1 * num2 =", num1*num2)
	fmt.Println("num1 / num2 =", num1/num2)
	fmt.Println("num1 % num2 =", num1%num2)
}




/////////////////////////////결과/////////////////////////////////
num1 + num2 = 22
str1 + str2 = Hellogoorm!
num1 - num2 = 12
num1 * num2 = 85
num1 / num2 = 3
num1 % num2 = 2
+ 피 연산자의 값을 더한다.
- 왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다.
* 피연산자의 값을 곱한다.
/ 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다
% 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지 값을 반환한다.
ex) num := 7 % 2
(num = 1이 할당됨)

 


증감연산자

package main

import "fmt"

func main() {
	count1, count2 := 1, 10.4
	
	count1++
	count2--
	
	fmt.Println("count1++ :", count1)
	fmt.Println("count2-- :", count2)
}




//////////////////////결과///////////////////////////

count1++ : 2
count2-- : 9.4
++ 값을 1 증가시킨다.
-- 값을 1 감소시킨다.

 

 

 


할당연산자

package main

import "fmt"

func main() {
	a := 2
	var num int

	num = a
	fmt.Println("num = a :", num)
	num += 4
	fmt.Println("num += 4 :", num)
	num -= 2
	fmt.Println("num -= 2 :", num)
	num *= 5
	fmt.Println("num *= 5 :", num)
	num /= 2
	fmt.Println("num /= 2 :", num)
	num %= 3
	fmt.Println("num %= 3 :", num)

	num = 3  //00000011
	num &= 2 //00000010
	fmt.Printf("num &= 2 : %08b, %d\n", num, num)
	num |= 5 //00000101
	fmt.Printf("num |= 5 : %08b, %d\n", num, num)
	num ^= 4 //00000100
	fmt.Printf("num ^= 4 : %08b, %d\n", num, num)
	num &^= 2 //00000010
	fmt.Printf("num &^= 2 : %08b, %d\n", num, num)
	num <<= 9 //00001001
	fmt.Printf("num <<= 9 : %08b, %d\n", num, num)
	num >>= 8 //00001000
	fmt.Printf("num >>= 8 : %08b, %d\n", num, num)
}




////////////////////////결과//////////////////////////////////////

num = a : 2
num += 4 : 6
num -= 2 : 4
num *= 5 : 20
num /= 2 : 10
num %= 3 : 1
num &= 2 : 00000010, 2
num |= 5 : 00000111, 7
num ^= 4 : 00000011, 3
num &^= 2 : 00000001, 1
num <<= 9 : 1000000000, 512
num >>= 8 : 00000010, 2
= 변수나 상수에 값을 대입한다.
:= 변수를 선언 및 대입한다.
+= 값을 더한 후 대입한다.
-= 값을 뺀 후 대입한다.
*= 값을 곱한 후 대입한다.
/= 값을 나눈 후 대입한다.
%= 값의 나눗셈 후 나머지를 대입한다.
&= 값의 AND 비트 연산 후 대입한다.
|= 값의 OR 비트 연산 후 대입한다.
^= 값의 XOR 비트 연산 후 대입한다.
&^= 값의 AND NOT 비트 연산 후 대입한다.
<<= 비트를 외쪽으로 이동 후 대입한다.
>>= 비트를 오른쪽으로 이동 후 대입한다.

 

 


논리연산자

package main

import "fmt"

func main() {
	var a bool = true
	b := false

	fmt.Println("0 && 0 : ", b && b)
	fmt.Println("0 && 1 : ", b && a)
	fmt.Println("1 && 1 : ", a && a)
	fmt.Println("0 || 0 : ", b || b)
	fmt.Println("0 || 1 : ", b || a)
	fmt.Println("1 || 1 : ", a || a)

	fmt.Println("!1 ", !true)
	fmt.Println("!0 ", !false)
}



//////////////////////////결과//////////////////////

0 && 0 :  false
0 && 1 :  false
1 && 1 :  true
0 || 0 :  false
0 || 1 :  true
1 || 1 :  true
!1  false
!0  true
&& 연산하는 A와 B모두 ‘참'이면 연산 결과로 ‘참'을 반환합니다.
|| 연산하는 A와B 둘 중 하나라도 '참'이면 연산 결과로 '참'을 반환합니다.
! 연산하는 A가 ‘참'이면 ‘거짓', ‘거짓'이면 ‘참'을 반환합니다.

 

 


관계연산자

package main

import "fmt"

func main() {
	fmt.Println("13 == 13 : ", 13 == 13)
	fmt.Println("13 == 23 : ", 13 == 23)
	fmt.Println("13 != 13 : ", 13 != 13)
	fmt.Println("3 != 5 : ", 3 != 5)
	fmt.Println("0 < 1 : ", 0 < 1)
	fmt.Println("0 > 1 : ", 0 > 1)
	fmt.Println("0 >= 1 : ", 0 >= 1)
	fmt.Println("0 <= 1 : ", 0 <= 1)
}



/////////////////////////결과 ////////////////////////////
13 == 13 :  true
13 == 23 :  false
13 != 13 :  false
3 != 5 :  true   
0 < 1 :  true    
0 > 1 :  false   
0 >= 1 :  false  
0 <= 1 :  true   
== 두 값이 같은지 비교한다.
!= 두 값이 다른지 비교한다.
< 오른쪽 값이 큰지 비교한다.
<= 오른쪽 값이 크거나 같은지 비교한다.
> 왼쪽 값이 큰지 비교한다.
>= 왼쪽 값이 크거나 같은지 비교한다.

 

 


비트연산자

package main

import "fmt"

func main() {
	num1 := 15 //00001111
	num2 := 20 //00010100

	fmt.Printf("num1 & num2 : %08b, %d\n", num1&num2, num1&num2)
	fmt.Printf("num1 | num2 : %08b, %d\n", num1|num2, num1|num2)
	fmt.Printf("num1 ^ num2 : %08b, %d\n", num1^num2, num1^num2)
	fmt.Printf("num1 &^ num2 : %08b, %d\n", num1&^num2, num1&^num2)

	fmt.Printf("num1 << 4 : %08b, %d\n", num1<<4, num1<<4)
	fmt.Printf("num2 >> 2 : %08b, %d\n", num2>>2, num2>>2)
}




//////////////////////결과////////////////////
num1 & num2 : 00000100, 4 
num1 | num2 : 00011111, 31
num1 ^ num2 : 00011011, 27 
num1 &^ num2 : 00001011, 11
num1 << 4 : 11110000, 240
num2 >> 2 : 00000101, 5
& 두 값을 비트 단위로 AND 연산을 한다.
| 두 값을 비트 단위로 OR 연산을 한다.
^ 두 값을 비트 단위로 XOR 연산을 한다.
&^ 두 값을 비트 단위로 AND NOT 연산을 한다.
<< 값의 비트 열을 왼쪽으로 이동시킨다.
>> 값의 비트 열을 오른쪽으로 이동시킨다.

 

 


채널 연산자

package main

import "fmt"

func main() {
	ch := make(chan int) //정수형 채널 생성

	go func() {
		ch <- 10
	}() //채널에 10을 보냄

	result := <-ch //채널로부터 10을 전달받음
	fmt.Println(result)
}


///////////////////결과/////////////////////
10
<- 채널의 수신을 연산한다. 채널에 값을 보내거나 가져온다.

 

 


포인터 연산자

package main

import "fmt"

func main() {
	var num int = 5 // num을 5로 초기화
	var pnum = &num // pnum에 num의 주소값을 할당

	fmt.Println("num : ", num)   //num 값
	fmt.Println("pnum :", pnum)  //num의 메모리 주소
	fmt.Println("pnum :", *pnum) //num의 주소로 메모리에 할당돼있는 값 접근

	*pnum++ //num의 주소에 할당되있는 값을 증감연산한다.
	fmt.Println("num : ", num)
	fmt.Println("pnum :", *pnum)
	//포인터 연산자를 이용한 값 변경
}



/////////////////////////결과///////////////////////
num :  5
pnum : 0xc000012088
pnum : 5
num :  6
pnum : 6
(pnum = &num) 변수의 메모리 주소를 참조한다.
(pnum 과 같은 변수를 "포인터 변수" 라고 부른다.) 
(*pnum) 포인터 변수에 저장된 메모리에 접근하여 값을 참조한다.