본문 바로가기
GO 언어

Go 3주차

by 몰라몰라개복치 2020. 8. 1.

UNIT 24:: 함수 사용하기

 

 

ex) Hello, world! 를 출력하는 함수

- 함수 정의를 시작한 줄에서 { (여는 중괄호) 시작. 이를 지키지 않으면 컴파일 에러 발생

- 함수를 정의하는 위치 제약 X (함수의 선언이나 정의가 뒤에 있어도 실행 가능)

 

 

 

24.1 매개변수와 리턴값 사용하기

 

ex) 두 정수 더한 결과 리턴 함수

- 변수를 선언할 때와 마찬가지로 자료형은 매개변수명 뒤에 붙여 줌. 리턴 값의 자료형도 맨 마지막에 지정

 

- 함수 안에서 리턴값 변수 사용 가능

- 리턴 뒤에 리턴할 변수 지정 X

 

 

 

24.2 리턴값 여러 개 사용하기

 

문법적으로 값을 여러 개 리턴 가능. 코드가 더 짧고 간단

- 괄호 안에 리턴 값 자료형을 콤마로 구분하여 여러 개 지정

- 리턴 값도 return에 값을 콤마로 구분하여 여러 개 지정

- 첫 번째 리턴값은 생략하고 두 번째 리턴 값부터 사용하고 싶다면 _(밑줄 문자) 사용

  => 즉, 생략할 리턴값이 있으면 _(밑줄 문자) 사용

- 값을 여러 개 리턴할 때도 리턴 값 이름 설정 가능 ( return 할 변수 지정 X)

 

 

24.3 가변인자 사용하기

가변 인자: 함수의 매개변수 개수가 정해져 있고 유동적으로 변하는 형태

ex) 가변인자 활용하여 매개변수로 받은 모든 값을 더하는 함수

- 매개변수 자료형 앞에... 을 붙여 가변 인자로 지정

 

가변 인자가 슬라이스 타입이므로 슬라이스를 바로 넘겨줄 수도 있음

- 매개변수에 슬라이스만 넣지 않고 뒤에... 를 붙여서 슬라이스에 들어 있는 요소를 각각 넘겨줌

 

 

24.4 재귀 호출 사용하기

재귀 함수: 함수에서 자기 자신을 다시 호출하는 함수

 

 

24.5 함수를 변수에 저장하기

- 함수를 정의한 뒤 미리 선언한 변수에 대입하기만 하면 함수를 변수에 저장 가능

- :=를 사용하여 변수에 함수를 간단하게 저장

 

슬라이스(배열)에서도 함수 간단하게 저장 가능

ex)

- [] 뒤에 매개변수의 자료형과 리턴 값의 자료형을 지정해야 하며 {} 안에 대입할 수 있는 함수명 나열

 

맵에도 함수를 간단하게 저장 가능

 

 

 

24.6 익명 함수 사용하기

함수 안에서 이름이 없는 익명 함수를 정의한 뒤 바로 호출 가능

- 함수 정의한 뒤 () 를 사용하여 바로 함수를 호출

 

 

 

 

 

 

UNIT 25:: 클로저 사용하기

클로저: 함수 안에서 함수를 선언 및 정의할 수 있고 바깥쪽 함수에 선언된 변수에도 접근할 수 있는 함수

안쪽 함수 자체도 변수에 들어감

 

함수가 들어 있는 변수를 함수처럼 호출

 

 

클로저를 사용하는 이유는?

지역 변수는 함수가 끝나면 소멸되지만 클로저는 함수를 호출할 때마다 변수 a와 b의 값을 사용할 수 있음

 

즉, 지역 변수는 함수 실행이 끝나면 소멸되지만 클로저를 사용하게 되면 지역 변수가 소멸되지 않고 함수를 호출할 때마다 계속 가져다 쓸 수 있음. 

 

 

일반 자료형뿐만 아니라 함수 자체도 리턴 가능

 

 

UNIT 26:: 지연 호출 사용하기

지연 호출: 특정 함수를 현재 함수가 끝나기 직전에 실행하는 기능

- defer 함수명()

- defer 함수명(매개변수)

지연 호출된 world() 함수가 main 함수 종료 직전에 동작하여 다음과 같은 결과 나온 것을 확인

 

지연 호출한 함수가 실행되는 순서는 자료구조의 스택과 동일

즉, 맨 나중에 지연 호출된 함수가 먼저 실행

 

지연 호출은 파일을 열고 닫을 때 유용하게 활용

 

 

UNIT 27:: 패닉과 복구 사용하기

패닉: 프로그램이 잘못되어 에러가 발생한 뒤 종료되는 상황

ex) 배열의 크기보다 큰 인덱스에 접근했을 때 발생하는 에러

 

go 언어 런타임 에러뿐만 아니라 panic 함수를 사용하면 사용자가 직접 에러를 발생시킬 수 있음

panic(에러_메시지)

 

 

 

 

recover 함수: 패닉이 발생했을 때 프로그램 바로 종료되지 않고 예외처리를 할 수 있음 ( java의 rty catch와 비슷한 기능 작동)

 

변수 := recover()

- recover 함수는 panic 함수에서 설정한 에러 메시지를 받아올 수 있음

- 반드시 지연 호출 함수로 사용

- panic 함수에서 설정한 에러 메시지 "error"를 recover 함수로 받아온 뒤 출력 => recover 함수로 복구했으므로 "Hello world" 정상적으로 출력

 

 

런타임 에러 상황에서도 마찬가지로 recover 함수를 사용하면 프로그램이 종료되지 않고 계속 실행 

 

 

 

 

UNIT 28:: 포인터 사용하기

 

var 키워드로 포인트형 변수 선언

var 변수명 *자료형

C 언어와 달리 *를 자료형 앞에 붙임. 포인트형 변수를 선언하면 nil로 초기화

 

 

빈 포인터형 변수는 바로 사용할 수 없으므로 new 함수로 메모리를 할당

포인터_변수=new(자료형)

 

포인터형 변수에 값을 대입하거나 가져오려면 역참조 사용

*포인터_변수명

포인터형 변수에 값을 바로 대입하지 않고 역참조를 사용하여 메모리 주소에 값을 대입하거나 가지고 옴. 따라서 1 출력

 

 

 

일반 변수에 참조(레퍼런스)를 사용하면 포인터형 변수에 대입할 수 있음

&변수명

변수 앞에 &를 붙이면 해당 변수의 메모리 주소를 뜻함. 포인터형 변수에 대입 가능

 

 

go 언어에서는 메모리 주소를 직접 대입하거나 포인터 연산 허용 X 메모리 주소를 직접 조작할 수는 X

 

 

 

28.1 함수에서 포인터형 매개변수 사용하기

 

지금과는 다르게 함수에 정수형 값을 넘기고 함수 안에서는 매개변수에 다른 값을 대입

매개변수에선 일반 자료형을 사용하면 값이 복사되므로 함수 안에서 값을 변경해도 함수 바깥의 변수는 영향 X

 

 

포인터형 매개변수 사용

메모리 주소를 넘겨주었으므로 기존 변수의 값이 바뀌게 됨

 

 

UNIT 29:: 구조체 사용하기

 

type 구조체명 struct{

필드 1

필드 2

}

**자료형이 같은 필드는 한 줄로 나열해도 됨

 

var 변수명 구조체_타입

ex)

구조체의 각 필드는 각 자료형의 기본 값으로 초기화

 

 

지역 변수 형태가 아닌 포인터에 메모리 할당 가능

구조체_포인터=new(구조체_타입)

 

new 함수로 메모리 공간을 할당할 때는 구조체의 포인터 변수에 할당

var 키워드를 사용하지 않고 :=로 변수를 선언하면서 메모리를 할당

 

구조체 인스턴스는 생성할 때 값을 초기화

구조체_인스턴스=구조체_타입{}

필드 순서대로 값을 나열(필드 개수 모두 채워줘야함)

or 필드명: "값" 형식으로 필드명 지정(모두 채워줄 필요 x)

 

구조체 인스턴스의 필드에 접근할 때는 . 사용

new 함수로 메모리 할당한 구조체 인스턴스의 필드에 접근할 때도 점 사용

 

 

구조체 인스턴스는 { } 안에 값이 출력

구조체 포인터는  { } 앞에 메모리 주소를 뜻하는 &가 붙음

 

 

 

 

 

 

29.1 구조체 생성자 패턴 활용하기

 

new 함수로 구조체의 메모리를 할당하는 동시에 값을 초기화 하는 방법 X

다음과 같은 패턴을 사용하여 다른 언어의 생성자를 흉내낼 수 있음

 

Go 언어에서는 지역 변수 형태로 생성된 구조체나 구조체의 포인터를 리턴 가능

위 예제에선 함수 안에서 중괄호 블럭으로 구조체의 값을 초기화한뒤 포인터를 리턴하는 방식으로 생성자 역할 수행

 

Go 언어에서 지역 변수를 계속 참조하고 있다면 { }로 묶인 영역을 벗어나더라도 변수 해제 X

 

29.2 함수에서 구조체 매개변수 사용하기

사각형의 넓이를 구하는 함수 예제

 

- 보통 rectangleArea(rect *Rectangle)과 같이 함수의 매개변수에 구조체 포인터를 받음

- 값을 넘겨줄 때도 rect 변수에 &를 붙여 주어 주소 넘겨줌

- 함수의 매개변수에 구조체 포인터가 아닌 일반적인 형태(구조체 인스턴스)로 넘겨주면 값이 모두 복사되므로 주의

 

 

 

 

UNIT 30:: 구조체에 메서드 연결하기

 

 

클래스가 없는 대신 구조체에서 메서드 연결 가능

func(리시버명 *구조체_타입) 함수명() 리턴값_자료형{}

 

- 앞에서 만든 사각형 구조체 사용

- func 키워드와 함수명 사이에 리시버 정의 부분 추가 => 메서드 안에서는 리시버 변수를 통해 현재 인스턴스 값에 접근 가능

- 리시버로 정의한 변수에서는 메서드가 포함된 구조체의 인스턴스 포인터가 들어옴 리시버 변수를 통하여 현재 인스턴스의 필드값을 가져오거나 변경 가능

(C++ 의 this 포인터 또는 java의 this 키워드와 비슷)

 

 

리시버 변수를 사용하지 않는다면 역시 _(밑줄 문자)로 변수 생략 가능

 

 

 

 

 

UNIT 31:: 구조체 임베딩 사용하기

 

클래스 제공 X, 상속 또한 제공 X

임베딩을 사용하여 상속과 같은 효과 낼 수 있음

 

s.p.greeting()처럼 p 필드를 통해서 호출

 

 

Student 구조체에 Person 구조체에 임베딩

구조체가 해당 타입을 포함하는 관계가 됨 

s.Person.greeting() 처럼 Person 구조체 타입을 통하여 호출하거나 s.greeting()처럼 바로 호출 가능

 

 

31.1 메서드 오버라이딩 상황

Student 구조체도 Person 구조체와 같은 이름의 greeting 메서드를 가지고 있다면 이때는 Student 구조체의 greeting 함수가 오버라이드

 

부모 구조체의 메서드 이름과 중복된다면 상속 과정의 맨 아래 메서드가 호출

자식 구조체의 메서드가 부모 구조체의 메서드를 오버라이드

 

 

 

UNIT 32:: 인터페이스 사용하기

 

인터페이스: 메서드 집합(메서드 자체를 구현하진 X)

 

type 인터페이스명 interface{}

 

 

인터페이스를 선언하는 방법: var 변수명 인터페이스

인서페이스는 다른 자료형과 동일하게 함수의 매개변수 리턴값 구조체의 필드로 사용할 수 있음

 

 

 

메서드를 가지는 인터페이스

type 인터페이스명 interface{메서드}

 

type 새_자료형 자료형 형식으로 기존 자료형을 새 자료형으로 정의 가능

보통 인터페이스의 이름은 -er 형태로 지음

 

int 자료형과 사각형 구조체의 인스턴스를 담을 수 있는 인터페이스를 정의한 예제다

- 인터페이스를 선언하면서 초기화하려면 다음과 같이 := 사용

- 인터페이스 안에서는 ( )를 사용하여 변수나 인스턴스 넣어줌

 

 

32.1 덕 타이핑

각 값이나 인스턴스의 실제 타입은 상관하지 않고 구현된 메서드로만 타입을 판단하는 방식

오리든사람이든 상관없이 꽥과 깃털 메서드만 가졌다면 모두같은 인터페이스로 처리 가능

 

 

32.2 빈 인터페이스 사용하

 

인터페이스에 아무 메서드도 정의되어 있지 않으면 모든 타입 저장 가능

빈 인터페이스 타입은 함수의 매개변수, 리턴값, 구조체의 필드로 사용 가능

함수의 매개변수 타입을 interface로 지정하면 모든 타입 처리 가능

 

 

UNIT 33:: 고루틴 사용하기

 

고루틴: 함수를 동시에 실행시키는 기능

 

go 함수

 

 

고루틴으로 hello 함수를 실행하면 main 함수와 동시에 실행하기 때면에 fmt.Println이 호출되기 전에 main 함수가 종료됨

따라서 fmt.Scanln 을 사용하여 main 함수가 종료되지 않도록 대기

 

 

 

33.1 멀티코어 활용하기

 

go 언어는 cpu 코어를 한 개만 사용하도록 설정되어있음 다음은 시스템의 모든 cpu 코어를 사용하는 방법

 

Go 언어는 cpu 코어를 한 개만 사용하도록 설정

 

 

33.2 클로저를 고루틴으로 실행하기

함수 안에서 클로저를 정의한 뒤 고루틴으로 실행할 수 있음 예제의 출력 결과를 더 확실하게 표현하기 위해 cpu 코어 하나만 사용하도록 설정

클로저를 고루틴으로 실행할 때 반복문에 의해 바뀌는 변수는 반드시 매개변수로 넣어줌

cpu 코어를 여러 개 사용하든 상관없이 변수는 매개변수로 남겨줌

 

 

'GO 언어' 카테고리의 다른 글

Go 언어 5주차  (0) 2020.08.17
Go 언어 4주차  (0) 2020.08.09
go 2주차  (0) 2020.07.25
Go 1주차  (0) 2020.07.18