그래 그리 쉽지는 않겠지

검색

검색 아이콘검색을 여는 아이콘

Tucker의 Go 언어 프로그래밍 Ch3 ~ Ch11

2023-10-07

이 글은 골든래빗 《 Tucker의 Go언어 프로그래밍 》의 3장~11장 써머리입니다.

Ch3 ~ Ch11

  • Hello Go World
  • 변수
  • fmt 패키지를 이용한 텍스트 입출력
  • 연산자
  • 함수
  • 상수
  • if문
  • switch문
  • for문

# 코드 실행

  1. 폴더 생성

    • 폴더 = 패키지
  2. .go 파일 생성 및 작성

  3. Go 모듈 생성

    1
    
    go mod init <module name>
    
    • go.mod 파일 생성
      • 모듈명
      • Go 버전
      • 필요한 패키지 목록
  4. 빌드

    1
    2
    
    # 운영체제와 아키텍처 지정해서 빌드 (default: 현재 시스템)
    GOOS=linux GOARCH=amd64 go build
    
    • 실행 파일 생성 (Go 코드 -> 기계어)
  5. 실행


package main

main() 함수가 있는 패키지

  • main() 함수: 프로그램이 시작과 끝점

# 주석

  • 함수에 대한 주석
    • 함수명을 써주고 그 뒤에 설명
  • godoc 으로 문서 만들기

# 변수

값을 저장하는 메모리 공간을 가리키는 이름

# 변수 선언

1
2
3
4
5
6
7
var a int = 10 // (변수 선언 키워드) (변수명) (타입) = (초깃값)
// a: 메모리 시작 주소
// int 타입만큼의 메모리 공간에 10이라는 값을 복사

var b int // 초깃값 생략, 기본값으로 대체
var c = 4 // 타입 생략
d : = 20 // var 키워드와 타입 생략

# 변수명 규칙

  • 첫 글자: 문자 or _
  • _를 제외한 특수문자는 불가
  • camelCase 권장
  • 변수명은 되도록 짧게 권장 (잠시 사용되는 로컬 변수는 한 글자 권장)

# 타입별 기본값

  • 정수: 0
  • 실수: 0.0
  • 불리언: false
  • 문자열: ""
  • 그 외: nil (정의되지 않은 메모리 주소를 나타냄)

별칭 타입

  • byte = uint8
  • rune = int32

# 타입 변환

1
var c int = int(b) // 타입명(변수)
  • 큰 범위 -> 작은 범위: 값이 달라질 수 있음

# 숫자 표현

  • 정수 표현
    • 2의 보수: 모든 비트 반전 후 +1
  • 실수 표현
    • 부호 비트
    • 지수부(8비트)
    • 소수부(23비트)

# 텍스트 입출력

  • fmt 패키지
    • 표준 입출력 기능 제공

# 표준 출력

  • Print(), Println(), Printf()
  • 서식 문자
    • %v: 데이터 타입에 맞춰 기본 형태로 출력
    • %T: 데이터 타입 출력
    • %c: 유니코드 문자를 출력
    • %q: 특수 문자 기능을 동작하지 않고 문자 그대로 출력
    • %p: 메모리 주솟값을 출력
    • %5d: 너비 지정 (5칸)
      • %05d: 0 채우기
      • %-5d: 왼쪽 정렬

# 표준 입력

1
2
3
4
5
6
7
// 값을 채워넣을 변수들의 메모리 주소를 인수로 받음
// 공란으로 구분
func Scan(a ...interface{}) (n int, err error)
// 개행(enter)으로 입력 종료
func Scanln(a ...interface{}) (n int, err error)

func Scanf(format string, a ...interface{}) (n int, err error)
  • 표준 입력 스트림(메모리 공간)에 임시 저장
    • 입력 실패 후 표준 입력 함수 호출시
      • 스트림에 남아있는 값을 가져옴 (새로운 입력을 받지 않음)

# 표준 입력 스트림 지우기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import (
	"bufio" // io 를 담당하는 패키지
	"os" // 표준 입출력 등을 가지고 있는 패키지
)

func main() {
	// NewReader(): 입력 스트림으로부터 한 줄을 읽는 Reader 객체 생성
	stdin := bufio.NewReader(os.Stdin) // os.Stdin: 표준 입력 스트림을 나타냄

	stdin.ReadString('\n') // 줄바꿈 문자가 나올 때까지 읽음 (표준 입력 스트림이 비워짐)
}

# 연산자

  • &^(비트 클리어 연산자)
    • 특정 비트를 0 으로 바꿈 (^ 연산 후 & 연산 수행)
  • 시프트 연산자
    • <<: 오른쪽은 0으로 채워짐
    • >>: 왼쪽은 음수면 1, 양수면 0으로 채워짐
  • 실수 오차
    • 2진수 숫자 체계는 대부분 소수점 이하 숫자들을 표현하기 어려움
    • 작은 오차를 무시
      • Nextafter(x, y float64): 가장 작은 오차(1비트)만큼 y를 향해 더하거나 빼줌
    • 정밀도 조정
      • math/big 패키지의 Float 객체 사용
  • 대입 연산자
    • 우변값을 좌변(메모리 공간)에 복사
    • 아무런 값을 반환하지 않음

# 함수

1
2
// (함수 키워드) (함수명) (매개변수) (반환 타입) (함수 코드 블록)
func Add(a int, b int) int { ... }

인수는 매개변수로 복사된다

  • 인수(argument): 함수 호출시 전달하는 값
  • 매개변수(parameter): 함수가 사용하는 변수 (인수값을 복사)
  • 멀티 반환 함수: 값을 여러 개 반환할 수 있음
    • 변수명도 미리 지정 가능

# 상수

기본 타입값들만 상수로 선언될 수 있음

  • 불리언, 룬, 정수, 실수, 복소수, 문자열
1
const ConstValue int = 10
  • 코드값으로 사용
    • iota 키워드: 소괄호 안에서 0부터 1씩 증가
      • 똑같은 규칙이 반복된다면 타입과 iota 생략 가능
  • 타입 없는 상수: 변수에 복사될 때 타입이 정해짐
  • 컴파일될 때 리터럴로 변환
    • 리터럴: 값 자체로 쓰인 문구
    • 동적 할당 메모리 영역을 사용하지 않음

# if문

  • 쇼트서킷
    • &&: 좌변이 false 면 우변을 검사하지 않음
    • ||: 좌변이 true 면 우변을 검사하지 않음

# switch문

1
2
3
4
5
6
7
switch (초기문;) 비굣값 { // 비굣값이 없을 경우 true
case 값1: // 비굣값과 값1이 같을 때 수행 (값을 여러 개로 가능, 조건문도 가능)
	문장
...
default: // 만족하는 case가 없을 때 수행
	문장
}
  • fallthrough 키워드: 다음 case 문까지 실행

# for문

1
2
3
for (초기문;) 조건문; (후처리) {
	코드 블록
}

# References