한눈에 끝내는 고랭기초 - 1

velbie·2020년 10월 31일
3
post-thumbnail

구름에서 하는 무료 온라인 강의입니다. (링크)
한번 진행해보겠습니다.

123장

Go에서 변수를 선언할 때 가장 큰 특징은 'Short Assignment Statement'라고 불리는 := 입니다. 이를 사용하면 별다른 형 선언 없이 타입 추론이 가능합니다. 굉장히 유용하게 쓰이니 잘 알아둬야 합니다.

하지만 주의해야할 점은 이 용법은 함수(func) 내에서만 사용이 가능합니다. 따라서 함수 밖에서(전역 변수)는 꼭 var 키워드를 선언해줘야합니다.

Go언어에서는 선언만 하고 쓰지 않았다면 에러를 발생하며 컴파일에 실패합니다. 이는 변수, 패키지, 함수 등 모든 선언에서 동일하게 적용됩니다.

package main
import "fmt"

var globalA = 5 //함수 밖에서는 'var' 키워드를 입력해야함.
				// 꼭 형을 명시하지 않아도 됨
func main() {
    var a string = "goorm"
    fmt.Println(a)

    var b int = 10
    fmt.Println(b)

    var d = true
    fmt.Println(d)

    var e int
    fmt.Println(e)

    f := "short"
    fmt.Println(f)
	
    fmt.Println(globalA)
}

이런것도(아래) 사용할수 있다고합니다.

  • 상수들 사이에 콤마(,)를 입력하면 안 됩니다. 입력하면 에러가 발생합니다.
  • 묶어서 선언된 상수들 중에서 첫번째 값은 꼭 선언되어야 합니다. 선언되지 않은 값은 바로 전 상수의 값을 가집니다.
  • iota라는 식별자를 값으로 초기화하면 그 후에 초기화하지 않고 이어지는 상수들은 순서(index)가 값으로 저장됩니다.
    package main
    import "fmt"
    const ( 
            c1 = 10 //첫 번째 값은 무조건 초기화해야 함
    	c2
    	c3
    	c4 = "goorm" //다른 형 선언 가능
    	c5
    	c6 = iota //c8까지 index값 저장
    	c7
    	c8
    	c9 = "earth"
    	c10
    	c11 = "End"
    ) 
        func main() {
    	fmt.Println(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11)
    }
    //  10 10 10 goorm goorm 5 6 7 earth earth End
  • fmt.Printf("%d과 %d의 합은 %d입니다.", num1, num2, result);
    제출했는데 f빼먹고 Print, Println으로 해서 실패했었습니다
  • const () 안에 변수 여러개 선언했는데 ,(콤마) 사용해서 에러가 발생했었습니다.
  • 입력 받는법
    fmt.Scanln(&num1, &num2, &num3)
  • 상수는 변수와 다르게 괄호()를 이용해 여러 개의 값을 묶어서 초기화할 수 있으며 변수는 ()이거 안되는듯

파이썬이랑 다르게

	var num1, num2, num3, result int
	fmt.Scanln(&num1, &num2, &num3)
	result = (num1 * num2) + num3
	fmt.Printf( num1, num2, num3, result)

이렇게 사용하면 에러 발생합니다.

  var num1, num2, num3, result int
  fmt.Scanln(&num1, &num2, &num3)
  result = (num1 * num2) + num3
  fmt.Printf("%d x %d + %d = %d\n", num1, num2, num3, result)

이렇게 출력할때는 출력 자료형을 적어줘야합니다.
123장 내용끝

타입

타입확인 방법입니다.

unsafe.Sizeof(변수)

부울형은 특별한건 없습니다.

int8은 8byte int16은 16byte 한눈에 알아보기 쉽습니다.

정밀도가 중요할때 사용합니다.

스트링은 immutable 타입으로 값을 수정할 수 없습니다.
예를 들어, var str string = "hello"와 같이 선언하고 str[2] = 'a'로 수정이 불가능합니다.

기타 타입으로 byte와 rune이 있습니다.
byte는 uint8과 똑같은 자료형이지만 , 바이트 값을 8비트 부호없는 정수 값과 구별하는데 사용됩니다. (??똑같은데 어떻게 사용된다는건지...)
rune은 int32와 똑같은 자료형이라고 볼 수 있습니다. 관례상 문자값을 정수 값과 구별하기 위해 사용합니다. (??어떻게 구별한다는건지..)

백틱문자를 쓰면 Raw String Literal 을 사용할수 있습니다. \n 같은 특수문자가 스트링으로 인식됩니다.

형변환

Go에는 자동 형 변환(묵시적 형 변환)이 없고 강제 형 변환(명시적 형 변환)만 존재합니다.

타입확인할때 두번째줄로 하면 uintptr 형으로 출력됩니다. 조심!

fmt.Printf("%T, %d\n", num3t, num3t)
fmt.Printf("%T, %d\n", unsafe.Sizeof(num3t), num3t)

서식문자

서식문자 출력 형태

  • %t bool
  • %b 2진수 정수
  • %c 문자
  • %d 10진수 정수
  • %o 8진수 정수
  • %x 16진수 정수, 소문자
  • %X 16진수 정수, 대문자
  • %f 10진수 방식의 고정 소수점 실수
  • %F 10진수 방식의 고정 소수점 실수
  • %e 지수 표현 실수, e
  • %E 지수 표현 실수, E
  • %g 간단한 10진수 실수
  • %G 간단한 10진수 실수
  • %s 문자열
  • %p 포인터
  • %U 유니코드
  • %T 타입
  • %v 모든 형식
  • %#v #을 이용해구분할 수 있는 형식 표현

입력

입력을 받을 때

	fmt.Scanf("%d-%d", &RRNf, &RRNt)
	fmt.Scanf("%s", &name)
	fmt.Scanf("%f", &height)

여기서 아래 처럼 하면 됐던것 같은데 에러가 발생합니다.
이유는 그전에 사용하던것은 Scanln이였고 이것은 Scanf이기 때문입니다. 주의!!

	fmt.Scanf(&height)

for

어떻게 쓰는지 예시입니다.

package main
 
import "fmt"
 
func main() {
	sum := 0
	
	for i := 1; i <= 10; i++ {
		sum += i
	}
	fmt.Println("1부터 10까지 정수 합계:", sum)
}

while은 이렇게 씁니다. (go는 while문이 없습니다. )

package main

import "fmt"

func main() {
	n := 2
	
	for n < 100 {
		fmt.Printf("count %d\n", n)
		
		n *= 2
	}
}

배열 선언법

var  arr [3]int = [3]int{1, 2, 3}

for range 문법은 이렇게 사용합니다.

func main() {
	var arr [6]int = [6]int{1, 2, 3, 4, 5, 6}

	for index, num := range arr {
		fmt.Printf("arr[%d]의 값은 %d입니다.\n", index, num)
	}
}

파이썬 처럼 index 자리에 _ 넣어도 되고, num을 안적어주면 index만도 얻어올수 있습니다.
for range를 사용하면서 내가 한 실수!!

  • range() 소괄호를 쓴다..
  • := 이 기호를 자꾸 놓친다
profile
안녕하세요

0개의 댓글