Go Type

독수리박박·2023년 9월 3일
0
post-thumbnail

Go에서 type이 가지는 의미

go언어에서는 타입이 중요하다. 몇몇 사람들은 타입이 go의 전부라고 말하기도 한다.
왜 일까?

Go는 정적 타입 프로그래밍 언어이다

정적 타입 프로그래밍 언어란 한번 선언된 변수의 타입을 바꿀 수 없다는 의미이다. 파이썬 같이 암시적으로 변환해주지 않는다. 만약 바꾸고 싶다면 conversions(변환)을 사용해서 타입을 변환해야 한다.
다른 언어에서는 이런 과정을 casting(캐스팅)이라고 하지만 Go에서는 conversions(변환)이라고 한다.

또 주의해야 할 점은 Go는 코드 포맷에 굉장히 신경쓰기 때문에 사용하지 않을 변수는 선언할 수 없다.


변수 선언

타입을 지정한다는 것은 곧 변수를 선언한다는 의미와 같다.

단축 선언 연산자

package main

import "fmt"

func main() {
	//변수를 처음 선언할 때는 :=사용
	x := 42
	fmt.Println(x)
	//변수를 재선언할 때는 = 사용
	x = 35
	fmt.Println(x)
	//변수는 식으로 지정 가능
	y := 100 + 24
	//여기서 100과 24는 operand라고 부른다. operand = 수행해야 할 동작을 표현하는 작은 요소(:=는 operater, 100,24는 operand)
	//구문 = 프로그램을 구성하는 요소들 보통은 한 줄을 지칭 만약 한줄에 두개가 존재한다면 세미콜론으로 구분
	fmt.Println(y)
}

//자세한 연산자, keywords등은 goalng spec에서 확인 가능

변수를 처음 선언할 때는 := 를 사용해서 선언할 수 있다. 물론 다른 방법도 있지만 이렇게 단축 선언 연산자를 사용하게 되면 단축 선언이란 말에 걸맞게 따로 타입을 지정해주지 않아도 된다. 그리고 재 선언을 할 때는 반드시 같은 자료형으로 선언해주어야 한다.

var

package main

import "fmt"

// var는 함수 외부에서 선언가능
// 프로그램 전체에서 사용가능
// 이렇게 전역변수로 저장하게 되면 겹치는 곳이 생겨서 에러 발생 가능성이 올라간다
var y = 43

// 이렇게 지정하게 되면 zero value로 저장된다
var z int

func main() {

	// DECLARE avariable and ASSIGN a VALUE
	// 단축 선언 연산자는 함수 내부에서만 선언가능 및 사용 가능, 변수의 범위를 최대한 제한가능하다. 최대한 단축 선언 연산자를 사용하는 것이 좋다.
	x := 42
	fmt.Println(x)

	fmt.Println(y)

	fmt.Println(z)
	foo()
}

func foo() {
	fmt.Println(y)
}

var을 사용해 함수를 선언할 수 있다. main함수 외부에서 선언하였는데 이것을 패키지 단위(위 코드에서는 main package) 단위에서 선언한다 하여 package level scope라고 한다. 만약 다른 곳에서 해당 변수를 사용하기 위해서는 {pakage}.{identifer} 형식으로 사용해야 한다.

그리고 값을 지정해주지 않고 타입만 지정하면 그 이후에 타입에 맞는 값을 할당할 수 있다. 코드에 주석이 말하는 것처럼 단축 선언 연산자는 함수 내부에서만 선언 및 사용가능하다. 그리고 변수의 범위를 최대한 제한해야 에러를 줄일 수 있기 때문에 패키지 단위에서 선언하는 변수를 최대한 줄이는 것이 좋다.


fmt package

변수의 값을 출력하거나 여러 형식으로 출력하기 위해서는 fmt package를 사용해야 한다.

package main

import "fmt"

var y = 42

func main() {
	n, e := fmt.Println("Hello golang", 42, true)
	fmt.Println(n) //int 형식 출력 되는 바이트 실행
	fmt.Println(e) //e는 err, 만약 err가 잡힌다면 출력

	fmt.Println(y)
	fmt.Printf("%T\n", y)  //y type
	fmt.Printf("%b\n", y)  //y binary(2진수)
	fmt.Printf("%x\n", y)  //y 16진수
	fmt.Printf("%#x\n", y) //y 0x16진수
	//Println은 한줄 띄어서 출력, Printf는 포맷 프린트(포맷 프린트로 원래 값을 출력하고 싶다면 %v 사용)

	s := fmt.Sprintf("%#x\t%b\t%x", y, y, y) //Sprint는 문자열 프린트
	fmt.Println(s)

	//Fprint는 파일 프린트
}

/*
1. golang에서는 버리는 변수가 없어야 한다. 반드시 모두 사용!!
2. 공식docs를 보고 필요한 매개 변수,매개변수의 유형, 들어갈 수 있는 매개 변수의 숫자를 확인
3. {package}.{func} 형식을 사용
*/

Print, Printf, Println이 존재한다. 물론 그 이외에도 Sprint(문자열로 출력), Fprint(파일 출력)가 존재한다.

  • Print : 가장 기본 출력 기능이다. 줄바꿈 X
  • Println : 줄바꿈이 자동으로 가능하다
  • Printf : format을 지정해서 출력이 가능하다

Type,Conversions

package main

import "fmt"

/*
go언어에서는 타입이 굉장히 중요하다
go는 정적 언어이기 때문에 변수 형을 변경할 수 없다
*/

var y = 42

// 이렇게 아무 것도 지정하지 않는다면 0 = zero value
var z int

var a string = `Steve said, "I'm a most valueable basketball player in Suwon"`

// 나만의 타입 생성
var x int

// hotdog라는 나만의 type 생성
type hotdog int

// b의 type은 hotdog
var b hotdog

func main() {
	fmt.Println(y)
	//타입 확인
	fmt.Printf("%T\n", y)
	fmt.Println(a)
	fmt.Printf("%T\n", a)

	x = 42
	b = 43
	fmt.Println(x)
	fmt.Printf("%T\n", x)
	fmt.Println(b)        //43
	fmt.Printf("%T\n", b) //main.hotdog === main package에 hotdog type

	//type 변환(다른 언어에서는 캐스팅이라 부르지만 go에서는 변환이라고 부른다)

	x = int(b) // hotdog -> int로 변환해 x에 b의 값을 할당한다
	fmt.Println(x)
	fmt.Printf("%T\n", x)
}

위 코드에 보면 hotdog라는 타입이 존재한다. 이것은 내가 임의로 만든 타입이다. 이렇게 임의로 타입을 만들 수 있고 반드시 기존의 타입을 가지고 있어야 한다(int, string, bool). 그리고 {type}(변수)를 통해 타입 변환이 가능하다.


간단하게 Go언어의 타입과 여러 예제 코드를 확인해 보았다. 다른 언어들과 비슷하면서도 조금씩 다르고 오늘 학습한 부분은 C언어와 굉장히 유사하다는 느낌을 받았다. 아직 학습 초반 단계이기 때문에 뒤에 학습을 진행하며 type의 중요성과 더욱 자세한 내용을 다루도록 해야겠다

0개의 댓글