[Go] 05. 함수, 상수

2024. 1. 15. 17:00Go

반응형

1. 함수

func Func1(a int, b int) int {
    return a + b
}
  • 함수명의 첫글자가 대문자일 경우 public 함수
  • 함수명 옆 소괄호에 매개변수(parameter)를 설정합니다.
    • 만일 매개변수가 없다면 비워둡니다.
  • 매개변수 소괄호 오른쪽에 반환타입을 설정합니다.
    • 반환타입이 없다면 비워둡니다.
  • 중괄호 안에 함수 수행코드와, 반환타입이 존재할 경우, 마지막 줄에 반환값을 return 합니다.
    • 함수 코드의 시작인 중괄호 { 는 반드시 함수 정의하는 func와 동일한 라인에 작성해야 합니다.
      • 아래와 같이 코드 블록을 작성할 수 없습니다.
        func Func1(a int, b int) int
        { // Error
          return a + b
        }
        
  • 반환값은 여러개 설정할 수 있으며, 여러개일 경우에는 소괄호로 감싸줍니다.
    func Divide(a, b int) (int, bool) {
      if b == 0 {
        return 0, false
      }
      return a / b, true
    }
    
    func main() {
      result, success := Divide(5, 3)
      fmt.Println(result, success) // 1 true
      result2, success := Divide(5, 0)
      fmt.Println(result2, success) // 0 false
    }
    

2. 상수

2.1. 상수

최초로 선언된 후 변하지 않는 값을 정의하거나 코드값을 정의할 때 사용합니다.

정수, 실수, 문자열 등과 같은 primitive(기본 타입값) 만이 상수로 선언될 수 있으며,
구조체, 배열과 같은 타입은 상수로 사용할 수 없습니다.

그 밖의 primitive 타입으로는 bool, rune, complex가 있습니다.


상수는 var키워드 대신 const 키워드를 이용하여 선언합니다.

const ConstValue int = 5

2.2. iota

상수 목록을 iota 키워드를 사용하여 열거형 처럼 정의할 수 있습니다.
iota를 이용하면 증가하는 상수를 편리하게 선언할 수 있습니다.

아래와 같이 작성할 경우, 0부터 시작하여 각각 0, 1, 2로 초기화됩니다.

const (
	APPLE = iota
	BANANA
	GREEN
)

const 내의 상수 목록에서 최초로 iota를 사용할 때, 0으로 설정되는데

코드값을 다르게 적용하고 싶다면 아래와 같이 설정할 수 있고, 아래의 경우 각각 11, 12, 13으로 초기화 됩니다.

const (
	APPLE = iota + 11
	BANANA
	GREEN
)

쉬프트 연산자를 활용하여 10, 20, 40, 80 값을 열거형을 이용하여 초기화할 수도 있습니다.

const (
	C1 = 10 << iota
	C2
	C3
	C4
)

2.3. 타입 없는 상수

Go에서는 타입이 없는 상수를 정의할 수 있습니다.

아래와 같이, 타입없이 상수를 정의하면 타입 상관없이 연산이 가능합니다.

예를들어, 정수값이 들어있는 상수의 경우, 정수값들(int, int8, int32, int64)과 실수(float32, float64, complex32, complex64) 들과 연산이 가능합니다.

const LIMIT = 10

func main() {
	var a int8 = LIMIT * 4
	var a2 int32 = LIMIT * 8
	var a3 float32 = LIMIT * 8
	var a4 complex64 = LIMIT * 8
	var a5 = LIMIT * 2.38

	fmt.Printf("%v, %T\n", a, a)
	fmt.Printf("%v, %T\n", a2, a2)
	fmt.Printf("%v, %T\n", a3, a3)
	fmt.Printf("%v, %T\n", a4, a4)
	fmt.Printf("%v, %T\n", a5, a5)
}
40, int8
80, int32
80, float32
(80+0i), complex64
23.8, float64

실수타입의 상수의 경우,
정수타입에 담을수는 없지만, 변수에 선언된 값이 아닌 이상 정수/실수와 사칙연산은 문제없이 잘 되며
변수로 정의된 정수와는 연산되지 않습니다.

또, float32 타입과 float64 타입 모두와 연산이 가능하고, 그에 따라 리턴값을 받을 수 있습니다.

const PI = 3.14

func main() {
	var b float32 = PI * 2
	var b2 = PI * 1.2
	var b3 = PI + 8

	var c float32 = 8.12
	var b4 = PI * c

	var d = 9.87
	var b5 = PI * d

	//var a = 8
	//var b5 = PI * a		// Error

	fmt.Printf("%v, %T\n", b, b)
	fmt.Printf("%v, %T\n", b2, b2)
	fmt.Printf("%v, %T\n", b3, b3)
	fmt.Printf("%v, %T\n", b4, b4)
	fmt.Printf("%v, %T\n", b5, b5)
}
6.28, float32
3.768, float64
11.14, float64
25.496801, float32
30.991799999999998, float64

2.4. 리터럴

리터럴은 값 자체로 쓰여진 문구입니다.

Go에서는 컴파일될때 상수값이 리터럴로 변환됩니다.
이러한 성질로 인하여 상수 표현식을 활용한 계산은 컴파일시 리터럴로 변환되기 때문에 CPU 자원을 사용하지 않습니다.

예를들어 아래와 같이 작성된 코드에서, 변수 x는

const PI = 3.14
var x = 3.14 * 1000

컴파일 타임에 아래와 같이 변환됩니다

var x = 3140

상수는 컴파일시점에 리터럴로 변환됩니다.
그렇기 때문에 상수의 메모리 주소값에 접근할 수 없습니다
이 특징에 대해서 잘 명심하여, 개발시 유의해야합니다.

728x90
반응형

'Go' 카테고리의 다른 글

[Go] 07. 배열, 구조체  (1) 2024.01.17
[Go] 06. if문, switch문, for문  (0) 2024.01.16
[Go] 03. fmt - 2. 표준입력  (0) 2024.01.14
[Go] 03. fmt - 1. 출력  (0) 2024.01.14
[Go] 01. Go 시작하기  (0) 2023.12.28