본문 바로가기
Engineer/Juila

[Julia] 기본2 - 1. 구조체 기본 정의법(outer/inner constructor)

by _제이빈_ 2021. 10. 12.

 

링크의 내용을 공부하며 제멋대로 번역한 내용입니다.

 

 

 

코드를 좀 심오하게 짜보려하니 구조체(struct)를 정의하는 법 먼저 궁금해졌다. 데이터를 뭉터기로, 효율적으로 다루기 위해서는 필수이니까. 

 


CONSTRUCTOR

일단 여타 다른 코드들과 비슷하게 정의한다. 특징이라면 형식을 정해주지 않아도 된다는 정도이다. 물론 데이터 형식을 정의할 수도 있다. 뒤에 나온다.

struct Foo
	firstMass
	secondMass
end

이렇게 구조체를 정의하고 이 구조체를 이용해 변수를 할당하면 . 으로 구조체 요소에 접근할 수 있다.

myFoo = Foo(100,10)
print("Mass of my first foo = ", myFoo.fisrtMass)
#>> Mass of my second foo = 100
print("Mass of my second foo = ", myFoo.secondMass)
#>> Mass of my second foo = 10

OUTER CONSTRUCTOR METHODS

정의된 구조체를 가지고 사용방법을 다시 정의할 수도 있다.

Foo(x) = Foo(x,x)
#>> Foo

Foo(1)
#>> Foo(1, 1)

즉 변수를 1개만 입력 받아도 firstMass와 secondMass 모두에 같은 값을 부여하도록 말이다.

그러면 요런 것도 가능하다는 사실!

Foo(x) = Foo(x,2x)
#>> Foo

Foo(1)
#>> Foo(1, 2)

위와 같이 두번째 아규먼트는 2배로 입력 받도록 정의가 가능하다. 

응용하면

Foo(x) = Foo(x,x)
Foo()  = Foo(0)

Foo()
#>> Foo(0, 0)

요렇게 입력을 아무것도 안받으면 0 값을 모든 요소에 넣도록 할 수도 있다.


INNER CONSTRUCTOR METHODS

내부에서 구조체 규칙을 정의할 수 있다.

struct OrderedPair
	x::Real
	y::Real
	OrderedPair(x,y) = x > y ? error("out of order") : new(x,y)
end

이렇게 하면 x, y가 오름차순이 아니면 에러를 일으킨다. 그렇지 않으면 new로 정의한다.

new매소드가 잘 이해 안가서 몇가지 실험을 해봤는데, 위와같이 규칙을 정하거나 에러 및 재정의/자가회귀 등을 구현하기 위해 쓰인다. 이 이상의 응용은 실전과 함께 배우기로 하고, 다음으로 넘어가자.

 


PARAMETRIC CONSTRUCTORS

파라미터의 데이터 형식을 정의하는데, IMPLICIT / EXPLICIT 기법이 존재한다. IMPLICIT 은 내부에서 정의하는 방식으로 아래와 같다.

## in REPL

julia> struct Point{T<:Real}
           x::T
           y::T
       end

julia> Point(1,2) ## implicit T ## 정수로 변환되어 저장된다!
Point{Int64}(1, 2)

julia> Point(1.0,2.5) ## implicit T ## Float으로 저장된다?!
Point{Float64}(1.0, 2.5)

julia> Point(1,2.5) ## implicit T ## 두 입력값이 T라는 것으로 같아야하는데 다르니까 오류!
ERROR: MethodError: no method matching Point(::Int64, ::Float64)
Closest candidates are:
  Point(::T, ::T) where T<:Real at none:2

 

외부에서 정의하는 EXPLICIT! 

julia> Point{Int64}(1, 2) ## explicit T ##
Point{Int64}(1, 2)

julia> Point{Int64}(1.0,2.5) ## explicit T ##
ERROR: InexactError: Int64(2.5)
Stacktrace:
[...]

julia> Point{Float64}(1.0, 2.5) ## explicit T ##
Point{Float64}(1.0, 2.5)

julia> Point{Float64}(1,2) ## explicit T ##
Point{Float64}(1.0, 2.0)

아직 정확히 이해가 안되니 다음 글에서 예시와 함께 배워보자.

반응형

댓글