소개
프로그래밍 언어에서 데이터를 변수에 저장한 후에는 어떻게 처리해야 할까요?
이때 저장된 데이터를 계산하고 가공하기 위해 연산자가 필요합니다. 이번 섹션에서는 다음 내용들을 학습합니다.
학습 포인트:
- 산술 연산자
- 관계 연산자
- 논리 연산자
- 대입 연산자
프로그래밍 언어에서 데이터를 변수에 저장한 후에는 어떻게 처리해야 할까요?
이때 저장된 데이터를 계산하고 가공하기 위해 연산자가 필요합니다. 이번 섹션에서는 다음 내용들을 학습합니다.
학습 포인트:
산술 연산자는 가장 기본적인 연산자로, 기초적인 계산 방식을 나타냅니다.
| 연산자 | 기능 |
|---|---|
+ |
덧셈 |
- |
뺄셈 |
* |
곱셈 |
/ |
나눗셈 |
% |
나머지 (Modulus) |
home/project/ 디렉토리에 opePractice.go라는 이름의 파일을 생성합니다.
cd ~/project
touch opePractice.go
파일에 다음 코드를 작성합니다.
package main
import "fmt"
func main() {
a := 10
b := 3
fmt.Println("a =", a, "b =", b)
fmt.Println("-----")
// 덧셈, 뺄셈, 곱셈
fmt.Println("a + b =", a+b)
fmt.Println("a - b =", a-b)
fmt.Println("b - a =", b-a)
fmt.Println("a * b =", a*b)
// 나눗셈
// Go 에서 정수끼리 나누면 소수점 이하는 버려집니다.
fmt.Println("a / b =", a/b)
// 하지만 부동 소수점 숫자로 나누면 정확한 결과가 나옵니다.
fmt.Println("10.0 / 3 =", 10.0/3)
// 나머지 연산: 일반적인 형태
fmt.Println("a % b =", a%b)
// 음수가 포함된 나머지 연산
// 계산 방식: 나머지 = 피제수 - (피제수 / 제수) * 제수
fmt.Println("10 % -3 =", 10%-3)
fmt.Println("-10 % 3 =", -10%3)
fmt.Println("-10 % -3 =", -10%-3)
}
코드를 실행하고, 특히 음수 나머지가 어떻게 계산되는지 주의 깊게 살펴보세요.
cd ~/project
go run opePractice.go
a = 10 b = 3
-----
a + b = 13
a - b = 7
b - a = -7
a * b = 30
a / b = 3
10.0 / 3 = 3.3333333333333335
a % b = 1
10 % -3 = 1
-10 % 3 = -1
-10 % -3 = -1
Go 언어에서
++(증가) 와--(감소) 는 독립적인 구문 (Statement) 이며 오직 단독으로만 사용할 수 있습니다. 즉, 다른 연산의 일부로 포함될 수 없습니다.
다음 코드는 잘못된 예시입니다.
var a int = 5
var i int = 0
a = i++ // 잘못된 사용법: 증가는 독립적으로만 사용 가능
a = i-- // 잘못된 사용법: 감소는 독립적으로만 사용 가능
a = ++i // 잘못된 사용법: Go 에는 전위 증가 (pre-increment) 가 없음
a = --i // 잘못된 사용법: Go 에는 전위 감소 (pre-decrement) 가 없음
올바른 문법은 다음과 같습니다.
var i = 0
i++
i++
fmt.Println(i)
opePractice.go에 다음 코드를 작성하세요.
코드를 완성해 봅시다. 증감 연산자를 사용하여 변수 i의 값을 변경하고, 변수 a의 최종 값이 16이 되도록 만드세요.
package main
import "fmt"
func main() {
var a int = 15
var i int = 0
/* 아래에 코드를 작성하세요 */
a = a + i
fmt.Println(a)
// a 의 출력이 16 이 되도록 코드를 완성하세요
}
관계 연산자란 무엇일까요?
관계 연산자는 두 값 사이의 관계를 설명하는 비교 형식입니다. 두 값이 같은지, 혹은 한 쪽이 다른 쪽보다 크거나 작은지를 판단합니다.
| 연산자 | 관계 |
|---|---|
== |
같음 |
!= |
같지 않음 |
> |
크다 |
>= |
크거나 같다 |
< |
작다 |
<= |
작거나 같다 |
위의 연산자들은 조건이 충족되면
true를, 그렇지 않으면false를 반환합니다.
opePractice.go에 다음 코드를 작성하세요.
package main
import "fmt"
func main() {
// 관계 연산자 사용 예시
var a int = 7
var b int = 6
// 같은지 확인
fmt.Println(a == b) //false
// 같지 않은지 확인
fmt.Println(a != b) //true
// a 가 b 보다 큰지 확인
fmt.Println(a > b) //true
// a 가 b 보다 크거나 같은지 확인
fmt.Println(a >= b) //true
// a 가 b 보다 작은지 확인
fmt.Println(a < b) //false
// a 가 b 보다 작거나 같은지 확인
fmt.Println(a <= b) //false
// 1 이 1 과 같은지 확인
judgeValue := 1 == 1 //true
fmt.Println(judgeValue)
}
코드를 실행합니다.
cd ~/project
go run opePractice.go
위 코드에서는 변수 a와 b를 바탕으로 관계 비교를 수행했습니다.
변수 값을 직접 수정해 보면서 비교 결과가 어떻게 변하는지 확인하고 관계 연산자를 더 깊이 이해해 보세요.
논리 연산자란 무엇일까요?
논리 연산자는 관계 연산자의 확장된 형태입니다. 주로 여러 관계 연산자를 결합하여 더 복잡한 조건을 평가할 때 사용합니다.
| 연산자 | 관계 | 설명 |
|---|---|---|
&& |
논리곱 (AND) | 두 피연산자가 모두 true일 때 결과가 true가 됨 |
|| |
논리합 (OR) | 피연산자 중 하나라도 true이면 결과가 true가 됨 |
! |
부정 (NOT) | 조건이 false이면 결과가 true가 됨 |
opePractice.go에 다음 코드를 작성하세요.
package main
import (
"fmt"
)
func main() {
// 논리 AND 연산자 && 시연
var age int = 18
if age > 15 && age < 30 {
fmt.Println("나이가 15 세에서 30 세 사이입니다.")
}
if age > 30 && age < 80 {
fmt.Println("나이가 30 세에서 80 세 사이입니다.")
}
// 논리 OR 연산자 || 시연
if age > 15 || age < 30 {
fmt.Println("나이가 15 세보다 크거나 30 세보다 작습니다.")
}
if age > 30 || age < 40 {
fmt.Println("나이가 30 세보다 크거나 40 세보다 작습니다.")
}
// 논리 NOT 연산자 ! 시연
if age > 30 {
fmt.Println("나이가 30 세보다 많습니다.")
}
if !(age > 30) {
fmt.Println("나이가 30 세보다 많지 않습니다.")
}
}
위 코드에서는 age 변수값 18을 기준으로 일련의 논리 평가를 수행했습니다.
코드를 실행합니다.
cd ~/project
go run opePractice.go
나이 변수 값을 변경하고 코드를 다시 실행하여 출력 결과가 어떻게 달라지는지 관찰해 보세요.
논리 AND 및 논리 OR 연산자를 사용할 때, Go 는 연산자 양쪽의 불리언 값을 확인해야 합니다. 그렇다면 어느 쪽이 먼저 평가될까요?
함께 알아봅시다.
opePractice.go에 다음 코드를 작성하세요.
package main
import "fmt"
func leftFunc(flag bool) bool {
fmt.Println("왼쪽 함수가 호출되었습니다!")
return flag
}
func rightFunc(flag bool) bool {
fmt.Println("오른쪽 함수가 호출되었습니다!")
return true
}
func main() {
if leftFunc(true) && rightFunc(true) {
fmt.Println("평가가 완료되었습니다.")
}
}
코드를 실행합니다.
cd ~/project
go run opePractice.go
왼쪽 함수가 호출되었습니다!
오른쪽 함수가 호출되었습니다!
평가가 완료되었습니다.
논리 AND 연산에서는 왼쪽 피연산자가 먼저 평가된 후 오른쪽 피연산자가 평가된다는 것을 쉽게 알 수 있습니다.
그렇다면 논리 OR 연산은 어떨까요? opePractice.go에 다음 코드를 작성하세요.
package main
import "fmt"
func leftFunc(flag bool) bool {
fmt.Println("왼쪽 함수가 호출되었습니다!")
return flag
}
func rightFunc(flag bool) bool {
fmt.Println("오른쪽 함수가 호출되었습니다!")
return true
}
func main() {
if leftFunc(true) || rightFunc(true) {
fmt.Println("논리 OR 평가가 완료되었습니다.")
}
}
코드를 실행합니다.
cd ~/project
go run opePractice.go
왼쪽 함수가 호출되었습니다!
논리 OR 평가가 완료되었습니다.
논리 AND 와 논리 OR 연산 모두 평가 순서는 왼쪽에서 오른쪽으로 진행됩니다.
하지만 논리 OR 연산의 경우, 왼쪽 피연산자가 true이면 오른쪽 피연산자는 아예 평가하지 않습니다 (단락 평가).
따라서 실제 개발 시에는 true가 될 가능성이 더 높은 조건을 논리 OR 연산자의 왼쪽에 배치함으로써 프로그램의 실행 시간을 단축할 수 있습니다.
이전 실습에서 우리는 대입 연산자를 자주 사용해 왔습니다. 대입 연산자의 핵심 기능은 표현식의 값을 왼쪽 피연산자에 할당하는 것입니다.
왼쪽 피연산자 (Left-hand Operand): 대입 연산자 (=) 의 왼쪽에 위치하며 값을 기록할 수 있는 표현식이나 변수를 의미합니다.
실제 개발에서는 한 변수에 다른 값을 더하거나 빼는 작업이 빈번하게 발생합니다.
지금까지 배운 내용을 바탕으로 하면 다음과 같이 코드를 작성할 수 있습니다.
x = x + 1
이런 형태의 코드는 매우 흔하기 때문에 Go 에서는 다음과 같은 축약형을 제공합니다.
x += 1
마찬가지로 자주 사용되는 대입 연산자는 다음과 같습니다.
| 연산자 | 설명 |
|---|---|
= |
기본 대입 연산자 |
+= |
더한 후 대입 |
-= |
뺀 후 대입 |
*= |
곱한 후 대입 |
/= |
나눈 후 대입 |
%= |
나머지를 구한 후 대입 |
opePractice.go에 다음 코드를 작성하세요.
package main
import "fmt"
func main() {
x := 11
fmt.Println("x 의 초기값:", x)
x += 5 // x = x + 5
fmt.Println("x += 5 실행 후 값:", x)
x -= 5 // x = x - 5
fmt.Println("x -= 5 실행 후 값:", x)
x *= 5 // x = x * 5
fmt.Println("x *= 5 실행 후 값:", x)
x /= 5
fmt.Println("x /= 5 실행 후 값:", x)
x %= 3
fmt.Println("x %= 3 실행 후 값:", x)
}
위 코드에서는 변수 x에 초기값 11을 할당하고 기본 산술 (덧셈, 뺄셈, 곱셈), 나눗셈, 나머지 계산을 수행했습니다.
코드를 실행합니다.
cd ~/project
go run opePractice.go
변수 값을 변경해 보면서 대입 연산자가 어떻게 작동하는지 확인해 보세요.
이번 실습에서 배운 내용을 복습해 봅시다.
이 실습을 통해 Go 언어에서 연산자를 사용하는 방법을 살펴보았습니다. 다양한 연산자의 종류와 구체적인 활용 사례를 직접 확인해 보았습니다.