사용 교재 : 가장 빨리 만나는 Go언어
1주차 : UNIT 5 ~ 13
- 약 타입 (Weakly-typed) : 자료형이 달라도 컴파일 또는 실행 시점에 정해진 규칙에 따라 암시적 형 변환을 해주는 방식 (ex. C언어)
- 강 타입 (Strongly-typed) : 컴파일 또는 실행할 때 자료형이 다르면 에러를 발생하여 암시적 형 변환을 하지 않음. 또한, 컴파일할 때 타입을 결정하기에 정적 타입이다. (ex. Go 언어)
1. 설치하기
- Go언어 컴파일러 (자신에게 맞는 운영체제 선택)
- Go언어 IDE
https://sourceforge.net/projects/liteide/files/
가장 최신 버전을 선택해 자신에게 맞는 운영체제를 선택해 다운받으시오
2. 자주 사용하는 단축키
- Ctrl + B : 빌드
- Ctrl + R : 빌드 및 실행 (디버깅하지 않음)
- Ctrl + T : 테스트
- F9 : 브레이크 포인트 설정/해제
- F5 : 디버깅 시작, 계속(Continue)
- Shift + F5 : 디버깅 중지
3. Hello, World!로 시작하기 (UNIT 5)
- go 파일 만들기
- 생성하면 아래와 같이 코드가 만들어져 생긴다
- Ctrl + R 단축키를 눌러 실행한다
4. 기본 문법 알아보기 (UNIT 6)
1) ;(세미콜론)
> 다른 언어에서는 구문이 끝날 때 ;(세미콜론)을 붙이지만 Go언어에서는 생략한
> 한 줄에 여러 구분을 사용할 경우에만 ;(세미콜론)으로 구분한다
> 빌드하면 자동 줄 바뀜
* println이기 때문에 첫 줄 출력 후 개행
2) 주석
> 한 줄 주석 //
> Ctrl + /를 누르면 선택한 영역이 모두 한 줄 주석처리 된
> 범위 주석 /* */
3) 중괄호
> 함수 혹은 제어문이 시작할 때 같은 줄에 중괄호를 시작해줘야 함
> 그렇지 않으면 아래와 같은 에러 발생
5. 변수 사용하기 (UNIT 7)
- Go언어는 다른 언어와는 달리 자료형이 변수명 뒤에 온다
- 변수명은 문자와 숫자로 이루어진다
- 문자 또는 _(밑줄)로 시작해야 하며 숫자로는 시작할 수 없다
- 변수 선언 뒤에 바로 초기화 할 수 있음
- 자료형을 정하지 않고 변수명에 초깃값을 대입하면 자료형을 생략할 수 있다
- 형식1 : var 변수명 자료형
var i int
var n int = 5
var num = 10
1)짧은 선언 사용하기
> :=를 이용하면 var와 자료형 키워드를 사용하지 않고 간단하게 변수를 선언할 수 있다
> 형식2 : 변수명 := 초깃값
n := 10
s := “hello”
2) 변수 여러 개 선언하기
> 초깃값의 자료형이 서로 달라도 괜찮음
> 형식3 : var 변수1, 변수2 자료형 = 초깃값1, 초깃값2
var a, b int = 10, 20
> 형식4 : var 변수1, 변수2 = 초깃값1, 초깃값2
var a, b = 10, 20
var a, b = 10, “hello”
> 형식5 : 변수1, 변수2 := 초깃값1, 초깃값2
a, b := 1, “hello”
a, b, c, d := 1, 1.5, “hello”, false
> 형식6 : 선언 한 뒤 값 대입 / 변수1, 변수2, 변수3 = 값1, 값2, 값
var a, b int
var c int
a, b, c = 10, 20, 30
> 형식7 : var()을 통해 여러 개의 변수를 선언하고 초기화할 수 있다
var (
a, b int = 10, 20
c, d = 30, “hello
)
< 주의 > 사용하지 않는 변수 및 패키지를 선언하면 컴파일 에러가 발생한다
* 변수 혹은 패키지 앞에 _(밑줄)을 지정하면 사용하지 않는 다는 뜻으로 컴파일 에러를 방지한다
ex) _ = a / import _ “time”
6. 숫자 사용하기 (UNIT 8)
- Go언어 숫자 자료형 종류
자료형 | 설명 | 범위 |
uint8 | 부호 없는(unsigned) 8비트, 1바이트 정수 | 0 ~ 255 |
uint16 | 부호 없는 16비트, 2바이트 정수 | 0 ~ 65535 |
uint32 | 부호 없는 32비트, 4바이트 정수 | 0 ~ 4294967295 |
uint64 | 부호 없는 64비트, 8바이트 정수 | 0 ~ 18446744073709551615 |
int8 | 부호 있는 8비트, 1바이트 정수 | -128 ~ 127 |
Int16 | 부호 있는 16비트, 2바이트 정수 | -32768 ~ 32767 |
int32 | 부호 있는 32비트, 4바이트 정수 | -2147483648 ~ 2147483647 |
int64 | 부호 있는 64비트, 8바이트 정수 | -9223372036854775808 ~ 9223372036854775807 |
uint | 32비트 시스템에는 unit32, 64비트 시스템에서는 uint64 | |
Int | 32비트 시스템에서는 int32, 64비트 시스템에서는 uint64 | |
uintptr | uint와 크기가 동일하며 포인터를 저장할 때 사용 | |
float32 | IEEE-754 32비트 단정밀도 부동소수점, 7자리 정밀도 보장 | |
float64 | IEEE-754 64비트 배정밀도 부동소수점, 15자리 정밀도 보장 | |
complex64 | float32 크기의 실수부와 허수부로 된 복소수 | |
complex128 | float64 크기의 실수부와 허수부로 된 복소수 | |
byte | unit8과 크기가 동일, 바이트 단위로 저장할 때 사용 | |
rune | int32와 크기가 동일, 유니코드 문자코드를 저장할 때 사용 |
1) 정수
> 8진수는 숫자 앞에 0을 붙이고 16진수는 숫자 앞에 0x를 붙여 사용한다
var n1 int = 10
var n2 int = -10
var n3 int = 012
var n4 int = 0xa
2) 실수
> 소수점을 사용하거나 지수 표기법으로 표기할 수 있으며 변수에 저장될 때는 부동소수점 방식을 사용
> 지수 표기법은 e또는 E를 사용하고 +, -로 소수점의 위치를 지정한다 (밑은 10)
ex) 0.2를 표현하는 여러 방식
> 10에서 0.9를 뺀 결과를 보면 실수형 값을 연산할 때 오차가 발생함을 알 수 있다
3) 복소수
> 실수부 + 허수부의 형태로 허수부에 마지막에는 i를 붙여준다
> 실수부와 허수부는 공정소수점, 부동소수점 형태로 표현한다
> 변수에 저장할 때 실수부 혹은 허수부를 생략할 수 있다
> real() : 복소수에서 실수부를 가져올 때 사용
> imag() : 복소수에서 허수부를 가져올 때 사용
> 복소수에서 +대신 complex()를 사용할 수 있다
4) 바이트
> 보통 16진수, 문자 값을 저장한다
> 실무에서는 바이너리 파일에서 데이터를 읽고 쓸 때, 데이터를 암호화/복호화 할 때 주로 사용한다
5) 룬
> 유니코드(utf8) 문자 코드를 저장할 때 사용한다
> ‘ ‘ (작은 따음표)로 묶어주어 저장한다
> \u, \U를 사용헤 유니코드 문자 코드로 저장할 수도 있다 (\U는 16진수 8자리로 맞춰줘야 한다)
6) 숫자 연산하기
> 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%), 시프트(<<, >>), 비트 반전(^) 연산자 사용
> 서로 자료형이 다른 숫자를 연산하면 컴파일 에러 발생 -> 자료형 변환이 필요함
7) 오버플로우와 언더플로우
> 자료형에 저장할 수 있는 최대 크기를 넘어서면 오버플로우(Overflow)
> 자료형에 저장할 수 있는 최소 크기보다 작아지면 언더플로우(Underflow)
> 자료형에 넣을 수 있는 최대값 (이 값에 +1을 한 순간부터 오버플로우로 컴파일 에러 발생)
> 부호 없는 정수의 최솟값은 0이며 math 패키지에 따로 최솟값이 정의되어 있지 않음 (음수면 컴파일 에러)
> 부호가 있는 자료형이라면 max값을 구한 것처럼 MinInt8이런 식으로 최솟값을 구할 수 있다
8) 변수의 크기 구하기
> unsafe패키지의 Sizeof연산자를 이용해 변수의 크기를 바이트 단위로 알 수 있다
7. 문자열 사용하기 (UNIT 9)
- 문자열은 “” (따음표)로 묶어 UTF-8로 표현
- 문자열대신 \u를 사용해 유니코드 문자 코드로 저장할 수 있다
- 여러 줄로 된 문자열을 저장할 때는 ``(백쿼트)로 묶어준다
1) 문자열 길이 구하기
> len 함수 이용, 한글은 한 글자당 길이를 3으로 인식한다 (utf8로 저장하기 때문)
> 만약 utf8로 저장한 문자열의 실제 길이를 구하기 위해서는 utf8.RuneCountInString()사용
(unicode/utf8 패키지 사용)
2) 문자열 연산하기
> 문자열 비교 시 == 연산자를 사용하고 문자열을 이어 붙일 땐 + 연산자를 사용
> 문자열은 배열과 동일하게 [ ](대괄호)를 사용해 문자를 가져올 수 있다 (0부터 시작)
> 만약 Printf를 쓰지 않으면 아스키코드가 출력됨
> \n과 같은 제어 문자
제어 문자 | 설명 |
\a | 경고음, 벨 (u0007) |
\b | 백스페이스 (u0008) |
\f | 폼 피드 (u000c) |
\n | 라인 피드, 새 줄 (u000a) |
\r | 캐리지 리턴 (u000d) |
\t | 수평 탭 (u0009) |
\v | 수직 탭 (u000b) |
\ | 백슬래시 (u0005) |
‘ | 작은 따음표 (u0027), rune 변수에 저장할 때 사용 |
“ | 큰 따음표 (u0022), string 변수에 저장할 때 사용 |
3) 문자열 수정하기
> Go언어는 변수에 문자열을 저장한 뒤에는 수정할 수 없다
> 아예 새로운 문자열을 대입할 수는 있지만 일부 수정은 할 수 없다
8. 불(bool) 사용하기 (UNIT 10)
- 참과 거짓을 표현하는 변수로 크기는 1바이트
- 보통 AND(&&), OR(||), NOT(!) 논리 연산자 혹은 비교 연산자와 함께 사용한다
9. 상수 사용하기 (UNIT 11)
- const 키워드로 상수를 만들어 사용
- 소스 코드에서 고정된 값을 체계적으로 관리하기 위해 사용
- 반드시 선언과 동시에 초기화해줘야 한다 (값 변경 불가)
1) 변수 선언과 같은 방법으로 여러 개의 상수를 선언할 수 있다
// 방법1
const x, y int = 10, 20
const a, s = 10, “hello”
// 방법2
const (
x, y = 10, 20
a, s = 10, “hello”
)
10. 열거형 사용하기 (UNIT 12)
- 보통 상수는 요일과 같은 연속된 값을 가진다
- const()를 사용해 const키워드를 반복하지 않고 선언한다
const(
Sunday = 0
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
numberOfDays = 7
)
- 상수에 값을 일일이 대입하지 않더라도 순서대로 값을 넣을 땐 iota를 사용하면 된다
const(
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays
)
- iota는 항상 0부터 시작하고 10+iota라는 규칙을 만들어 주었다고 생각하면 된다
- 특정 숫자를 생략하려면 해당 부분에 _(밑줄)을 사용하고 넘어가면 된다
11. 연산자 알아보기 (UNIT 13)
1) 기존에 보지 못했던 연산자나 까먹는 연산자만 설명하도록 하겠다
연산자 | 기능 | 설명 |
:= | 변수 선언 및 대입 | 변수를 선언하는 동시에 값을 대입한다 |
^ | XOR 비트 연산 (다항) | 두 값을 비트 단위로 XOR 연산을 한다. 사용할 수 있는 자료형은 정수이다 서로 다르면 1, 같으면 0 |
^ | 비트 반전 (단항) | 비트를 반전시킨다. 0은 1로 1은 0으로 |
&^ | AND NOT 비트 연산 | 두 값을 비트 단위로 XOR 연산을 한다 |
&= | AND 비트 연산 후 대입 | 현재 변수를 값으로 AND 연산한 다음 다시 변수에 대입 |
|= | OR 비트 연산 후 대입 | 현재 변수를 값으로 OR 연산한 다음 다시 변수에 대입 |
^= | XOR 비트 연산 후 대입 | 현재 변수를 값으로 XOR 연산한 다음 다시 변수에 대입 |
&^= | AND NOT 비트 연산 후 대입 | 현재 변수를 값으로 AND NOT 연산한 다음 다시 변수에 대입한다 특정 플래그를 끌 때 주로 사용한다 |
<- | 채널 수신 연산 | 채널에 값을 보내거나 값을 가져온다 |
2) 연산자 우선순위
우선순위 | 연산자 |
5 | * / % << >> & &^ |
4 | + - | ^| |
3 | == != < <= > >= |
2 | && |
1 | || |
* gofmt 도구는 연산자가 있는 소스 코드를 입력했을 때 괄호가 없다면 자동으로 우선순위가 높은 쪽의 공백을 삭제해 서로 붙여준다 (우선 순위가 같다면 붙이지 x)
'Study > Go 언어' 카테고리의 다른 글
[Go언어] 암호화, 프로토콜 (0) | 2020.08.17 |
---|---|
[Go언어] 동기화 객체, 파일처리, JSON (0) | 2020.08.08 |
[Go언어] 함수, 구조체, 채널 (0) | 2020.08.01 |
[Go언어] 반복/조건문, 배열 (0) | 2020.07.25 |
댓글