Ada

[ADA]Ada 기초(5)

TigerShin 2021. 8. 19. 14:31

오늘은 약 2주만에 드럽게 오랫동안 안 올렸네 ADA 기초 5번째 시간입니다.

이번에는 포인터와 레퍼런스 같은 것을 한번 해볼테니까, 이번에도 재밌게 즐겨보십쇼:)

In 파라미터

어느날 당신은 이러한 함수를 짜고싶습니다.

어떠한 함수가 존재하는데, 그 함수에 인자가 서로의 값을 바꾸도록 해보고 싶어!

보통 이러한 함수는 C언어에서는 포인터를 이용하면, 어렵지 않게 구현을 할 수 있습니다.
하지만 Ada에서는 어떻게 구현을 해야할까요?

일단 임의의 코드를 작성해봅시다.

with Ada.Text_IO; use Ada.Text_IO;

procedure example_01 is
    procedure SwapFunction(A, B : Integer) is
        Tmp : Integer := 0;
    begin
        Tmp := A;
        A := B;
        B := Tmp;
    end SwapFunction;

    First : Integer := 10;
    Second : Integer := 11;
begin
    SwapFunction(First, Second);
    Put_Line("First: " & Integer'Image(First));
    Put_Line("Second: " & Integer'Image(Second));
end example_01;

한번 이상태로 컴파일을 해볼까요?

당연히 오류가 터진다...

당연히 오류가 터질 것입니다.

왜냐하면, 인자는 임의의 변수 이지, 대입을 한 그 변수 자체가 아니기 때문입니다.
그렇기 때문에, 에이다에서도, C언어처럼 포인터와 같은 것을 이용하여야 합니다.

이러한 포인터와 같은 역할을 하기 위하여, 이용을 하는 것이 Parameter Mode입니다.
파라미터 모드는 어떠한 인자에 대하여, 읽어낼 수도 있고, 쓸수도 있도록 하는, 일명 포인터와 레퍼런스 개념이라고 생각하시면 됩니다.

에이다에서는 파라미터 모드가 총 세개로, in, out, in out이 존재합니다.

in은 일반적으로 읽는 것 만이 가능한 모드입니다.
간단하게 설명 드리자면, 기본적인 파라미터 모드이기에, 읽기는 가능하나, 그 인자에 대한 값 쓰기는 허용이 되지 않습니다.

out은 쓴 이후에야, 읽기가 가능합니다.
예를 들어,

procedure OutParam is
    procedure Foo(A : out Integer) is
        B : Integer := A;
    begin
        A := B;
    end Foo;
begin
    null;
end OutParam;

여기서, Foo의 인자인 A는 넣은 인자의 값까지 같이 넘기는 것이 아닌, 그 넣어진 인자만 들어가기에, 한번 함수에서 초기화를 진행하지 않으면, 초기화를 하지 않은 값이라고 경고를 내보냅니다.

이런식으로!


그럼, 아까 위에서 작성을 했었던, SwapFunction의 작동을 위해서는 읽기와 쓰기가 동시에 가능한, in out 파라미터를 작성하시면 됩니다.

with Ada.Text_IO; use Ada.Text_IO;

procedure InOutParam is
    procedure print_Integer(str : String; Val : in Integer) is
    begin
        Put_Line(str & ": " & Integer'Image(Val));
    end;

    procedure SwapFunction(A, B : in out Integer) is
        Tmp : Integer := 0;
    begin
        Tmp := A;
        A := B;
        B := Tmp;
    end SwapFunction;

    First : Integer := 10;
    Second : Integer := 11;
begin
    Put_Line("===============Before===============");
    print_Integer("First", First);
    print_Integer("Second", Second);
    Put_Line("====================================");
    SwapFunction(First, Second);
    Put_Line("================After===============");
    print_Integer("First", First);
    print_Integer("Second", Second);
    Put_Line("====================================");
end InOutParam;

이제 컴파일을 해보고, 작동을 해보면

이런식으로 값이 바뀌었다면, 잘 작동이 된 것 입니다.

함수명 변경(Renaming)

에이다에는 Renaming이라는 기능을 제공합니다.
간단하게 설명을 드리자면, 어떠한 이름이 길거나, 외우기에 버거운 함수를 간단한 함수로 변경해주는 기능입니다.

간단한 형식은

-- 반환을 하지 않은 함수인 경우
procedure <변경하고자 하는 함수명>(인자명: 변경하고자 하는 함수의 인자와 동일한 타입, ...) renames <원래 함수 명>
-- 반환을 하는 함수인 경우
function <변경하고자 하는 함수명>(인자명: 변경하고자 하는 함수의 인자와 동일한 타입, ...) return <원래 함수의 반환형> renames <원래 함수 명>

입니다.

그럼 이를 이용하여, Integer'Image를 줄여서 사용을 해보자면,

with Ada.Text_IO; use Ada.Text_IO;

procedure example_rename is
    function a2i(I : Integer) return String renames Integer'Image;
begin
    Put_Line("Test: " & a2i(100));
end example_rename;

이렇게 작성을 하면, a2i함수를 사용하면, Integer'Image 함수와 같으면서, 짧게 사용을 할 수 있습니다.

컴파일을 하고, 작동을 해보면

잘 작동이 되는 것을 알 수 있습니다.

잊지 말아야 할 것은 Renaming을 하면, 그 함수의 또다른 별명이 되는거지, 그 함수의 이름을 다시는 사용하지 못하는 것은 아닙니다.

소스코드

오늘 작성은 소스코드는 깃허브에 올려놨습니다:)

'Ada' 카테고리의 다른 글

[ADA]5. Ada 기초(4)  (0) 2021.08.10
[ADA]4. ADA 기초(3)  (0) 2021.07.12
[ADA]3.ADA 기초(2)  (0) 2021.07.05
[ADA]2. ADA 기초(1)  (0) 2021.07.04
[ADA]1.시작  (0) 2021.07.03