[묘공단] Tucker의 Go 언어 프로그래밍 - 변수

힐링코더·2024년 1월 22일
0

묘공단-Go편

목록 보기
2/20
post-thumbnail

변수.

정말 가벼이 생각하기 쉬운 주제인데 프로그래밍에서 이것만큼 중요하고 개발을 지탱하는 개념이 있을까요?

변수는 프로그래밍에서 데이터를 저장하고 조작하는 데 사용되는 기본 단위입니다.
변수 없이는 데이터를 효율적으로 관리하고 복잡한 작업을 수행하는 것이 아마 거의 불가능할 걸요...?
(아마 거의라고 표현한 이유는 hoxy 내가 모르는 몽가가 있을 수도 있기 때문.)

일단 변수가 있어야
1. 데이터를 저장할 수 있어요.
2. 코드의 가독성을 높이고 유지보수를 용이하게 할 수 있어요.
3. 프로그램을 유연하게 만들 수 있어요. 사용자 입력에 따라 다른 결과를 제공하거나 하는 게 다 변수가 있어서 가능한 일이죠.

자! 그러면
Tucker의 Go 언어 프로그래밍 4장에서는 변수에 대해 어떻게 설명하고 있는지 봅시다.

1. 변수란?

변수는 값(데이터)을 저장하는 '메모리 공간'이에요.
변수에 값을 저장하면 메모리 어딘가에 공간이 생기고(주소도 생김) 값을 담을 변수가 그곳을 가리킵니다.
그래서 고에서는 포인터가 있어요.
이름(변수)을 통해 값에 접근하고 수정할 수 있습니다.

잠깐
포인터 얘기 잠깐만 하고 갑시다.
고랭에는 메모리 주소를 직접적으로 다룰 수 있는 포인터 개념이 있어요.
포인터는 메모리 주소를 저장하는 변수입니다.
모양은 변수 비슷하지만 변수가 아니고, 데이터가 저장된 것도 아니고, '데이터가 저장된 위치를 가리키고 있는 값'이에요.

모양은 '타입'으로 표현됩니다.
(포인터는 나중에 또 다루겠지만 지금 한 번이라도 더 익숙해지면 좋으니까 얘기하고 있어요.)
var p
int 이런 식이면 p는 정수형 변수의 주소를 저장하는 포인터인 거죠.

포인터를 통해 변수의 주소에 접근하면 그 주소에 저장된 데이터를 직접 조작할 수 있는데요,
var x int = 10; var p int = &x
라면 p는 x의 주소를 가리키는 격입니다.
타입에
가 붙어 있으면 앞의 건 포인터다!
&(앰퍼샌드)가 붙어 있으면 address(주소)를 얘기하고 있다고 생각하면 쉽다!

포인터는 왜 사용하나요?
1. 사용하려는 데이터 구조가 굉장히 클 수가 있어요. 이때 포인터를 사용하면 주소만 전달해서 메모리 사용을 줄일 수 있습니다.
2. 함수의 인자로 포인터를 전달하면 한 함수에서 다른 함수로 데이터를 직접 전달할 수 있어요. 이렇게 하면 값 복사도 피해져 성능이 향상됩니다.
3. 포인터를 통해 원본 변수의 값을 직접 수정할 수 있다고 했죠? 이렇게 하면 함수 내에서 외부 변수를 변경할 때 유용합니다.

... 더 나누면 좋을 법한 이야기들이 있지만 그건 포인터 장에서 다시 하기로~

앗, 변수가 뭔지 얘기하다가 바로 포인터로 넘어가 버렸네요?
변수 선언하는 법 얘기도 안 하고 말이죠.

2. 변수 선언하는 법

기본 형태는 'var 변수명 타입'입니다.
var age int
끝!
;(세미콜론) 안 붙여도 됩니다!

3. 변수에 대해 더 알아보자

변수는 선언과 동시에 초기 값을 할당할 수 있어요.
var age int = 30
변수를 선언한 후 초기화하는 것도 가능해요.
var age int; age = 30
왜 여기서는 세미콜론이 쓰였냐고요? 서로 다른 두 코드가 한 줄 안에 있으니 구분되어야 해서요.

4. 변수 선언의 다른 형태

짧은 선언이 가능해요.
변수명 := 값 형식으로 작성하면 컴파일러에 의한 타입 추론을 통해 자동으로 타입이 결정됩니다.
age := 30(int로 추론함, 앞에 var 같은 거 붙이지 말아야 함.)
짧은 변수 선언은 함수 내부에서만 가능해요.
전역 변수에는 적용할 수 없습니다.
함수 내부에서 로컬 변수를 빠르고 편리하게 선언하고 싶을 때 얘를 잘 써 보세요.

5. 타입 변환

타입(변수) 형태로 할 수 있어요.
var i int = 42; var f float64 = float64(i)
이러면 i는 42, f는 42.0이 됩니다.

6. 변수 범위

변수는 크게 지역 변수, 전역 변수가 있어요.
지역 변수는 함수 내부에 선언하고 해당 함수 내에서만 유효합니다.
전역 변수는 함수 외부에 선언하고 프로그램 전체에서 접근 가능해요.

7. 숫자 표현

지금 당장 숫자가 들어간 무언가 매우 중요한 걸 개발 중이 아니라면
이 부분은 너무 심각하게 보진 맙시다.
까먹으니까요...

정수형은
int: 기계에 따라 32비트 또는 64비트 정수형.
int8: 8비트 정수형. 값의 범위는 -128에서 127.
int16: 16비트 정수형. 값의 범위는 -32768에서 32767.
int32: 32비트 정수형. 값의 범위는 -2147483648에서 2147483647.
int64: 64비트 정수형. 값의 범위는 -9223372036854775808에서 9223372036854775807.

부동 소수점은
float32: 32비트 부동 소수점. IEEE 754 표준에 따름.
float64: 64비트 부동 소수점. 더 정밀한 소수 표현 가능.

기타 타입은
uint: 부호 없는 정수형. uint8, uint16, uint32, uint64 등으로 세분화됨.
byte: uint8의 별칭. 8비트 부호 없는 정수로, 주로 문자 데이터 처리에 사용됨.
rune: int32의 별칭. 유니코드 코드 포인트를 표현하는 데 사용됩니다. 값의 범위는 -2147483648에서 2147483647. <- 이거 나중에 또 나와요~

숫자 표현, 매우 중요하죠.
프로그램을 잘 개발하려면 데이터의 크기, 메모리 사용량, 정밀도 등을 고려해서 위 숫자 표현을 잘 쓰는 게 아주 중요하죠.
다만 전 아직까진 그 정도로 세밀한 개발을 해 본 적이 없군요. ㅠㅠ

곧 할 수 있겠죠?

곧 5장, fmt 패키지를 이용한 텍스트 입출력에 대해 알아봅시다!

profile
여기는 일상 블로그, 기술 블로그는 https://yourhealingcoder.tistory.com/

0개의 댓글