반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 하위 패키지에 직접적인 접근을 막고, 상위 패키지를 통해서만 하위 패키지의 기능을 제공하려면, 어떻게 해야 되는지 간략히 알아보았습니다.
질문 >
Go 에서 하위 패키지에 직접적인 접근을 막고, 상위 패키지를 통해서만 하위 패키지의 기능을 제공하려면, 어떻게 해야 하나요?
답변 >
Go에서 하위 패키지에 대한 직접적인 접근을 막고, 상위 패키지를 통해서만 하위 패키지의 기능을 제공하려면 다음 방법들을 활용할 수 있습니다.
1. Go의 접근 제어 규칙 이해
- 공용(Exported) 요소: 이름이 대문자로 시작하면 패키지 외부에서 접근 가능.
- 비공용(Unexported) 요소: 이름이 소문자로 시작하면 패키지 내부에서만 접근 가능.
이를 활용해 하위 패키지의 요소를 비공용으로 정의하고, 상위 패키지에서만 이를 래핑(wrapping)하여 외부에 공개할 수 있습니다.
2. 접근 제어 구조 설계
디렉토리 구조 예시
myproject/
├── main.go
├── utils/
│ ├── stringutils/
│ │ └── utils.go
│ └── public.go
└── go.mod
2.1. 하위 패키지 (stringutils/utils.go)
package stringutils
// reverse는 비공용 함수로, 패키지 외부에서는 접근 불가
func reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
2.2. 상위 패키지 (utils/public.go)
package utils
import "myproject/utils/stringutils"
// ReverseString은 하위 패키지의 비공용 함수 reverse를 래핑하여 제공
func ReverseString(s string) string {
return stringutils.Reverse(s)
}
2.3. 메인 파일 (main.go)
package main
import (
"fmt"
"myproject/utils"
)
func main() {
// 상위 패키지를 통해 하위 패키지의 기능 사용
reversed := utils.ReverseString("hello")
fmt.Println("Reversed String:", reversed)
}
3. 접근 제어의 주요 원칙
- 하위 패키지의 요소를 비공용으로 유지
- 하위 패키지 내에서 소문자로 시작하는 함수, 변수, 상수만 정의.
- 외부 패키지가 직접 접근하지 못하도록 설정.
- 상위 패키지를 통해 공용 인터페이스 제공
- 상위 패키지에서 필요한 기능만 노출하고, 하위 패키지의 구현 세부사항은 감춥니다.
4. 추가 고려사항
4.1. 네임스페이스 충돌 방지
- 상위 패키지와 하위 패키지의 이름이 명확히 구분되도록 설계합니다.
4.2. 패키지 간 의존성 관리
- 하위 패키지와 상위 패키지 간 의존성을 최소화하고, 불필요한 상호 참조를 피합니다.
4.3. 인터페이스를 활용한 추상화
- 상위 패키지에서 인터페이스를 정의하고, 하위 패키지가 이를 구현하도록 설계하여 더 큰 유연성을 제공합니다.
5. 장단점
장점
- 캡슐화 강화: 하위 패키지의 세부 구현을 숨겨, 외부에서 오용할 가능성을 줄입니다.
- 코드 변경 용이성: 하위 패키지의 구현이 변경되어도, 상위 패키지의 공용 인터페이스만 유지하면 외부 코드를 수정할 필요가 없습니다.
- 모듈화: 기능별로 패키지를 분리해 코드 구조를 명확히 하고 유지보수를 용이하게 만듭니다.
단점
- 추가적인 래핑 코드 필요: 상위 패키지에서 하위 패키지의 기능을 노출하기 위해 추가적인 래핑 코드가 필요합니다.
- 약간의 성능 오버헤드: 상위 패키지의 래핑으로 인해 함수 호출 비용이 약간 증가할 수 있습니다.
6. 요약
- 하위 패키지의 요소를 비공용으로 정의(소문자 시작)하여 외부 접근을 막습니다.
- 상위 패키지가 하위 패키지의 기능을 래핑해 필요한 기능만 공용으로 노출합니다.
- 이 설계를 통해 코드 캡슐화와 유지보수성을 크게 향상시킬 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 internal 폴더는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.16 |
---|---|
👨💻 [Go] Go 에서 상위 패키지가 하위 패키지를 래핑하는 방법은 어떻게 되나요? (0) | 2025.01.15 |
👨💻 [Go] Go 에서 상위 패키지와 하위 패키지를 구분하는 방법이 어떻게 되나요? (0) | 2025.01.15 |
👨💻 [Go] Go 에서 패키지 내부에 여러개의 go 파일로 나눠서 구현하는 방법은 어떻게 되나요? (0) | 2025.01.15 |
👨💻 [Go] Go 에서 시그널 이벤트를 처리하는 방법은 어떻게 되나요? (0) | 2025.01.15 |