Hello World
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
패키지-> 기능들의 묶음
main 패키지를 쓴다는 선언
시작점을 포함한 프로그램은 main으로 시작함
main 패키지에 있는 fmt라는 기능을 쓴다.
func(function) : 함수 어떤 입력이 들어올때 어떠한 연산을하여 출력을 낸다.
프로그래밍 언어상에서는 입력이 없어도 호출을 통해 수행을 하는 기능이 있음
main() : 함수이름(입력) main은 함수의 시작점이기 때문에 다른 함수에는 쓸 수 없다.
{}:프로그램의 시작과 끝
fmt.println: fmt 패키지 "." =포함된 println 이라는 기능을 사용 하겠다.
("Hello World") : () = "입력값"
변수
variable 값이 변할 수 있는 숫자이다.
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는 쓰지않고 데이터 타입을 자동으로 설정해서 대입 한다.
변수를 선언하면 특정 메모리 주소를 가지게 된다. 만약 a라는 변수를 선언했을 때 a는 메모리에 저장되고 그 메모리 주소를 이용해 값을 가져오게 된다.
여기서 얻은 메모리 주소를 시작점으로 보고 a를 호출했을때 어디까지 읽어야 할지 컴퓨터에게 정해주어야 한다. 즉 사이즈를 알려줘야 한다.
여기서 그 사이즈를 알려주는것이 데이터 타입을 정해주는 것이다.
컴퓨터의 메모리를 아껴주기 위해 적당한 데이터 타입을 사용한다.
데이터 타입 | 바이트 | 값의 범위 |
---|---|---|
int8 | 1byte | -128 ~ 127 |
uint8 | 1byte | 0 ~ 255 |
int16 | 2byte | -32768 ~ 32767 |
uint16 | 2byte | 0 ~ 65535 |
int32 | 4byte | –2,147,483,648 ~ 2,147,483,647 |
uint32 | 4byte | 0 ~ 4,294,967,295 |
int64 | 8byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
uint64 | 8byte | 0 ~ 18,446,744,073,709,551,615 |
데이터 타입 | 바이트 | 값의 범위 |
---|---|---|
float32 | 4byte | 7자리 |
float64 | 8byte | 15자리 |
연산자
산술 연산자: + , - , * , /
비트 연산자: & , | , ^
논리 연산자: > , < , == , !=
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가 나온다.
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문 안의 코드와 밖의 코드가 모두 출력 되는 것을 알 수 있다.
package main
import "fmt"
func main(){
a := 4
if a == 3 {
fmt.Println("a 는 3이다.")
} else {
fmt.Println("a는 3이 아니다.")
}
}
if는 주어진 조건이 참일때 출력이 되지만
else는 그렇지 않을 경우 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
를 통해 실행한다.