[GoLang] 변수,함수,상수

Pyo·2023년 10월 26일
0


이 글은 Tucker의 Go언어 프로그래밍의 변수,함수,상수를 공부하고 정리한 내용이다.

변수

변수란 값을 저장하는 메모리 상의 공간. 값에 접근해 값을 변경하는데 사용한다. 변수는 이름,값,타입,주소 속성을 갖는다. 변수 간 값의 전달은 항상 복사로 일어난다.

변수 선언

	var a int = 10	// a 변수 선언
    var msg string = "Hello Variable"	// msg 변수 선언

	a = 20	// a값 변경
    msg = "Good Morning" // msg값 변경
    fmt.Println(msg,a)	// 출력 : Good Morning,20

변수 선언은 컴퓨터에게 값을 저장할 공간을 마련하고,명령을 내리는 것. 이것을 메모리 할당이라고 한다.

var a int = 10 

// var : 키워드
// a : 변수명
// int : 타입 
// 10 : 초기값

변수의 속성

  • 이름 : 프로그래머는 이름을 통해 값이 저장된 메모리 공간에 손쉽게 접근 할수 있다.
  • 값 : 변수가 가리키는 메모리 공간에 저장된 값이다.
  • 주소 : 변수가 저장된 메모리 공간의 시작 주소를 말한다.
  • 타입 : 변수값의 형태를 말한다. 정수,실수,문자열등 다양한 타입이 있다. (불리언,문자열,배열,슬라이스,구조체,포인터,함수,인터페이스,맵,채널)

타입을 가지는 이유

  • 타입은 공간 크기를 나타내고, 변수는 메모리 주소를 가리킨다. 해당 메모리 주소에서 얼만큼 읽을지 결정할 수 있다.
  • 타입을 알아야 컴퓨터가 데이터를 해석할수 있다.

변수 선언의 다른 형태

Go 언어에서는 프로그래머의 편의를 위해서 여러 형태의 변수 선언을 지원하고 있다. 다양한 선언 형태에 대해서 알아보자.

package main

import "fmt"

func main() {
	var a int = 3
	var b int
	var c = 4
	d := 5
	fmt.Println(a, b, c, d) // 출력 : 3 0 4 5

타입별 기본값

변수 선언시 초기값을 생략하면 다음과 같은 기본값이 자동 대입된다.

  • 모든 정수 타입 : 0
  • 모든 실수 타입 : 0.0
  • 불리언 : false
  • 문자열 : ""(빈무자열)
  • 그외 : nil(정의되지 않은 메모리 주소를 나타내는 Go 키워드)

숫자값 기본 타입

타입을 생략하면 우변의 타입으로 변수 타입이 지정된다. 만약 우변이 숫자이면 기본 타입으로 결정된다. 정수는 int, 실수는 float64가 기본타입이다.

선언 대입문 :=

선언 대입문이란 말 그대로 선언과 대입을 한꺼번에 하는 구문이다. 선언 대입문을 상용하면 var 키워드와 타입을 생략해 변수를 선언할 수 있다.

타입 변환

Go언어는 강 타입 언어중에서 가장 강하게 타입을 검사하는 최강 타입 언어이다. 그렇기 때문에 연산이나 대입에서 타입이 다르면 에러가 발생한다.

타입변환시 유의점

  • 실수 타입에서 정수 타입으로 타입 변환시 소수점 이하 숫자가 없어진다.
  • 큰 범위를 갖는 타입에서 작은 범위를 갖는 타입으로 변환시 값이 달라질수 있다.
	a := 3
    var b float64 = 3.5
    
    var c = a * int(b) // b -> 소수점 이하 숫자 버림
   
    fmt.Println(c) // 출력 : 9
   
   	var aa int16 = 3456
    var cc int8 = int8(aa) // 타입 변환으로 상위 1바이트가 없어짐 
    
    fmt.Println(aa,cc) // 출력 : 3456,-128

변수의 범위

변수는 자신이 속한 중괄호 {} 범위를 벗어나면 사라진다.

package main

import "fmt"

var g int = 10	// 패키지 전역 변수

func main() {
	var m int = 20	// main 지역 변수
	{
		var s int = 50	// {} 지역 변수
		fmt.Println(m, s, g)
	}
	m = s + 20	// 에러 : s는 {}의 지역변수 이기 때문.
}

숫자 표현

정수 표현

정수는 부호를 표현해야 하기 때문에 첫 번째 비트를 부호 비트로 정해서 1이면, 0이면 양수를 나타낸다.
15 : 0 000000000001111
-15 : 1 111111111110001

2의 보수 : 모든 비트의 0을 1로, 1을 0으로 바꾸고, 1을 더한다.

실수 표현

IEEE-754 표준을 따라 실수 표현한다. 예를 들어 1024.235 -> 0.1024234 * 10^4 으로 나타내고, 0.1024234e+04라고 쓴다.

  • 모든 실수를 표현할 수 없고 한계가 있다.
  • 소수부 비트수가 정해져 있기 때문에 표현할수 있는 숫자에 한계가 있다.
  • 소수부 자릿수에 주의 필요하다. -> 일반적으로 float32는 7자리 , float64는 15자리까지 표현가능하다. 그래서 Go 언어는 실수값을 표현할 때 정확한 값이 아닌 근삿값으로 표현한다.

정리

  • 변수는 값을 저장하는 메모리 공간이다.
  • 변수를 사용하려면 선언을 해야한다. (메모리 할당)
  • 변수는 이름,값,타입,주소 네가지 속정을 가진다.
  • 변수는 선언은 초기값생략 , 타입 생략등 방법이 다양하다.
  • Go언어는 자동변환을 지원하지 않기때문에 타입변환이 필요하다.
  • 숫자 타입은 크기에 따라 표현할수 있는 값의 범위가 다르다.

함수

함수란 특별한 목적의 작업을 수행하는 코드 묶음이다. 함수를 사용하게 되면 같은 코드를 여러 번 작성하지 않고 한 번만 작성해 재활용 할수 있다.

함수 정의


함수는 함수 키워드,함수명,매개변수,반환 타입,함수 코드 블록으로 구성된다.

함수를 호출하면 생기는 일

함수를 호출할 때 입력하는 값을 argument 혹은 인수라고한다.
외부로 부터 입력받는 변수를 parameter 혹은 매개변수라고 한다.
함수 호출시 인수는 매개변수로 복사되어 함수의 결과값이 반환된다.
매개 변수와 함수 내에서 선언된 변수는 함수가 종료되면변수 범위를 벗어나 접근할수 없다.

함수는 왜 쓰나?

  • 코드 재사용성이 높아진다.
  • 코드 가독성이 높아진다.
  • 코드를 유지보수하기 편해진다.

멀티 반환 함수

func Divide(a, b int) (int, bool) {
	if b == 0 {
		return 0, false
	} else {
		return a / b, true
	}
}

변수명을 지정해 반환하기

func Divide(a, b int) (result int, success bool) {
	if b == 0 {
		result = 0
		success = false
		return
	}
	result = a / b
	success = true
	return
}

재귀 호출

package main

import "fmt"

func printNo(n int) {
	if n == 0 {
		return
	}
	fmt.Println(n)
	printNo(n - 1)
	fmt.Println("After", n)
}

func main() {
	printNo(3)
}

자기 자신 함수를 다시 호출하는 함수를 말한다.
탈출 조건을 명확히 해야 한다.

정리

  • 함수란 특수한 코드 묶음으로써 코드를 재사용할수 있다.
  • 멀티 반환 함수는 여러개 반환 할수 있다.
  • 재귀 호출은 함수 안에서 같은 함수를 또 호출하는 기법을 말한다. 탈출 조건을 명확히 해야 한다.

상수

상수는 변하지 않는 값을 표현할때 사용한다. 변수는 프로그램이 실행되면 값이 수시로 변경되는데 상수는 값이 정해지면 변하지 않기때문에 상수로 지정하여 사용하면 편리하고 안전하다.

상수 선언

상수는 언제 사용하나 ?

상수는 변하면 안 되는 값에 사용하거나 , 코드값을 통해서 숫자에 의미를 부여할때 사용한다.

변하면 안되는 값에 상수 사용하기

상수로 변하지 않는 값에 이름을 부여하면 매번 값을 쓰지 않고 편하게 사용 가능하다.

코드값으로 사용하기

어떤 숫자에 의미를 부여하는것을 말한다. 에를 들면 HTTP응답 코드나 ASCII 문자 코드에서의 사용이다.

package main

import "fmt"

const Pig int = 0
const Cow int = 1
const Chicken int = 2

func PrintAnimal(animal int) {

	if animal == Pig {
		fmt.Println("꿀꿀")
	} else if animal == Cow {
		fmt.Println("음메")
	} else if animal == Chicken {
		fmt.Println("꼬끼오")
	} else {
		fmt.Println("...")
	}
}

func main() {

	PrintAnimal(Pig)
	PrintAnimal(Cow)
	PrintAnimal(Chicken)

}

출력 결과

꿀꿀
음메
꼬끼오

iota로 간편하게 열거값 사용하기

const (
	Red int  = iota // 0
	Blue int  = iota // 1
	Green int  = iota // 2    
)

코드값으로 사용시 1,2,3 으로 사용할때 iota를 사용하면 편리하다.

타입 없는 상수

상수 선언 시 타입을 명시하지 않을수 있다. 타입이 없기 때문에 타입에러가 발생하지 않는다.

상수와 리터럴

컴퓨터에서 리터럴이란 고정된 값, Go언어 에서 상수는 리터럴과 같이 취급한다. 상수는 컴파일 시 리터럴로 변환된다.

정리

  • 상수는 변하지 않는 값이다.
  • 자주 쓰는 고정값에 이름을 부여해서 편리하게 사용한다.
  • 상수를 코드값으로 사용할 수 있다.
  • iota를 이용하면 증가하는 상수를 편리하게 선언할 수 있다.
  • 타입 없는 상수를 선언하면 타입이 다른 여러 변수에서 사용할 수 있다.

참고

https://www.youtube.com/@TuckerProgramming

0개의 댓글