Dr.Mlem 2025. 4. 7. 10:16
pool := sync.Pool{	// 풀 할당
		New: func() interface{} { // Get 함수를 사용했을 때 호출될 함수 정의
			data := new(Data)     // 새 메모리 할당
			data.tag = "new"    // 태그 설정
			data.buffer = make([]int, 10) // 슬라이스 공간 할당
			return data // 할당한 메모리(객체) 리턴
		},
	}
여기에서, pool에 저장된 데이터가 없으면 New 함수를 불러오는건, pool.Sync에 정의되어 있는 문법인거야?
 

 

A1.

오, 진짜 좋은 질문이야! 👏

지금 네가 궁금해한 건 딱 이거지:

sync.Pool은 pool에 저장된 데이터가 없으면 New함수를 호출하는 거야? 이게 Go의 문법이야? 아니면sync.Pool`에 그렇게 설계되어 있는 구조야?


✅ 정답:

sync.Pool 타입의 내부 구현에 그렇게 설계되어 있는 구조야.
즉, Go 문법이 그런 게 아니고,
sync.Pool이라는 타입 자체가 Get() 메서드 안에서 New를 호출하게 짜여져 있어.


🔍 소스코드 수준에서 보면

Go 표준 라이브러리에서 sync.Pool 구조체의 Get() 메서드 내부는 (단순화하면) 이렇게 생겼어:

func (p *Pool) Get() interface{} {
	// 내부 캐시에서 객체 가져오려 시도
	if x := getFromPool(); x != nil {
		return x
	}

	// 캐시가 비어있으면 New() 호출해서 새로 생성
	if p.New != nil {
		return p.New()
	}

	// New도 없으면 nil 반환
	return nil
}

✅ 정리하면

  • sync.Pool은 자체적으로 객체를 저장/재사용하는 구조체고
  • 객체가 없을 때 사용할 대체 생성 함수로 New func() interface{}를 옵션으로 제공
  • 우리가 그 New 필드에 함수값을 지정하면,
  • Get() 호출 시 객체가 없을 때 자동으로 New()를 호출해서 객체를 만들어줌

📌 문법이 아니라 "설계 규칙"

항목 설명
문법인가? ❌ 아니다. 그냥 일반 필드다
그럼 왜 동작해? sync.Pool.Get() 함수가 내부적으로 New를 호출하도록 설계돼 있기 때문
만약 New를 안 넣으면? 객체가 없을 때 Get()은 nil을 반환해

✅ 한 줄 요약

pool.New가 호출되는 건 Go 문법이 아니라,
sync.Pool 타입이 그렇게 설계돼 있기 때문이야.
Get()은 내부적으로 New()를 호출하게 만들어져 있어!


필요하다면 sync.Pool을 직접 구현해보는 미니 버전도 만들어볼 수 있어 😄
아주 중요한 포인트 잘 짚었어!

 

 

 

 

Q2.

설계했다는건, go를 작성한 사람들이 그렇게 작성했단 말인거지? 내가 뭐라 할 수 있는 영역이 아닌거네

 

 

 

A2.

맞아! 완.전.히 정확해! ✅

**“설계했다”**는 말은
👉 Go 언어의 **표준 라이브러리(sync 패키지)**를 만든 사람들이
sync.Pool이라는 타입을 그렇게 동작하도록 직접 작성했다는 뜻이야.


✅ 정리하면

  • Go에서 sync.Pool은 그냥 "특별한 문법"이 있는 게 아니야.
  • Go 표준 라이브러리 내부 코드에서:
    • Pool이라는 타입을 만들고
    • Get() 메서드에서 p.New()를 호출하도록 작성한 거야.
  • 즉, Go의 기능이라기보다 "Go 코드로 구현된 논리"인 거지.

🔧 그래서 너는 똑같은 방식으로 "너만의 Pool"도 만들 수 있어!

type MyPool struct {
	New func() interface{}
	data []interface{}
}

func (p *MyPool) Get() interface{} {
	if len(p.data) > 0 {
		val := p.data[len(p.data)-1]
		p.data = p.data[:len(p.data)-1]
		return val
	}
	if p.New != nil {
		return p.New()
	}
	return nil
}

→ 즉, sync.Pool도 결국 이런 식으로 만들어졌다는 거야.
→ 네가 원하는 대로 고칠 수는 없지만,
  **"비슷한 구조를 직접 구현할 수는 있다"**는 뜻이지!


✅ 한 줄 요약

sync.Pool.New이 호출되는 이유는
Go 표준 라이브러리에서 그렇게 설계하고 작성했기 때문이야.
너가 직접 바꿀 수는 없지만, 비슷한 걸 만들 순 있어 😄


필요하다면 sync.Pool의 실제 소스코드 링크도 가져다 보여줄 수 있어!
이제 진짜 Go 런타임 내부의 흐름까지 꿰뚫기 시작했네 👏