2015년 7월 20일 월요일

GO 언어 기본 문법 - 4

----------포인터 사용하기-----------
var 변수명 *자료형

var numPtr *int //포인터형 변수를 선언하면 nil로 초기화 됨
fmt.Println(numPtr) //nil

Go 언어는 NULL 값을 nil로 사용함.
Go 언어는 메모리 주소를 직접 대입하거나 포인터 연산을 허용하지 않는다.
빈 포인터형 변수는 new 함수로 메모리로 할당해야 함

포인터_변수 = new(자료형)

var numPtr *int = new(int)
fmt.Println(numPtr) //메모리 주소 출력

*포인터_변수명 - 역참조

var numPtr *int = new(int)   //new 함수로 공간 할당
*numPtr = 1                     //역참조로 포인터형 변수에 값을 대입
fmt.Println(*numPtr)           //1 포인터형 변수에서 값을 가져오기

&변수명 - 해당 변수의 메모리 주소

var num int = 1
var numPtr *int = &num  //참조로 num변수의 메모리 주소를 구하여
                                  //numPtr 포인터 변수에 대입
fmt.Println(numPtr)          //numPtr 포인터 변수에 저장된 메모리 주소
fmt.Println(&num)           //참조로 num변수의 메모리 주소를 구함

-------------구조체 사용하기-----------------
구조체 - 여러 변수를 담을 수 있는 구조체

type 구조체명 struct {}

{} 블록 안에는 구조체의 필드 목록을 정의함
type Rectangle struct {
     width int
     height int
}

-----------구조체에 메서드 연결하기-------------
Go언어에는 클래스가 없는 대신 구조체에 메서드를 연결할 수 있다

func(리시버명 *구조체_타입) 함수명() 리턴값_자료형 {}

type Rectangle struct {
     width int
     height int
}
func (rect *Rectangle) area() int {
     return rect.widthrect.height
}
func main() {
      rect := Rectangle{10, 20}
      fmt.Println(rect.area()) //결과값 : 200
}

------------포인터 방식, 일반 구조체 방식-----------
//포인터 방식
func (rect *Rectangle) scaleA(factor int) { //포인터라 원래의 값이 변경 됨
    rect.width = rect.width * factor
    rect.height = rect.height * factor
}

//일반 구조체 방식
func (rect Rectangle) scaleB(factor int) {  //값이 복사되어서 원래의 값에는 영향 x
    rect.width = rect.width * factor
    rect.height = rect.height * factor
}

func main() {
   rect1 := Rectangle{30, 30}
   rect1.scaleA(10)
   fmt.Println(rect1) //{300, 300} : rect1에 바뀐 값이 들어감
 
   rect2 := Rectangle{30, 30}
   rect2.scaleB(10)
   fmt.Println(rect2) //{30, 30} : rect2는 값이 바뀌지 않음

}








댓글 없음:

댓글 쓰기