Computer_Language/GO

[Go] 11. Go(golang)의 구조체(struct)

Joo-Topia 2019. 12. 5. 12:05

이전 공부에서 golang의 익명 함수에 대해서 정리를 했었다.

오늘 정리할 내용은 구조체에 관한 내용이다.

요즘 준비할 게 많아서 설명은 주석으로 대체하겠다.

 

구조체 관련 코드 및 설명


package main

import "fmt"

type student struct {
	name  string
	age   int
	phone string
}

type test struct {
	num int
}

func callByreference(t *test) {
	t.num += 10
}

func callByvalue(t test) {
	t.num += 10
}

func main() {
	var stu1 = student{}
	fmt.Println(stu1)
	//구조체에 멤버변수가 0으로 초기화되어있지 않기 때문에 "{ 0 }"이 출력된다.

	stu1.name = "주성민"
	stu1.age = 25
	stu1.phone = "01027704367"
	fmt.Println(stu1)
	//구조체에 멤버변수들이 출력된다. "{주성민 25 01027704367}"

	stu2 := student{"홍길동", 25, "1234567891"}
	fmt.Println(stu2)
	//구조체의 멤버변수 순서대로 구조체 변수를 선언할 수 있음. "{홍길동 25 1234567891}"

	stu3 := student{age: 25, phone: "01023234444", name: "헐크"}
	fmt.Println(stu3)
	//구조체의 멤버변수의 변수명을 명시해주면 순서에 상관없이 멤버변수에 값을 저장 가능. "{헐크 25 01023234444}"

	//--------------------------- call by reference vs call by value --------------------------------------
	var t1 = test{}
	var t2 = new(test)
	//구조체 포인터를 선언하는 문법이다.

	t1.num = 10
	t2.num = 10

	fmt.Println(t1, " : ", t1.num)
	fmt.Println(t2, " : ", t2.num)

	callByvalue(t1)
	callByreference(t2)

	fmt.Println(t1, " : ", t1.num)
	fmt.Println(t2, " : ", t2.num)

	//t2는 구조체 포인터로 선언시 "new(구조체이름)"으로 선언한다.
	//한번 선언된 구조체 포인터는 참조 연산자 '*'을 사용할 필요가 없다.
	//함수 안에서 참조를 통해 값을 변경한 t2는 함수 내부에서 멤버 변수의 변화가 함수 외부에도 영향을 미친다.
}

Go언어는 객체 지향을 따르지만 클래스, 객체, 상속 개념이 없다. 하지만 구조체와 같은 사용자 정의 자료형으로 유사한 형태를 따르고 있다. 전형적인 객체지향의 클래스는 필드와 메서드를 함께 갖지만 구조체는 필드(멤버 변수)만을 가지고 메서드는 별도로 분리하여 정의한다. 메서드는 다음 포스트에 정리하도록 하겠다.

 

마무리


1월 2일 입사라 여러가지에 많은 시간을 못 쓰고 있다. 하지만 공부는 꾸준히 해야 된다고 생각하여 블로그 관리에 비중을 줄이게 되었다ㅜ

입사 후 적응이 잘 되면 열심히 활성화 시켜야겠다.

*구름 edu의 바로 실행해보면서 배우는 Go Lang"을 수강 후 정리한 내용입니다.
소스코드는 깃허브 저장소를 참고!