728x90

go의 객체지향은 클래스를 사용하지 않는다.

이때까지 여러 언어를 하면서 대부분 언어는 객체지향을 구현하기 위해서 클래스를 썼다.

그러나 몇가지의 언어는 객체지향을 하는데 클래스를 쓰지 않는다.

대표적인 언어로는 c와 js가 있다.

c는 객체지향을 문법적으로 지원하지 않기에 각각 자기만의 방식을 사용한다.

c의 객체지향은 일종의 디자인 패턴이기 때문에  논하려면 굉장히 길어지므로 생략하겠다.

js는 prototype 객체를 사용한다. 이 역시 굉장히 이질적이라서 처음 배우는 사람은 매우 힘들어한다.


Go는 이들과 또다른 객체지향이다. 바로 struct를 사용한다.

사용하는 방식은 c언어의 객체지향 패턴과 유사한면이 있다.

그러면 보도록 하자.


package main

import (
"fmt"
)

type Point struct {
X, Y float64
}

func main() {
var v Point
v = Point{3, 4}
fmt.Println(v, v.X, v.Y)
}

코드 전문이다.

한번 보도록하자.


type Point struct {
X, Y float64
}

사용하는 방식은 위와 같다.


type <사용자 정의 타입 명> struct {

<변수명1> <타입명1>

<변수명2> <타입명2>


...


<변수명n> <타입명n>

}


이렇게 되면 서로 다른 타입의 변수들을 묶어서 하나의 새로운 타입을 만들 수 있다.


func main() {
var v Point
v = Point{3, 4}
fmt.Println(v, v.X, v.Y)
}

변수를 어떻게 선언하고 초기화시키고 사용하는지에 대한 예시이다.

당연히 위의 구문은 아래처럼 사용할 수 있다.


v := Point{3, 4}

그럼 실행해서 보도록 하자.



보다시피 자료값을 묶어서 표현할 수 있다.


여기서 한가지 중요한점이 있다.

변수의 두문(첫글자를) 대문자인 경우와 소문자인 경우가 다르다는 것이다.

아래의 예시를 보도록하자.


package main

import (
"fmt"
)

type Point struct {
PosX float64
PosY float64
posZ float64
}

func main() {
var v Point
v = Point{3, 4, 5}
fmt.Println(v, v.PosX, v.PosY, v.posZ)
}

Point라는 struct를 자세히 보면 세번째꺼는 posZ이다.

이렇게 실행해도 아무 문제가 없을 것이다.



뭐가 문제냐면 만약 다른 패키지에 있을경우 문제가 되는 것이다.



이렇게 다른 패키지에 선언하고



struct를 새로 선언해서 사용한다.


package main

import (
"fmt"
"../my"
)

func main() {
var v my.Point
v = my.Point{3, 4, 5}
fmt.Println(v, v.PosX, v.PosY, v.posZ)
}

그 다음 코드를 위처럼 사용한다.

실행해보자.



그러면 갑자기 안될것이다.


그 이유는 바로 public과 private의 차이이다.


두문이 대문자일 경우 - public으로 다른 패키지에서 참조 가능

두문이 소문자일 경우 - private으로 다른 패키지에서 참조 불가능


Go에는 package나 protected, internal같은 것은 없다.

아마 필요없다고 생각한 것 같다. (실제로 없어도 코딩하는데 별 지장은 없다.)

이는 모든 캐이싱에서 적용된다.

자세한 것은 또 추후에 알려드리도록 하겠다.

'Programming > Go' 카테고리의 다른 글

[Go-13]range와 범위  (0) 2019.02.17
[Go-12]struct와 포인터, 그리고 초기화  (0) 2018.09.03
[Go-10]함수(function)  (0) 2018.09.01
[Go-09]맵(Map)  (0) 2018.08.31
[Go-08]배열(Array)과 슬라이스(slice)  (0) 2018.08.31

+ Recent posts