본문 바로가기
Study/Go 언어

[Go언어] 반복/조건문, 배열

by Jamie Lim 2020. 7. 25.
사용 교재 : 가장 빨리 만나는 Go언어
2주차 : UNIT 14 ~ 23

[UINT 14] 패키지 사용하기

 - 소스 코드에서 패키지를 사용할 때 import 키워드를 사용
 -
형식 : import “패키지

 

 - import로 가져온 패키지 이름에 .()을 붙여 패키지에서 제공하는 함수, 변수, 상수를 사용할 수 있다 

 1) 여러 패키지 사용하기

   - 여러 패키지를 사용할 때 import 키워드로 하나씩 지정해도 되지만 키워드를 한 번만 사용하고 괄호로 묶어 사용할 수 있다

 2) 전역 패키지로 사용하기

   - import로 패키지를 가져올 때 패키지 이름 앞에 .()을 사용하면 전역 패키지가 된다

   - 패키지의 함수, 변수, 상수를 사용할 때 fmt.을 생략하고 사용할 수 있다

   - 유닛 테스트 같은 특별한 상황에서만 사용 추천 (여러 패키지를 전역 패키지로 가져오면 중복이 발생할 수 있다)
     *
유닛 테스트 : 메서드를 테스트하는 또 다른 메서드로 하나의 유닛 테스트가 하나의 메서드의 특정 루틴을 검사한다. 이는 버그를 줄이고 코드의 퀄리티를 높이기 위해 사용한다.
      
자세한 내용은 아래 사이트 참고
       https://imasoftwareengineer.tistory.com/88

 

그래서 유닛테스트(Unit Test)가 뭔가요?

소프트웨어 업계에 종사하거나 개발을 많이 해봤다면 유닛테스트에 대해 종종 들었을 것이다. 업계에 종사하고있다면 실제로 유닛테스트를 매일 작성하고 있을수도 있다. 유닛테스트는 뭘까? �

imasoftwareengineer.tistory.com

 

패키지 이름 앞에 .을 사용한 경우

 3) 패키지 별칭 사용하기

   - 패키지 이름 앞에 별칭을 붙여주면 현재 소스 코드 안에서 별칭으로 패키지로 사용할 수 있다

   - 내가 만든 패키지와 기본 패키지의 이름이 중복될 때 별칭을 사용할 수 있다

패키지의 별칭을 'f'라고 지음

[UNIT 15] if 조건문 사용하기

 - if 조건문을 작성할 때 ( )(괄호)를 사용하지 않는다

 - 조건문을 시작하는 줄에서 {(여는 중괄호)가 시작된다

 - 조건식의 결과가 참일 때 중괄호 블록을 실행한다 => 조건식의 결과는 불형이 되어야 한다

 - C언어와 달리 조건식의 결과가 정수형, 실수형, 문자열 값 등이 되면 컴파일 에러가 발생한다

 - 형식 : if 조건식 { true일 때 실행할 코드 }

중괄호를 다음 줄에 작성하면 에러 발생
중괄호를 생략해도 컴파일 에러 발생  ( 실행 코드가 한 줄이라도!!)

 

 - if ~ else문 작성 시 else 키워드의 코드는 반드시 if 문의 }(닫는 중괄호)뒤에 붙어야 한다

5 이상인 경우
5 미만인 경우

 

 - else if 키워드를 사용할 수도 있다 (else와 마찬가지로 닫는 중괄호와 여는 중괄호가 같은 줄에 있어야 한다)

10 이상인 경우
5이상, 10 미만인 경우
5 미만인 경우

 

[UNIT 16] if 조건문 안에서 함수 사용하기

 - 다음과 같이 hello.txt 파일에 Hello, World!라는 문자열이 들어있다

메모장으로 hello.txt 생성
파일 내용 읽기

   > io/ioutil : 간단하게 파일을 읽고 쓸 수 있게 해주는 패키지
   > ReadFile() :
파일을 읽는 함수를 읽은 데이터(바이트 슬라이스)와 에러 값을 리턴한다
   > nil :
포인터, 인터페이스, , 슬라이스, 채널, 함수 등의 zero value Null과 같은 역할이다

 

 - 위의 코드를 아래와 같이 if 조건문 안에서 함수를 실행한 뒤 조건을 판단하는 방식으로 바꿀 수 있다

 - 위와 같이 코드를 짜면 b에는 ReadFile()을 통해 파일을 열어 얻은 내용이 들어가고 err에는 에러 값이 들어간다

 - 위와 같은 방법으로 if 안에서 함수를 실행해 에러 값을 확인하면 코드 양을 줄일 수 있다

 

 - if 조건문에서 변수를 생성했을 때 변수는 if 조건식이 참일 때 중괄호 블록뿐만 아니라 else else if 중괄호 블록에서도 사용할 수 있다 (if 조건문 바깥에서는 변수 사용 x)

[UNIT 17] for 반복문 사용하기

 - Go언어에서 반복문은 for문만 있다

 - 반복문 작성 시 ( )(괄호)를 사용하지 않고 반복문이 시작하는 줄에서 {(여는 중괄호)가 시작된다

 - 형식 : for 초깃값; 조건식; 변화식 {
            
반복할 코드
         }

 

 - if문 똑같이 중괄호를 다음 줄에 쓰거나 생략하면 컴파일 에러가 발생한다

중괄호를 다음 줄에 작성하면 에러 발생
중괄호를 생략해도 컴파일 에러 발생

 

 - for문의 형식을 for 조건식 { 변화식 }으로 하면 while처럼 동작한다

 - 형식 : for 조건식 {
           
반복할 코드
           
변화식
         }

 

 - 변화식이나 조건식이 없다면 무한 루프가 된다

0 으로 무한 반복
무한루프

 1) break 사용하기

   - 조건을 정해 해당 조건에 참이라면 break 키워드를 사용해 반복문을 중단할 수 있게 해준다

 

   - break 키워드에 레이블을 지정해 원하는 레이블을 빠져나갈 수 있다
    *
아래 실습을 보면 break Loop때문에 fmt.Println(i)를 거치지 않음을 알 수 있다

 

   - 위와 같은 코드는 레이블과 for 키워드 사이에 다른 코드가 있으면 안된다

 2. continue 사용하기

   - 반복문에서 특정 부분 이하는 실행하지 않고 넘어가려면 continue 키워드를 사용한다

2 는 뛰어 넘어 출력되지 않음

 

   - break와 마찬가지로 continue에 레이블을 지정해 레이블의 시작 지점으로 이동해 이어 실행한다

j 가  2 인 경우의 부분은 모두 넘어가 출력되지 않음

 

 - break와 마찬가지로 레이블과 for 키워드 사이에 다른 코드가 있으면 안 된다

 3. 반복문에서 변수 여러 개 사용하기

   - 반복문의 변화식에서 여러 변수를 처리하려면 병렬 할당을 사용해야 한다

 

   - 변화식을 병렬 할당을 사용하지 않고 그대로 나열하면 컴파일 에러 발생

[UNIT 18] goto 사용하기

 - 정해진 레이블로 곧장 이동하기를 원할 때 goto 키워드 사용

 - 프로그래밍에서 goto는 권장되지 않지만 일부 상황에서는 코드를 간단하게 해주어 적절히 활용해야 한다

 - 형식 : goto 레이블명
        
레이블:
              
실행할 코드

 - 중복 코드가 있는 경우 goto 키워드와 레이블을 사용해 중복없이 간단하게 작성할 수 있다

         

 - goto문 뒤에 있는 코드는 실행되지 않고 넘어간다

[UNIT 19] switch 분기문 사용하기

 - 다양한 조건을 보다 간단하게 표현할 수 있다

 - case는 처음부터 순서대로 값을 판단해 값이 일치하면 해당 코드를 실행한 뒤 분기문을 중단함

 - 모든 case문에 해당하지 않는다면 default:를 실행한다

 - 다른 언어에서의 switch와는 다르게 각 case가 끝날 때 break를 하지 않아도 된다

 - 숫자가 아니더라도 문자열도 값으로 사용할 수 있다

 - 형식 : switch 변수 { case : 코드 }

 1. break 사용하기

   - if 조건문 안에서 break 키워드를 사용해 문장 실행을 중단할 수 있다

break 를 통해  switch 문을 종료시킴

 2. fallthrough 사용하기

   - 특정 case의 문장을 실행한 뒤 다음 case 문장을 실행하고 싶을 때 사용

case 3 부터 순차적으로 실행

 3. 여러 조건을 함께 처리하기

   - 여러 조건을 같은 문장으로 처리하고 싶을 땐 case에서 ,(콤마)로 구분해 적어준다

홀수인 경우
짝수인 경우

 4. 조건식으로 분기하기

   - 판별할 변수를 지정하지 않고 case에서 조건식만으로 문장을 실행할 수 있다

   - CC++에서는 case에서 숫자나 열거형 값만 사용 가능하지만 Go에서는 조건식도 사용할 수 있다

5 이상, 10미만인 경우
0 이상, 5 미만인 경우

 

   - switch 분기문 안에서 함수를 실행하고 결괏값으로 분기할 수 있다

   - 함수를 호출한 뒤에는 ;(세미콜론)을 붙여주어야 한다

   - 함수로 실행할 때는 case에서 값이 아닌 조건식만 사용할 수 있다

    * math/rand : 무작위 패키지
      > Seed :
시드 값을 설정하는 함수로 아래 코드에서는 time 패키지로 현재 시간을 설정하였다
      > Intn :
랜덤 값을 생성하는 함수로 랜덤 값의 범위는 0부터 매개변수로 설정한 값까지다

    * time : 시간 패키지
      > Now :
현재 시간을 구하는 함수
      > UnixNano :
유닉스 시간을 나노 초 단위로 리턴한다

결과는 매번 달라진다

[UNIT 20] 간단한 예제로 문법 익숙해지기

 1. FizzBuzz 구현하기

< 규칙 >

  - 1에서 100까지 출력
  - 3의 배수는 Fizz 출력
  - 5의 배수는 Buzz 출력
  - 3 5의 공배수는 FizzBuzz 출력

 

1 ~ 60의 결과

 

 2. 99병의 맥주 구현하기

< 규칙 >

  - 99병에서 시작해 맥주병이 계쏙 줄어들면 맥주병이 2개 이상일 때는 bottles로 표시하고 1개일 때는 bottle로 표시한다

  - 마지막에는 가게에서 맥주를 다시 사와 99병이 된다는 내용을 표시하면 된다

 

99 bottle of beer on the wall, 99 bottles of beer.
Take one down, pass it around, 98 botttles of beer on the wall.
98 bottle of beer on the wall, 98 bottles of beer.
Take one down, pass it around, 97 botttles of beer on the wall.
97 bottle of beer on the wall, 97 bottles of beer.
Take one down, pass it around, 96 botttles of beer on the wall.
96 bottle of beer on the wall, 96 bottles of beer.
Take one down, pass it around, 95 botttles of beer on the wall.
 
(생략)
 
3 bottle of beer on the wall, 3 bottles of beer.
Take one down, pass it around, 2 botttles of beer on the wall.
2 bottle of beer on the wall, 2 bottles of beer.
Take one down, pass it around, 1 botttles of beer on the wall.
1 bottle of beer on the wall, 1 bottle of beer
Take one down, pass it around, no more botttles of beer on the wall.
No more bottles of beer on the wall, No more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.

[UNIT 21] 배열 사용하기

 - 다른 언어와 마찬가지로 배열은 길이가 고정되어 있고 인덱스는 0부터 시작한다

 - 배열로 만들 자료형 앞에 [ ](대괄호)를 붙이고 길이를 설정한다

 - 배열을 선언했을 땐 배열의 요소가 모두 0으로 초기화된다

 - 배열 선언과 동시에 초기화 하기 위해서는 자료형 뒤에 { }(중괄호)를 붙여 안에 값을 나열한다

 - 중괄호에서 값은 한 줄로 나열해도 되고 여러 줄로 나열해도 된다 (마지막 요소에 ,(콤마)를 붙여야 된다)

 - 형식 : var 배열명 [길이]자료형

  

 - 배열의 크기에 을 사용하면 초기화할 값의 매개수에 따라 자동으로 크기가 설정된다

 

 - 다차원 배열을 선언할 때 [ ](대괄호)를 여러 번 사용한다

 1. 배열 순회하기

   - for 반복문으로 배열이 길이만큼 반복하면서 요소를 출력한다

    * len() : 배열의 길이를 반환해준다

      

 - 배열의 길이를 구하지 않고 좀 더 간단하게 배열의 요소를 가져오기 위해서 range 키워드를 사용한다

 

 - 인덱스를 생략하고 값만 출력하기 위해서는 _(언더바)를 이용해 인덱스 변수를 생략한다

 2. 배열 복사하기

   - Go 언어의 배열 변수는 배열 전체를 뜻하며 첫 번째 요소의 포인터가 아니다

   - 배열을 다른 변수에 대입하면 배열 전체가 복사된다

[UNIT 22] 슬라이스 사용하기

 - 배열과 비슷하지만 길이가 고정되어 있지 않으며 동적으로 크기가 늘어난다

 - 배열과 달리 레퍼런스 타입이다
   *
레퍼런스 타입 : 클래스, 인터페이스, 배열, 열겨형 값을 변수에 대입하지만 변수는 참조값을 가지고 있다
   *
프리미티브 타입 : 값을 변수에 대입하여 사용하는 형태 (기본 타입들이 이에 해당함)

 - 형태 : var 슬라이스명 [ ]자료형

 - 슬라이스는 배열과 달리 [ ](대괄호) 안에 길이를 지정하지 않는다

 - 생성된 슬라이스의 길이는 0이다

 - make 함수를 사용해 공간을 할당해 값을 넣을 수 있음 (make([]자료형, 길이)

 - 슬라이스 선언과 동시에 make 함수를 사용하면 대괄호와 자료형은 생략할 수 있다

 

 - 슬라이스를 생성하며 값을 초기화하려면 { }(중괄호)를 사용한다

 - 중괄호에서 값을 한 줄로 혹은 여러 줄로 나열해도 된다 (여러 줄인 경우 마지막 요소에도 ,(콤마) 붙여 주기)

  

 - 실제 슬라이스는 배열을 내장하고 있기 때문에 배열이 더 늘어났을 때 사용할 공간을 미리 할당할 수 있다

 - make([]자료형, 길이, 용량)
   >
슬라이스 길이는 용량보다 크게 설정할 수 없다
   >
용량을 생략하면 용량은 길이와 동일하게 설정됨
   >
길이 : 인덱스로 접근할 수 있는 공간
   >
용량 : 실제 메모리에 할당된 공간으로 슬라이스에 요소를 추가하여 용량이 가득차면 용량은 자동으로 늘어난다
   >
용량을 미리 크게 할당하면 요소가 추가될 때마다 메모리를 새로 할당하지 않아도 되지만 처음부터 메모리 공간을 많이 차지하는 단점이 있다
   >
용량을 적게 할당하면 처음에 메모리 공간을 차지하지만, 요소가 추가될 때마다 메모리를 새로 할당하게 되어 성능이 떨어질 수 있다
   >
용량이 길이보다 크더라도 길이를 벗어난 인덱스에는 접근할 수 없다    

  > len : 슬라이스의 길이
  > cap :
슬라이스의 용량

 1. 슬라이스에 값 추가하기

   - append(슬라이스, 1, 2, …) : 슬라이스 맨 뒤에 값을 추가할 수 있다

   - 슬라이스에 다른 슬라이스를 붙이려면 append함수를 사용할 때 을 사용한다

 2. 레퍼런스 타입

   - 슬라이스는 레퍼런스 타입

   - 내장된 배열에 대한 포인터이므로 슬라이스끼리 대입하면 값이 아닌 참조(레퍼런스)만 한다

    > 배열에 다른 배열을 대입하면 배열의 요소가 모두 복사가 됨

         

     > 슬라이스에 다른 슬라이스를 대입하면 참조하므로 b[0]의 값을 수정했을 때 a[0]도 수정된다

 3. 슬라이스 복사하기

   - copy(복사될 슬라이스, 원본 슬라이스) : 슬라이스 요소를 모두 복사할 때 사용하는 함수

   - 슬라이스를 복사한 뒤 복사된 슬라이스의 요소를 바꿨을 때 원본 슬라이스는 바뀌지 않음    

    > 슬라이스 b의 길이는 3이므로 a의 요소 3개만 복사된다

 4. 슬라이스와 용량

   - append()로 값을 추가하면 처음 슬라이스의 용량과 길이가 늘어난다

     > 값을 2개 추가하면서 길이가 2개 늘어나고 용량이 10으로 늘어난다

 5. 부분 슬라이스 만들기

   - 슬라이스는 기존 슬라이스에서 일정 위치를 지정해 부분 슬라이스를 만들 수 있다

   - 슬라이스[시작_인덱스:_인덱스]

 

   - 슬라이스뿐만 아니라 배열도 사용 가능하다

   - 참조로 하기 때문에 배열이라도 부분 슬라이스의 요소를 바꾸면 배열의 요소도 바뀐다

       

   - 부분 슬라이스를 만들면서 용량도 함께 지정할 수 있다

   - 용량은 기존 슬라이스의 용량을 넘을 수 없다

   - 슬라이스[시작_인덱스:_인덱스:용량]

[UNIT 23] 맵 사용하기

 - : 해시 테이블, 딕셔너리라고도 하며 키-값 형태로 자료를 저장한다 (레퍼런스 타입)

 - 형식 : var 맵명 map[_자료형]_자료형

 - [ ](대괄호) 안에는 키의 자료형을 지정하고 뒤에 값의 자료형을 지정한다

 - make(map[_자료형]_자료형) : 공간을 할당해 값을 넣을 수 있게 해준다

 

 - 키 값을 생성과 동시에 설정하려면 { }(중괄호)를 사용한다

 - 중괄호에서 키 값을 나열해도 되고 여러 줄로 나열해도 된다 (여러 줄로 나열 시 마지막 키와 값에 ,(콤마) 붙이기)

 1. 맵에 데이터 저장하고 조회하기

   - 맵에 데이터를 넣으려면 [ ](대괄호) 안에 키를 지정하고 값을 대입한다

   - 값을 조회할 때도 대괄호 안에 키를 지정하면 된다

   - 맵에서 존재하지 않는 키를 조회했을 때는 빈 값이 출력된다

 

   - 맵에 데이터가 있는지 검사할 때는 값을 조회한 뒤 리턴값을 활용한다     

 2. 맵 순회하기

   - 맵의 모든 데이터를 출력할 때 for 반복문에서 range 키워드를 사용할 수 있다

   - for , := range {}

 3. 맵에서 데이터 삭제하기

   - 맵에서 값을 삭제하려면 delete함수를 사용한다

   - delete(, 삭제할_)

 4. 맵 안에 맵 만들기

   - 맵 값 안에는 일반 자료형뿐만 아니라 맵 자체도 들어갈 수 있다

   - map[_자료형]map[_자료형]_자료형

  

댓글