최데브는 오늘도 프로그래밍을 한다.

Go 언어 - 포인터 , 배열, Map 본문

Go

Go 언어 - 포인터 , 배열, Map

최데브 2021. 6. 6. 19:00

포인터

 

Java 나 파이썬 같은 언어에는 없는 포인터라는 개념이 있다.

C, C++ 에도 있는 개념인데 

메모리를 참조하고 메모리에 직접 접근하는 기능이다.

 

대충 예를 들자면 

보통 

 

a := 2

b := 3

b := a

a = 10

 

 

라는 코드를 작성하면 3번째 줄에서 b 는 2로 바뀌지만 4번째 줄에서 a = 10 이라는 코드를 적어도 b 는 세번째 줄에서만 변경 됐을뿐 더 이상 영향을 주지 못한다. 

 

이런걸 값의 복사라고 표현하는데 

포인터는 이런게 아닌 4번째 줄에서 a를 10으로 변경해도 b도 함께 10으로 변경되게 해준다.

 

아직 감이 안올수도 있다 아래 코드와 함께 설명하겠다.

 

a := 2 

b := &a

fmt.Println(b)  

위 코드의 & 는 해당 변수의 메모리 값을 말한다. 

b 라는 변수에 a의 메모리 값을 저장하겠다는 의미가 된다.

출력값도 a의 메모리값이 나온다.

 

그럼 이건 어떨까

 

a := 2

b := &a

fmt.Println(*b)  

 

값이 2가 나온다. * 기호는 해당 변수의 메모리가 바라보고 있는 값이 무엇인지 알아오는 기호다.

"a의 주소값을 b가 가지고 있고 이 메모리가 바라보고 있는 값은 a에 담긴 2 이다. "

라는 뜻이다.

 

이걸 왜 쓸까? 

무거운 데이터 구조를 다루고 있을때 그냥 값을 다른 변수나 객체에 복사한다고 하자.

그냥 = 을 사용해서 대입했을 뿐인데 많은 비용이 발생한다. 같은 내용을 다른곳에 복사하기 때문이다.

그럴때 포인터를 사용해서 불필요한 복사본을 만들어 내지 않아도 된다.

 

사실 포인터는 나도 잘아는게 아니다. 주력 언어는 java.. kotiln..

 

 

배열

1. Array // 기본적인 배열형태

names := [5]string{"aa" ,"bb" , "cc"}

//이런식으로 사용하는게 기본이다.  길이와 타입 내용을 순서대로 위 양식대로 적는다.

names[3] = "ddd"

names[4] = "eee"

 

2. Slice // 크기를 정적으로 정하고 싶지 않을 때

names := []string{"aaa","bbb","ccc"}

names = append(names,"dddd") 

// append 는 java에서 사용하는 add , push 와 비슷하다.

// 앞에 추가하고자 하는 slice 의 이름을 적고 slice 마지막 인덱스로 추가할 내용을 적어준다. 

 

Map

다른 언어에서도 쓰는 map과 같은 개념이다. 

선언하는 방식은 

 

mapamp := map[string]string{"name":"ddd","age":"12"}

// key를 어떤 타입으로 할것인지 [ ] 안에 적어주고 그 뒤에 value 의 타입을 적어준다.

 

출력할때는 

for key , value := range mapamp {

   fmt.Println(key, value)

}

이런식으로 사용하면 된다.

 

 

 

 

 

 

 

반응형

'Go' 카테고리의 다른 글

Go 언어 - defer  (0) 2021.06.02
Go 언어 - Const , Var , func  (0) 2021.06.02
Go 언어 - Go 설치하기  (0) 2021.05.30
Go 언어 - go 에 대하여  (0) 2021.05.30
Comments