golang이 OOP를 지원한다는 것을 들어보았을 것이다. golang은 OOP를 class문법을 제공해주지 않고 이와 유사한 기능을 struct를 통해 제공해준다.
구조체
C언어의 구조체처럼 golang에도 구조체가 존재한다. C언어의 구조체처럼 타입을 정의하는 기능을 수행한다. 대해 정. 다음의 코드를 보자
package main
import "fmt"
type Circle struct {
r float64
x1, y1 int
}
func main() {
circle1 := Circle{}
circle2 := Circle{r: 10, x1: 5, y1: 2}
fmt.Println(circle1)
circle1.r = 100.4 // circle1의 r변수 변경
fmt.Println(circle1)
fmt.Println(circle2)
}
Circle 구조체를 선언하여 지름 r과 좌표 x1,y1을 정의한 구조체다. circle1은 r, x1, y1에 대해 초기값을 주어주지 않고 생성한다. 그래서 r,x1,y1변수의 타입인 float64, int의 zero value인 0으로 지정된다.
circle2는 r, x1,y1에 대해 초기값을 지정해서 생성한다.
구조체는 mutable한 객체이므로 변수의 변경을 시도하면 즉시 적용된다.
주소 구조체
주소 구조체란 주소값을 참조하는 구조체이다.
golang에선 2가지 방법으로 주소 구조체를 생성할 수 있다. 주소구조체란 주소값으로 구성된 구조체이다.
package main
import (
"fmt"
)
type Circle struct {
name string
r float64
x1, y1 int
}
func main() {
// zero value로 구조체 값을 초기화
circle1 := Circle{}
// 특정 값으로 구조체를 초기화
circle2 := Circle{r: 10, x1: 5, y1: 2}
fmt.Println(circle1)
// 구조체 값 변경
circle1.r = 100.4
fmt.Println(circle1)
fmt.Println(circle2)
// 주소 구조체 생성: new 예약어
circle3 := new(Circle)
fmt.Println(circle3)
// 주소 구조체 생성: 주소 연산자
circle4 := &Circle{}
fmt.Println(circle4)
}
주소 구조체는 주소값을 의미하는 & 값이 접두어로 붙는다.
지금까지 구조체를 보면서 궁금할 것이다. 이걸로 대체 OOP를 구현하는 것인지를 이해하지 못할 것이다. OOP의 기본 기능인 메소드, 생성자, 접근제한자등의 기능이 없기 때문이다. 이 기능들은 단순히 구조체 혼자서 제공하지 못한다. golang의 OOP에서 구조체는 클래스의 변수들을 정의하는 것으로 볼 수 있다.
'golang' 카테고리의 다른 글
golang8 interface (0) | 2022.02.28 |
---|---|
golang7 slice (0) | 2022.01.09 |
golang5 조건문과 반복문 (0) | 2021.12.25 |
golang4 함수 (0) | 2021.12.24 |
golang3 변수와 상수 (0) | 2021.12.23 |