Exported와 Unexported
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 52번째.
Go에서 식별자(변수, 함수, 타입 등)의 가시성은 단순한 명명 규칙에 의해 제어됩니다. 이것은 다른 패키지의 코드가 여러분의 식별자에 접근할 수 있는지 여부를 결정합니다.
내보낸 식별자(Exported identifiers)는 대문자로 시작하며 다른 패키지에서 접근할 수 있습니다. 이를 "public"이라고 생각하면 됩니다. 당신의 패키지를 임포트하는 누구든지 사용할 수 있습니다.
// 이들은 익스포트(공개)됩니다
var Name string
func Calculate() int
type Person struct내보내지 않은 식별자(Unexported identifiers)는 소문자로 시작하며 동일한 패키지 내에서만 접근 가능합니다. 이것들은 패키지에 대해 "private"입니다.
// 이들은 내보내기되지 않았습니다 (private)
var age int
func helper() string
type config struct이 명명 규칙은 public이나 private과 같은 키워드 없이도 접근을 제어하는 Go의 방식입니다. 다른 패키지에서 내보내지 않은(unexported) 식별자를 사용하려고 하면, 해당 식별자는 패키지 외부에서 보이지 않기 때문에 Go에서 컴파일 오류가 발생합니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움내보내기(exported) 및 비내보내기(unexported) 식별자에 대한 명명 규칙을 수정하여 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 [target_package].[identifier_name]: ✗ NOT FOUND"
- 요약 통계를 계산하고 출력합니다:
"=== 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의 명명 규칙이 패키지 가시성을 어떻게 제어하는지 보여주며, 내보내기된 식별자와 내보내기되지 않은 식별자의 차이점을 이해하는 데 도움을 줍니다.
치트 시트
Go는 public이나 private과 같은 명시적인 키워드 없이 명명 규칙을 통해 가시성을 제어합니다.
내보낸 식별자(Exported identifiers)는 대문자로 시작하며 다른 패키지에서 접근할 수 있습니다:
// 이들은 내보내기됨 (public)
var Name string
func Calculate() int
type Person struct내보내지 않은 식별자(Unexported identifiers)는 소문자로 시작하며 동일한 패키지 내에서만 접근할 수 있습니다:
// 이들은 내보내기되지 않음 (private)
var age int
func helper() string
type config struct다른 패키지에서 내보내지 않은 식별자에 접근하려고 하면 컴파일 오류가 발생합니다.
직접 해보기
package main
import (
"fmt"
"strings"
)
func main() {
// 입력 읽기
var packageDefinitions string
var accessAttempts string
fmt.Scanln(&packageDefinitions)
fmt.Scanln(&accessAttempts)
// TODO: 아래에 코드를 작성하세요
// fixIdentifierName 함수 생성
// 패키지 정의 파싱
// 패키지 분석 표시
// 액세스 시도 파싱
// 액세스 유효성 검사 표시
// 요약 통계 계산 및 표시
// 권장 사항 표시
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.