Go 기초 1. hello world

JINSOO PARK·2021년 10월 11일
0

Hello World

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

1) package main

패키지-> 기능들의 묶음
main 패키지를 쓴다는 선언
시작점을 포함한 프로그램은 main으로 시작함

2) import "fmt"

main 패키지에 있는 fmt라는 기능을 쓴다.

  • fmt(format): go언어 협회에서 만든 표준 패키지

3) func main()

  • func(function) : 함수 어떤 입력이 들어올때 어떠한 연산을하여 출력을 낸다.
    프로그래밍 언어상에서는 입력이 없어도 호출을 통해 수행을 하는 기능이 있음

  • main() : 함수이름(입력) main은 함수의 시작점이기 때문에 다른 함수에는 쓸 수 없다.

4) {fmt.Println("Hello World")}

  • {}:프로그램의 시작과 끝

  • fmt.println: fmt 패키지 "." =포함된 println 이라는 기능을 사용 하겠다.

  • ("Hello World") : () = "입력값"

변수

variable 값이 변할 수 있는 숫자이다.

1) 변수의 속성

  • 이름
  • 타입: 정수(integer), 실수(float), 문자열(string)
  • 메모리 주소

2) 변수의 선언 방법

var a int
a = 3

var(변수) a(이름) int(타입)
a = 3 (값)

a라는 변수의 타입은 정수(int)이고 그 값은 3으로 대입 한다.


var a int
a =5 // 데이터 타입과 대입을 따로 따로

var b int = 8 // 데이터 타입과 대입을 한번에

var c = 6
var d = 3.14 // 데이터 타입을 자동으로 설정해서 대입 한다.

e := 4 
f := 2 //var는 쓰지않고 데이터 타입을 자동으로 설정해서 대입 한다.

3) 변수의 원리

변수를 선언하면 특정 메모리 주소를 가지게 된다. 만약 a라는 변수를 선언했을 때 a는 메모리에 저장되고 그 메모리 주소를 이용해 값을 가져오게 된다.
여기서 얻은 메모리 주소를 시작점으로 보고 a를 호출했을때 어디까지 읽어야 할지 컴퓨터에게 정해주어야 한다. 즉 사이즈를 알려줘야 한다.
여기서 그 사이즈를 알려주는것이 데이터 타입을 정해주는 것이다.

4) 데이터 타입의 종류와 크기

컴퓨터의 메모리를 아껴주기 위해 적당한 데이터 타입을 사용한다.

  • int
    integer의 약자로 정수를 나타낸다 32bit 컴퓨터에선 4byte 이고 64bit 컴퓨터에선 8byte의 크기를 가지고 있다.
데이터 타입바이트값의 범위
int81byte-128 ~ 127
uint81byte0 ~ 255
int162byte-32768 ~ 32767
uint162byte0 ~ 65535
int324byte–2,147,483,648 ~ 2,147,483,647
uint324byte0 ~ 4,294,967,295
int648byte-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
uint648byte0 ~ 18,446,744,073,709,551,615
  • float
    실수형을 뜻하고 숫자 부분과 소수점 부분으로 나뉜다.
데이터 타입바이트값의 범위
float324byte7자리
float648byte15자리
  • string
    문자열을 표현하는 데이터 타입이다.
    사이즈가 달라진다.
  • bool
    Boolean 데이터 타입의 변수는 일반적인 숫자가 아닌 참거짓을 표현하는 데이터 타입이다.
    true / false

연산자

산술 연산자: + , - , * , /
비트 연산자: & , | , ^
논리 연산자: > , < , == , !=

package main

import "fmt"

func main() {
	a := 4
	b := 2

	fmt.Printf("a&b = %v\n", a&b)
	fmt.Printf("a|b = %v\n", a|b)
	fmt.Println("a^b =", a^b)
}

fmt.Printf("a&b = %v\n",a)
"a&b = %v\n" 뒤에 있는 값(a&b)을 형식(%v)에 맞춰서 집어 넣는다.

%v : 뒤에 있는 값의 데이터 타입을 알아서 설정하여 불러들인다.

fmt.Println("a^b =", a^b)
"a^b =" 와 a^b 가 각 각 출력됨

\n : 개행

a&b : AND연산

a|b : OR연산

a^b : XOR연산
*a^ : 단항 연산자일때 NOT


package main

import "fmt"

func main(){
	a := 21
	c := a % 10
	a = a / 10
	d := a % 10

	fmt.Printf("첫번째 수 : %v\n두번째 수 : %v\n", c, d)
}
---------------------------
첫번째 수 : 1
두번째 수 : 2

% : 나머지 연산자

c := a % 10
21을 10으로 나눈 나머지 c := 1

a = a / 10
21을 10으로 나누면 정수형이기 때문에 소수점은 날아간다 a = 2

d := a % 10
2를 10으로 나누면 몫은 2가 된다. d := 2


package main

import "fmt"

func main(){
	a := 4

	fmt.Println(a &^ a)
	fmt.Println(a << 1)
	fmt.Println(a >> 1)
}
---------------------------
0
8
2

*&^ : clear 연산자
a&^a
a = 4 -> 0100
a = ^4 -> 1011
0100 & 1011 = 0000

shift 연산자
>> , <<

화살표 방향으로 한비트식 밀리는 원리
a =4 -> 0100
a<<1 -> 1000
a>>1 -> 0010

조건 연산자

참과 거짓을 구분하는 연산자이다.

package main

import "fmt"

func main(){
var a bool
	a = 3 > 4

	fmt.Println(a)
 }   
----------------------- 
false

3은 4보다 작기 때문에 false라는 값이 출력 됨


package main

import "fmt"

func main(){
var a bool
	a = 3 < 4 && 2 < 5

	fmt.Println(a)
 }
-----------------------
true

&& 두항을 모두 충족할때 true가 나온다.

연산자 참고

링크텍스트

if 조건문

ex1)

package main

import "fmt"

func main(){
if 3 > 4 {
		fmt.Println("참")
	}
	fmt.Println("거짓")
 }
-----------------------------
거짓

if문은 주어진 조건이 참 일때 그 값을 출력해 주기 때문에 위의 조건 3>4 는 거짓이기 때문에 if문안의 fmt.Println("참")는 출력 되지 않았다.

ex2)

package main

import "fmt"

func main(){
a := 3
	if a == 3 {
		fmt.Println("a 는 3")
	}
	fmt.Println("a 의 값은 ", a)
  }
 -----------------------------   
a 는 3
a 의 값은  3

a := 3 으로 변수 선언을 했을때
if a==3 이 참이 되므로 if문 안의 코드와 밖의 코드가 모두 출력 되는 것을 알 수 있다.

if else 조건문

package main

import "fmt"

func main(){
a := 4
	if a == 3 {
		fmt.Println("a 는 3이다.")
	} else {
		fmt.Println("a는 3이 아니다.")
	}
 }   
    

if는 주어진 조건이 참일때 출력이 되지만
else는 그렇지 않을 경우 else가 출력된다.
if의 대괄호의 끝에 바로 붙는다.

else if 조건문

package main

import "fmt"

func main(){
	a := 4
	if a == 3 {
		fmt.Println("a 는 3이다.")
	} else if a == 4 {
		fmt.Println("a는 4이다.")
	} else {
		fmt.Println("a는 3도 아니고 4도 아니다.")
	}
  }
-----------------------------
a는 4이다.  

else if는 여러개의 조건을 설정할 때 사용 되어진다.

실습해보기

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {

	fmt.Println("숫자를 입력하세요")
	reader := bufio.NewReader(os.Stdin)
	line, _ := reader.ReadString('\n')
	line = strings.TrimSpace(line)

	n1, _ := strconv.Atoi(line)

	line, _ = reader.ReadString('\n')
	line = strings.TrimSpace(line)

	n2, _ := strconv.Atoi(line)

	fmt.Printf("입력하신 숫자는 %d, %d 입니다.\n", n1, n2)

	fmt.Println("연산자를 입력하세요")

	line, _ = reader.ReadString('\n')
	line = strings.TrimSpace(line)

	if line == "+" {
		fmt.Printf("%d + %d = %d", n1, n2, n1+n2)
	} else if line == "-" {
		fmt.Printf("%d - %d = %d", n1, n2, n1-n2)
	} else if line == "*" {
		fmt.Printf("%d * %d = %d", n1, n2, n1*n2)
	} else if line == "/" {
		fmt.Printf("%d / %d = %d", n1, n2, n1/n2)
	} else {
		fmt.Println("잘못 입력하셨습니다.")
	}
}
  • import () :패키지를 여러개 가져올때 소괄호를 이용한다.

  • "os" :표준 입력에서 입력을 받을 때 필요

  • "bufio" : 입력으로 부터 한 줄을 입력 받을때 필요

  • "strconv" : 문자열을 숫자로 바꾸는 기능

  • "strings" : string을 입력 받았을 때 찌꺼기를 제거하는 기능

reader := bufio.NewReader(os.Stdin)

os.Stdin = os 패키지에 Stdin -> 표준입력

bufio.NewReader() = bufio 패키지에 NewReader -> 읽기용 개체를 만든다.

line, _ := reader.ReadString('\n')
reader라는 변수에서 '\n' 이 나올때 까지 읽는다.
결과 값으로 string과 error가 나온다.
한줄을 읽고 에러 부분은 처리 하지 않을 꺼기 때문에 " _ " 이름 없는 변수로 처리한다.

line = strings.TrimSpace(line)
strings 패키지의 TrimSpace를 이용해 line 변수에 필요없는 문자열('\n')을 날린다.
*('\n')이부분은 숫자로 바꿀 수 없기 때문에 오류가 발생함

n1, _ := strconv.Atoi(line)
strconv패키지의 Atoi -> 문자열을 숫자로 바꾼다.
결과 값으로 string과 error가 나오기 때문에 line, _로 처리한다.

똑같은 방법으로 n2도 만든다.

깥은 방법으로 연산자도 설정하지만 연산자는 숫자로 바꿀 필요가 없기 때문에
n1, _ := strconv.Atoi(line)은 쓰지 않느다.

if 문을 통해 각 연산자에 따른 결과를 입력한다.

실행 방법

터미널에서 해당 디렉토리로 이동한다음

go build 파일명 

을 통해 exe 파일을 만든 후

./파일명.exe

를 통해 실행한다.

profile
개린이

0개의 댓글