[ 1. Package ]
Go에서 package는
- (1) namespace의 역할 : 다른 패키지에서
greetings.Hello()
처럼 접근 ⇒ JAVA의 package와 유사
- (2) 접근 제어: Go에서는 첫 글자가 (대문자/소문자) = (public/private) ⇒ 자바의 class 선언과 유사
👉
함수/구조체/인터페이스/메서드 등 모두 이름 첫 글자가 대문자면 public, 소문자면 non-public
- (3) 파일 그룹화: 관련 함수나 struct들을 묶어 관리
import 이후에 해당 package의 init( ) 부분이 자동으로 실행!
[ 2. Struct ]
OOP의 역할을 하지만 오로지 Field만 가지는 Struct
- 선언은 type으로
// struct 정의
type person struct {
name string
age int
}
- 값 타입 [ person ]
- 포인터 [ *person, &person, new(person) ]
코드 | 타입 | 특징 | 사용처 |
p := person{} | 값 | 기본 값("" , 0 )으로 초기화 | 기본 선언 |
var p person | 값 | 기본 값("" , 0 )으로 초기화 | 기본 선언 |
p := person{"A", 1} | 값 | 일반적 사용 방식 | 값을 수정, 원본 유지 |
p := new(person) | 포인터 | 포인터 리턴, 내부 필드 ("" , 0 ) | 포인터 선언 |
p := &person{"A", 1} | 포인터 | 포인터 리턴 | 여러 곳에서 수정=원본 수정 |
👉
p1 = person{...}은 이미 person이 선언 되어야 사용 가능
p2 := person{...}은 person선언과 동시에 p2객체 생성
p2 := person{...}은 person선언과 동시에 p2객체 생성
[ 3. Method ]
👉
Go에서는 함수와 메소드가 다르다!
함수(function)
- struct에 종속되지 않음
- 독립적으로 사용
- 호출 : hello("Tom")
func hello(name string) string {
return "Hello, " + name
}
메소드 (method)
- func (<var_name> struct_type) <func_name>() <return_type> { }
- 하나의 struct에 종속
- Receiver 필수 ⇒ (<var_name> struct_type) 부분
- Receiver가 값이면 읽기 (http의 get 느낌)
- Receiver가 포인터면 쓰기 (http의 post 느낌)
- 호출 : rect.area( )처럼 struct 명시
func (r Rect) area() int {
return r.width * r.height
}
func (r *Rect) area2() int {
r.width++
return r.width * r.height
}