줄리아 언어는 구조체(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에게 물어봐도 엉뚱한 답변을 하기에 해결책을 찾는 데 시간이 좀 걸렸기에 기록으로 남겨놓는다.
Julia언어에는 interface/trait가 (아직) 없다. (0) | 2025.03.14 |
---|---|
Julia언어의 틈새 시장? (0) | 2025.03.14 |
Julia언어 체감 속도 향상 (!! 필수 !!) (0) | 2025.03.14 |
Julia 함수 합성 연산자 ∘ (0) | 2025.03.13 |
Julia언어 파이프 연산자 |> (0) | 2025.03.13 |