Found an issue with the book? Report it on Github.

컨텐츠 구성(Organizing Content)

컨텐츠 구성(Organizing Content)

콘텐츠를 패키지로 구성하는 방법을 간단히 보여 주는 것으로 시작하겠습니다.이를 위해 고전 로트카-볼테라(Classic Lotka-Volterra 모델을 다시 살펴보겠습니다. 이전 모델에서 모든 변수는 Real 자료형을 가졌었는데, 다양한 수량에 대한 자료형을 포함하도록 해당 모델을 개선해 보겠습니다.

이러한 자료형을 다음과 같이 패키지로 구성할 수 있습니다.

  package Types
    type Rabbits = Real(quantity="Rabbits", min=0);
    type Wolves = Real(quantity="Wolves", min=0);
    type RabbitReproduction = Real(quantity="Rabbit Reproduction", min=0);
    type RabbitFatalities = Real(quantity="Rabbit Fatalities", min=0);
    type WolfReproduction = Real(quantity="Wolf Reproduction", min=0);
    type WolfFatalities = Real(quantity="Wolf Fatalities", min=0);
  end Types;

이 모델리카 코드에서 가장 먼저 주목해야 할 점은 package 키워드를 사용한다는 것입니다.``package`` 정의 구문은 model 또는 function 정의와 매우 유사하지만, package 에는 정의 또는 상수만 포함 한다는 주요 차이점이 있습니다.``constant`` 를 제외한 어떤 변수 선언도 포함할 수 없습니다. 이 예제의 경우는 packagetype 정의만 포함 할 수 있음을 알 수 있습니다.

이제 Lotka-Volterra 모델 자체에 대해 살펴보겠습니다.자료형 자체를 정의할 필요는 없지만 방금 정의한 자료형에 의존할 수 있다고 가정하면 다음과 같이 리팩터링할 수 있습니다.

  model LotkaVolterra "Lotka-Volterra with types"
    parameter Types.RabbitReproduction alpha=0.1;
    parameter Types.RabbitFatalities beta=0.02;
    parameter Types.WolfReproduction gamma=0.4;
    parameter Types.WolfFatalities delta=0.02;
    parameter Types.Rabbits x0=10;
    parameter Types.Wolves y0=10;
    Types.Rabbits x(start=x0);
    Types.Wolves y(start=y0);
  equation
    der(x) = x*(alpha-beta*y);
    der(y) = -y*(gamma-delta*x);
  end LotkaVolterra;

이제 모든 파라미터와 변수가 특정 자료형(일반적인 Real 자료형이 아님)을 가지고 있습니다.이러한 정보를 통해서 변수가 연속적이라는 사실 외에 추가 정보를 연결할 수 있습니다.예를 들어, 자료형 정의에 min=0 수정자를 추가하여 이러한 값이 음수가 되지 않도록 지정할 수 있습니다.

Lotka-Volterra 모델 자체를 보면 이러한 자료형 정의를 어디서 찾는지 명확하지 않습니다.모델리카 컴파일러는 룩업 규칙(Lookup Rules) 을 사용하여 이러한 정의를 조회합니다. 이 예제를 보면 직접적인 모델에 존재하지 않는 것을 참조 하고 있다는 점을 알수 있습니다.

모델 구성과 관련된 몇 가지 추가적인 세부 정보를 확인하기 위해 약간 "축소"해서 보겠습니다. 앞서 보여드린 Types 패키지와 이를 참조하는 LotkaVolterra 모델은 다음과 같이 정의된 NestedPackages 라는 패키지에 포함되어 있습니다.

within ModelicaByExample.PackageExamples;
package NestedPackages
  "An example of how packages can be used to organize things"
  package Types
    type Rabbits = Real(quantity="Rabbits", min=0);
    type Wolves = Real(quantity="Wolves", min=0);
    type RabbitReproduction = Real(quantity="Rabbit Reproduction", min=0);
    type RabbitFatalities = Real(quantity="Rabbit Fatalities", min=0);
    type WolfReproduction = Real(quantity="Wolf Reproduction", min=0);
    type WolfFatalities = Real(quantity="Wolf Fatalities", min=0);
  end Types;

  model LotkaVolterra "Lotka-Volterra with types"
    parameter Types.RabbitReproduction alpha=0.1;
    parameter Types.RabbitFatalities beta=0.02;
    parameter Types.WolfReproduction gamma=0.4;
    parameter Types.WolfFatalities delta=0.02;
    parameter Types.Rabbits x0=10;
    parameter Types.Wolves y0=10;
    Types.Rabbits x(start=x0);
    Types.Wolves y(start=y0);
  equation
    der(x) = x*(alpha-beta*y);
    der(y) = -y*(gamma-delta*x);
  end LotkaVolterra;
end NestedPackages;

NestedPackages 패키지에 대해 주목해야 할 정말 중요한 점은 이 패키지가 PackageExamples 라는 또 다른 패키지에 포함되어 있다는 것입니다. 이 패키지는 다시 ModelicaByExample 이라는 패키지에 포함되어 있습니다. 상단의 within 절에서 이를 알 수 있습니다.

within ModelicaByExample.PackageExamples;

이 책에서 지금까지 시뮬레이션한 모든 단일 모델 은 사실 패키지에 포함되어 있습니다. 이러한 예제에 대한 소스 코드를 보여 주었을 때 within 절이 무엇을 위해 사용되었는지 아직 논의할 준비가 되지 않았기 때문에 맨 위 줄을 잘라냈습니다.앞서 섦명한 예제의 모든 경우에 대해 첫번째 줄에 있었습니다.

Types 패키지와 LotkaVolterra 모델에는 어떤 종류의 within 절도 포함되어 있지 않습니다. NestedPackages 패키지 내부에 직접 정의되어 있기 때문에 어떤 패키지에 있는지 알고 있기 때문입니다.그렇다면 NestedPackages 정의 바로 앞에 나타나는 이유는 무엇일까요?``NestedPackages`` 패키지는 독립형 파일이기 때문입니다.즉, 이런경우 모델리카 정의가 파일 및 디렉터리에 매핑될 때 관련 방법을 명시적으로 지정해야 합니다.나중에 파일, 디렉토리 및 패키지 정의(Package Definitions) 사이의 관계에 대해 깊게 논의 하겠습니다.지금 이해해야 할 중요한 것은 within 절이 단순히 부모 패키지를 지정하는 데 사용된다는 것입니다.