Menu
Coddy logo textTech

`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) 임포트 패턴이 매우 유용한 이유입니다. 이 패턴을 사용하면 패키지의 코드를 직접 사용하지 않고도 패키지의 초기화를 트리거할 수 있습니다.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

challenge icon

챌린지

쉬움

패키지가 임포트될 때 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")

당신의 과제는 다음과 같습니다:

  1. 쉼표를 기준으로 첫 번째 입력을 파싱하여 개별 패키지 정의를 가져옵니다.
  2. 각 패키지 정의에 대해 콜론을 기준으로 분리하여 패키지 이름과 초기화 메시지를 가져옵니다.
  3. 초기화 메시지를 추적하기 위해 initLog라는 전역 슬라이스를 생성합니다.
  4. 패키지 이름과 메시지를 인자로 받는 logInit 함수를 생성하고, "[INIT] [package_name]: [message]" 형식의 메시지를 initLog 슬라이스에 추가합니다.
  5. 입력에 나타난 순서대로 각 패키지에 대해 logInit을 호출하여 패키지 초기화를 시뮬레이션합니다.
  6. 초기화 시퀀스 헤더를 출력합니다: "=== PACKAGE INITIALIZATION SEQUENCE ==="
  7. initLog 슬라이스의 각 초기화 메시지를 출력합니다.
  8. 메인 프로그램 헤더를 출력합니다: "=== MAIN PROGRAM EXECUTION ==="
  9. 다음 내용을 출력합니다: "All packages initialized successfully"
  10. 쉼표를 기준으로 두 번째 입력을 파싱하여 개별 작업을 가져옵니다.
  11. 메인 프로그램의 각 작업에 대해:
    • 다음 내용을 출력합니다: "Executing: [operation]"
    • 로그에 메시지를 추가합니다: "[MAIN] Operation: [operation]"
  12. 실행 요약을 표시합니다:
    • "=== EXECUTION SUMMARY ==="
    • "Packages initialized: [number_of_packages]"
    • "Main operations executed: [number_of_operations]"
    • "Total log entries: [total_number_of_log_entries]"
  13. 전체 로그를 표시합니다:
    • "=== COMPLETE EXECUTION LOG ==="
    • 전체 로그의 각 항목(초기화 메시지와 메인 작업 모두)을 출력합니다.
  14. 최종 메시지를 출력합니다: "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. 전체 로그와 최종 완료 메시지 표시

}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 & 흐름의 모든 레슨