Exported와 Unexported
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 52번째.
Go에서 식별자(변수, 함수, 타입 등)의 가시성은 간단한 명명 규칙으로 제어됩니다. 이 규칙에 따라 다른 패키지의 코드가 식별자에 접근할 수 있는지가 결정됩니다.
내보낸 식별자는 대문자로 시작하며 다른 패키지에서도 접근할 수 있습니다. 이를 "공개"라고 생각하면 됩니다. 패키지를 가져오는 사람은 누구나 사용할 수 있습니다.
// 이들은 내보내진 항목입니다 (public)
var Name string
func Calculate() int
type Person struct내보내지 않은 식별자는 소문자로 시작하며 같은 패키지 내에서만 접근할 수 있습니다. 이러한 식별자는 해당 패키지에만 "비공개"입니다.
// 이들은 외부에 공개되지 않습니다 (private)
var age int
func helper() string
type config struct이 명명 규칙은 public이나 private 같은 키워드 없이 접근을 제어하는 Go의 방식입니다. 다른 패키지에서 내보내지 않은 식별자를 사용하려고 하면, 해당 식별자는 패키지 외부에서 보이지 않기 때문에 Go에서 컴파일 오류가 발생합니다.
챌린지
쉬움내보낸 식별자와 내보내지 않은 식별자의 명명 규칙을 바로잡아 Go 패키지의 가시성 문제를 해결하세요. 일부 식별자의 이름이 잘못 지정되어 다른 패키지에서 접근할 때 컴파일 오류가 발생하는 시뮬레이션된 다중 패키지 시나리오를 다루게 됩니다.
다음 두 가지 입력을 받습니다.
"package_name:identifier1:type1:visibility1,identifier2:type2:visibility2|package_name:identifier1:type1:visibility1"형식의 패키지 정의가 포함된 문자열 (예:"utils:helper:function:private,Calculate:function:public|main:name:variable:private,Version:variable:public")"accessing_package.identifier1,accessing_package.identifier2,accessing_package.identifier3"형식의 접근 시도가 포함된 문자열 (예:"main.helper,main.Calculate,utils.Version")
다음 작업을 수행하세요.
- 첫 번째 입력을 파이프로 분할하여 개별 패키지 정의를 가져옵니다.
- 각 패키지 정의를 콜론으로 분할하여 패키지 이름과 식별자를 가져옵니다.
- 각 식별자 정의를 콜론으로 분할하여 식별자 이름, 유형, 의도된 가시성을 가져옵니다.
- 식별자 이름과 의도된 가시성을 받아 수정된 이름을 반환하는
fixIdentifierName함수를 만듭니다.- 가시성이
"public"이면 식별자가 대문자로 시작하도록 합니다. - 가시성이
"private"이면 식별자가 소문자로 시작하도록 합니다.
- 가시성이
- 패키지 분석 헤더를 표시합니다:
"=== PACKAGE VISIBILITY ANALYSIS ===" - 각 패키지의 정보를 표시합니다.
"Package: [package_name]"- 패키지의 각 식별자에 대해:
- 식별자 이름을 수정해야 하는 경우:
"- [original_name] ([type]) -> [corrected_name] (visibility: [visibility])" - 식별자 이름이 올바른 경우:
"- [identifier_name] ([type]) (visibility: [visibility]) ✓"
- 식별자 이름을 수정해야 하는 경우:
- 두 번째 입력을 쉼표로 분할하여 개별 접근 시도를 가져옵니다.
- 각 접근 시도를 마침표로 분할하여 접근을 시도하는 패키지와 접근 대상 식별자를 가져옵니다.
- 접근 유효성 검사 헤더를 표시합니다:
"=== ACCESS VALIDATION ===" - 각 접근 시도에 대해 접근이 유효한지 확인합니다.
- 식별자를 포함하는 패키지를 찾습니다.
- 수정된 식별자 이름이 대문자로 시작하는지 확인합니다(내보낸 식별자).
- 식별자를 내보낸 경우:
"[accessing_package] accessing [target_package].[corrected_identifier_name]: ✓ ALLOWED (exported)" - 식별자를 내보내지 않은 경우:
"[accessing_package] accessing [target_package].[corrected_identifier_name]: ✗ DENIED (unexported)" - 식별자가 존재하지 않는 경우:
"[accessing_package] accessing unknown.[identifier_name]: ✗ NOT FOUND"(패키지로unknown이라는 단어를 출력합니다. 이 시도는 거부된 접근으로 계산됩니다.)
- 요약 통계를 세고 표시합니다.
"=== SUMMARY ===""Total packages analyzed: [number_of_packages]""Total identifiers processed: [total_number_of_identifiers]""Identifiers requiring fixes: [number_of_identifiers_that_needed_fixing]""Access attempts: [number_of_access_attempts]""Allowed accesses: [number_of_allowed_accesses]""Denied accesses: [number_of_denied_accesses]"
- 최종 권장 사항을 표시합니다.
- 수정이 필요한 식별자가 있었다면:
"Recommendation: Fix identifier naming to follow Go conventions" - 모든 식별자가 올바른 경우:
"All identifiers follow proper Go naming conventions"
- 수정이 필요한 식별자가 있었다면:
문자열을 분할하려면 strings 패키지를, 형식화된 출력을 위해서는 fmt 패키지를 사용하고, 식별자 이름을 확인하고 수정하려면 문자열 조작 함수를 사용하세요. 이 과제는 Go의 명명 규칙이 패키지 가시성을 어떻게 제어하는지 보여 주며, 내보낸 식별자와 내보내지 않은 식별자의 차이를 이해하는 데 도움이 됩니다.
직접 해보기
package main
import (
"fmt"
"strings"
)
func main() {
// 입력 읽기
var packageDefinitions string
var accessAttempts string
fmt.Scanln(&packageDefinitions)
fmt.Scanln(&accessAttempts)
// TODO: 아래에 코드를 작성하세요
// fixIdentifierName 함수 만들기
// 패키지 정의 파싱하기
// 패키지 분석 결과 표시하기
// 접근 시도 파싱하기
// 접근 검증 결과 표시하기
// 요약 통계 계산 및 표시하기
// 권장 사항 표시하기
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Go 컴파일러