TIL 03 - 자료구조, 메모리 할당 및 초기화(Golang)

프동프동·2023년 2월 10일
0

TIL

목록 보기
3/46
post-thumbnail

자료구조

배열

  • 특징
    • 길이가 고정되어 있다.(정적)
    • 값 타입
      • 복사하여 내용을 전달한다.
    • 인덱스를 통해 접근 가능
      • 0부터 시작하는 인덱스를 통해 접근할 수 있다.
    • 정적
  • 사용 방법
    • var 배열명 [길이]자료형
  • 속성
    • 저장 데이터
    • 타입 정보
    • 순서 정보
    • size 정보(len)

슬라이스

  • 특징
    • 길이가 가변적이다. 동적으로 늘어난다.(동적 배열 타입)
      • Runtime에 배열 사이즈가 바뀔 수 있다.
    • 레퍼런스 타입(참조 값 전달)
    • 길이와 용량의 개념이 있다.
    • 인덱스로 접근 가능
      • 0부터 시작하는 인덱스를 통해 접근할 수 있다.
    • 초기화 전에는 값이 nil
    • 요소 추가
      • append() : 슬라이스에 요소를 추가한 슬라이스 반환
        var slice = []int{1,2,3}
        slice2 := append(slice,4)
    • 주의
      var array = [...]int{1,2,3} // 길이가 3인 배열
      var slice = []int{1,2,3} // 슬라이스
  • 사용 방법
    • var 슬라이스명 []자료형
      • 배열과 달리 [] 사이에 길이를 입력하지 않는다.
    • make()를 통한 초기화 가능
      • make(자료형, 길이, 용량(생략 시 길이값이 대입된다)

  • 특징
    • key-value 값으로 데이터를 저장한다.
      • 해시 테이블, 딕셔너리와 동일
    • key 자료형은 모든 데이터 타입(slice 제외)을 사용 가능
    • 레퍼런스 타입(참조 값 전달)
    • 맵 조회 및 순회
      • 순서가 없다.
  • 사용 방법
    • var 맵명 map[키 자료형][값 자료형]
      var map1 map[string]int = make(map[string]int)
    • make()를 통한 초기화 가능
      var map2 = make(map[string]int) // 자료형 생략
      map3 := make(map[string]int) // 리터럴 형

구조체

여러 변수의 타입을 담아 하나의 형태로 만들 때 사용, 데이터 필드의 모음, 고정된 고유 필드 집합을 구성하여 선언

  • 특징
    • 사용자 정의 유형을 만드는 유일한 방법
  • 사용 방법
    • type 구조체명 struct { }
      type Persons struct {
      	Name string
      	Age int
      	Pnum string
      }
    • var 변수명 구조체명
      var pers Persons
      pers.Name = "codz"
      pers.Age = 23
      pers.Pnum = "01098765432"
    • new 활용
      • new를 이용해 구조체를 할당받아 각 요소별 초기화하는 과정 및 형식

        // 방법 1
        p1 := new(Persons)
        
        // 방법 2
        var p2 = new(Persons)
        
        // 방법 3
        var p3 = &Persons{"test", 17, "01045673210"}
        
        // 방법 4 - 배열 형식
        p4 := []Persons{
        		Persons{
        			Name: "p1",
        			Age:  10,
        			Pnum: "9876",
        		},
        		Persons{
        			Name: "p2",
        			Age:  9,
        			Pnum: "8765",
        		},
        	}

인터페이스

인터페이스는 메서드의 집합, 메서드의 원형(prototype, 메서드 자체를 구현하지는 않음)들의 집합

  • 특징
    • 객체의 행위를 지정해주는 하나의 방법
    • 추상화 제공
    • 덕타이핑
  • 사용 방법
    • interface 키워드 사용, 중괄호와 매개변수 또는 메서드가 가질 반환값을 사용
      type Persons  interface {
          Student() int
          Player() string
      }
  • 예제 1 - 빈 인터페이스
    • 함수 매개변수, 리턴 값, 구조체 필드등으로 사용가능 → 어떤 타입으로도 변환이 가능하다

    • 모든 타입을 나타내기 위해 빈 인터페이스를 사용한다.

      package main
      
      import "fmt"
      
      func main() {
      	var a interface{}
      	printInterface(a)
      
      	a = 7.5
      	printInterface(a)
      
      	a = "Golange"
      	printInterface(a)
      
      	a = true
      	printInterface(a)
      
      	a = nil
      	printInterface(a)
      
      }
      
      func printInterface(v interface{}) {
      	fmt.Printf("Type : (%T) ", v) // 원본타입
      	fmt.Println("입력된 값 : ", v)
      }
  • 예제 2 - 인터페이스 데이터 타입 변환과 반환값
    • interface.(type)을 이용하면 형변환 하여 사용할 수 있다.

    • 실행(Runtime) 시에는 인터페이스에 할당한 변수를 실제 타입으로 변환 후 사용해야 하는 경우

    • 인터페이스.(타입) 형태로 사용

      package main
      
      import (
      	"fmt"
      	"reflect"
      )
      
      func main() {
      
      	var a interface{} = 15
      	b := a
      	c := a.(int)
      
      	fmt.Println("a : ", a)
      	fmt.Println("a Type : ", reflect.TypeOf(a))
      	fmt.Println("b : ", b)
      	fmt.Println("b Type : ", reflect.TypeOf(b))
      	fmt.Println("c : ", c)
      	fmt.Println("c Type : ", reflect.TypeOf(c))
      
      	fmt.Println()
      
      	// 저장된 실제 타입 검사
      	if v, ok := a.(int); ok {
      		fmt.Println("반환된 값은? : ", v, "반환 여부 : ", ok)
      	}
      
      }
  • 예제 2 - 활용
    • switch 타입 검사를 할 수 있다.

    • 어떤 타입이든 받을 수 있기 때문에 아래 예제처럼 타입별로 결과를 다르게 처리할 수 있다.

      package main
      
      import (
      	"fmt"
      )
      
      func checkType(arg interface{}) {
      
      	switch arg.(type) {
      	case bool:
      		fmt.Println("bool type : ", arg)
      	case int, int8, int16, int32, int64:
      		fmt.Println("int type : ", arg)
      	case float64:
      		fmt.Println("float type : ", arg)
      	case string:
      		fmt.Println("string type :", arg)
      	case nil:
      		fmt.Println("nil type :", arg)
      	default:
      		fmt.Println(arg)
      	}
      }
      
      func main() {
      	checkType(false)
      	checkType(1)
      	checkType(11.111)
      	checkType(nil)
      	checkType("Hello!")
      }

메모리 할당 및 초기화

new

new() : 메모리를 할당하는 내장 함수

  • 특징
    • 객체의 값을 제로로 만들기 때문에 초기화가 필요하지 않다.
    • 해당 객체에 대한 포인터(*) 반환

make

특정 데이터 타입에 대해서는 초기화를 해주는 작업이 필요하다 이때 사용하는 함수가 make() 함수

  • 특징
    • 맵, 슬라이스, 채널에서만 적용
    • 반드시 초기화 후 사용
    • 포인터(*)를 반환하지 않음
profile
좋은 개발자가 되고싶은

0개의 댓글