상세 컨텐츠

본문 제목

Julia언어 @kwdef 매크로

Julia

by KimUH 2025. 3. 14. 16:21

본문

줄리아 언어는 구조체(struct) 값을 생성할 때, 구조체 이름과 동일한 생성자 함수를 호출하며, 인자로 구조체 필드가 정의된 순서대로 값을 전달해 준다.

 

Foo라는 구조체를 생성하는 예제는 다음과 같다.

julia> struct Foo
           a::Int
           b::String
       end

julia> foo = Foo(1, "문자열")
Foo(1, "문자열")

julia> foo.a
1

julia> foo.b
"문자열"

 

여기서, Foo(1, "문자열")처럼 구조체 정의와 동일한 순서로 값을 지정해 줘야 한다.

필드가 몇 개 없는 작은 구조체의 경우에는 이런 방식도 별 문제가 없겠지만, 필드가 아주 많은 큰 구조체의 경우는 (단순 착오 때문이든, 유지보수 과정에서 구조체 정의가 변경되든 간에) 생성자에 전달하는 값의 순서가 구조체 정의와 일치하지 않게 되면, 버그가 발생한다.

 

이 문제를 해결하려면 순서에 상관없이 구조체 필드 이름으로 값을 지정해 줄 수 있어야 한다.

이렇게 구조체의 필드 이름으로 값을 지정해 주기 위해서 (순서 기반이 아니라) 키워드 기반 생성자를 자동으로 생성해 주는 매크로가 '@kwdef' 이다.

  julia> @kwdef struct Foo
             a::Int = 1         # 기본값 지정.
             b::String          # 필수 키워드
         end
  Foo

  julia> Foo(b="문자열")
  Foo(1, "문자열")

  julia> Foo()
  ERROR: UndefKeywordError: keyword argument `b` not assigned
  Stacktrace:
  [...]

 

구조체 정의 앞에 @kwdef 매크로를 사용하면 생성자 함수를 호출할 때 구조체 정의와 무관하게 필드 이름으로 값을 넘겨줄 수 있게 된다.

그 외, 구조체 필드의 기본값을 지정해 줄 수 있으며, 기본값이 존재하는 필드는 생성자에서 값을 지정하지 않아도 된다.

(그 이외의 필드는 반드시 생성자에서 값을 지정해야 한다.)

 

인터넷 검색에서도 쉽게 찾기 힘들었고, 챗GPT에게 물어봐도 엉뚱한 답변을 하기에 해결책을 찾는 데 시간이 좀 걸렸기에 기록으로 남겨놓는다.

관련글 더보기