`init` 함수
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 56번째.
init 함수는 패키지가 임포트될 때 자동으로 실행되는 Go의 특별한 함수입니다. 일반적인 함수와 달리, init을 직접 호출하지 않습니다. Go는 패키지 초기화 과정 중에 사용자를 대신하여 이 함수를 실행합니다.
다음은 init 함수를 정의하는 방법입니다:
package mypackage
import "fmt"
func init() {
fmt.Println("Package mypackage is being initialized!")
}init 함수는 몇 가지 고유한 특징을 가지고 있습니다. 매개변수를 받지 않고, 값을 반환하지 않으며, main 함수가 시작되기 전에 실행됩니다. 이러한 특징 덕분에 초기 상태 설정, 컴포넌트 등록 또는 패키지에 필요한 일회성 설정 작업을 수행하는 데 매우 적합합니다.
init 함수를 포함하는 패키지를 임포트하면, 해당 패키지의 내보낸 함수를 전혀 사용하지 않더라도 그 효과를 즉시 확인할 수 있습니다. 이것이 이전에 배운 빈 식별자(blank identifier) 임포트 패턴이 매우 유용한 이유입니다. 이 패턴을 사용하면 패키지의 코드를 직접 사용하지 않고도 패키지의 초기화를 트리거할 수 있습니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움패키지가 임포트될 때 init 함수가 어떻게 자동으로 실행되는지 보여주는 패키지 초기화 시스템을 만드세요. 서로 다른 패키지들이 스스로를 초기화하고 시작 시퀀스를 추적하는 로깅 시스템을 구축하게 됩니다.
두 개의 입력을 받게 됩니다:
"package1:message1,package2:message2,package3:message3"형식의 패키지 정의를 포함하는 문자열 (예:"database:Database connection pool initialized,cache:Cache system ready,logger:Logging system started")"operation1,operation2,operation3"형식의 메인 프로그램 작업을 포함하는 문자열 (예:"start_server,process_requests,shutdown")
당신의 과제는 다음과 같습니다:
- 쉼표를 기준으로 첫 번째 입력을 파싱하여 개별 패키지 정의를 가져옵니다.
- 각 패키지 정의에 대해 콜론을 기준으로 분리하여 패키지 이름과 초기화 메시지를 가져옵니다.
- 초기화 메시지를 추적하기 위해
initLog라는 전역 슬라이스를 생성합니다. - 패키지 이름과 메시지를 인자로 받는
logInit함수를 생성하고,"[INIT] [package_name]: [message]"형식의 메시지를initLog슬라이스에 추가합니다. - 입력에 나타난 순서대로 각 패키지에 대해
logInit을 호출하여 패키지 초기화를 시뮬레이션합니다. - 초기화 시퀀스 헤더를 출력합니다:
"=== PACKAGE INITIALIZATION SEQUENCE ===" initLog슬라이스의 각 초기화 메시지를 출력합니다.- 메인 프로그램 헤더를 출력합니다:
"=== MAIN PROGRAM EXECUTION ===" - 다음 내용을 출력합니다:
"All packages initialized successfully" - 쉼표를 기준으로 두 번째 입력을 파싱하여 개별 작업을 가져옵니다.
- 메인 프로그램의 각 작업에 대해:
- 다음 내용을 출력합니다:
"Executing: [operation]" - 로그에 메시지를 추가합니다:
"[MAIN] Operation: [operation]" - 실행 요약을 표시합니다:
"=== EXECUTION SUMMARY ===""Packages initialized: [number_of_packages]""Main operations executed: [number_of_operations]""Total log entries: [total_number_of_log_entries]"- 전체 로그를 표시합니다:
"=== COMPLETE EXECUTION LOG ==="- 전체 로그의 각 항목(초기화 메시지와 메인 작업 모두)을 출력합니다.
- 최종 메시지를 출력합니다:
"Program execution completed - all init functions ran before main"
입력 문자열을 분리하기 위해 strings 패키지를 사용하고, 형식화된 출력을 위해 fmt 패키지를 사용하세요. 이 챌린지는 패키지 임포트 중에 init 함수가 어떻게 자동으로 실행되고 항상 main 함수보다 먼저 실행되는지 보여주며, 이는 패키지 설정 및 초기화 작업에 매우 적합합니다.
치트 시트
init 함수는 패키지가 임포트될 때 자동으로 실행되는 Go의 특별한 함수입니다:
package mypackage
import "fmt"
func init() {
fmt.Println("Package mypackage is being initialized!")
}init 함수의 주요 특징:
- 매개변수를 받지 않고 값을 반환하지 않습니다
- 패키지 초기화 중에 자동으로 실행됩니다
main함수가 시작되기 전에 실행됩니다- 초기 상태 설정 및 일회성 설정 작업에 적합합니다
- 빈 식별자(blank identifier) 임포트 시에도 트리거됩니다
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
// 초기화 메시지를 추적하기 위한 전역 슬라이스
var initLog []string
func main() {
reader := bufio.NewReader(os.Stdin)
// 입력 읽기 (bufio는 공백이 포함된 줄을 올바르게 처리함)
packageDefs, _ := reader.ReadString('\n')
packageDefs = strings.TrimRight(packageDefs, "\r\n")
mainOps, _ := reader.ReadString('\n')
mainOps = strings.TrimRight(mainOps, "\r\n")
// TODO: 아래에 코드를 작성하세요
// 1. packageDefs를 ","로 분할하여 개별 패키지 항목을 가져오도록 파싱
// 2. 각 항목을 ":"로 분할(최대 2개 부분)하여 packageName과 message를 가져옴
// 3. "[INIT] [packageName]: message"를 전역 initLog 슬라이스에 추가하는
// logInit(packageName, message string) 함수를 생성
// 4. 초기화 시퀀스 헤더와 모든 초기화 로그 항목을 표시
// 5. 메인 실행 헤더를 표시하고 mainOps의 각 작업을 처리
// - 각 작업에 대해 "Executing: <op>"를 출력
// - "[MAIN] Operation: <op>"를 initLog에 추가
// 6. 실행 요약 표시 (패키지 수, 작업 수, 총 로그 항목 수)
// 7. 전체 로그와 최종 완료 메시지 표시
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.