Golang 연산자를 활용한 데이터 처리

GolangBeginner
지금 연습하기

소개

프로그래밍 언어에서 데이터를 변수에 저장한 후에는 어떻게 처리해야 할까요?

이때 저장된 데이터를 계산하고 가공하기 위해 연산자가 필요합니다. 이번 섹션에서는 다음 내용들을 학습합니다.

학습 포인트:

  • 산술 연산자
  • 관계 연산자
  • 논리 연산자
  • 대입 연산자
이 과정은 단계별 지침을 통해 학습과 실습을 돕는 가이드 랩입니다. 각 단계를 주의 깊게 따라가며 직접 경험을 쌓아보세요. 통계에 따르면 이 랩은 초급 수준이며, 96%의 수료율과 학습자들로부터 100%의 긍정적인 평가를 받았습니다.

기본 형태

산술 연산자는 가장 기본적인 연산자로, 기초적인 계산 방식을 나타냅니다.

연산자 기능
+ 덧셈
- 뺄셈
* 곱셈
/ 나눗셈
% 나머지 (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

위 코드에서는 변수 ab를 바탕으로 관계 비교를 수행했습니다.

변수 값을 직접 수정해 보면서 비교 결과가 어떻게 변하는지 확인하고 관계 연산자를 더 깊이 이해해 보세요.

논리 연산자

논리 연산자란 무엇일까요?

논리 연산자는 관계 연산자의 확장된 형태입니다. 주로 여러 관계 연산자를 결합하여 더 복잡한 조건을 평가할 때 사용합니다.

연산자 관계 설명
&& 논리곱 (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 언어에서 연산자를 사용하는 방법을 살펴보았습니다. 다양한 연산자의 종류와 구체적인 활용 사례를 직접 확인해 보았습니다.