Ada

[ADA]3.ADA 기초(2)

TigerShin 2021. 7. 5. 22:15

ADA에 대한 기초 2번째 시간입니다.

오늘은 조건문과 반복문에 대해서 간단하게 알아보겠습니다.

조건문

ADA에서의 조건문 구조는 다음과 같습니다.

if <조건문> then
elsif <조건문> then
else 
end if

대략 이러합니다.

그럼 조건문의 구조는 알았으니, 조건문을 응용해볼까요?

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure program_if is
    N : Integer;
begin
    Put("Enter an Integer Value: ");
    Get(N);
    if N > 0 then
        Put(N);
        Put_Line("bigger than zero!");
    end if;
end program_if;

다음과 같은 소스코드를 작성했습니다.

대략적인 소스 설명을 해보자면, Put_Line은 줄내림을 포함한 출력을 의미합니다.
그러므로, Put은 줄내림을 포함하지 않은 출력을 의미합니다. 또한, Get은 입력을 의미합니다.
그리고 use는 C++에서 using namespace와 같은 역할을 하신다고 생각하시면 됩니다.

즉, 이를 토대로, Enter an Integer Value: <입력> 이런 형식으로 될 것임을 요추해볼 수 있습니다.
이제 미리 선언해둔 변수 N에 입력값으로 0보다 큰 값이라면, bigger than zero!를 출력하는 프로그램이라는 것을 알 수 있습니다.

그럼 입력한 값이 0보다 크거나, 같거나, 낮다는 것을 판별해주는 프로그램을 만들어봅시다.

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure program_if is
    N : Integer;
begin
    Put("Enter an Integer Value: ");
    Get(N);
    if N > 0 then
        Put(N);
        Put_Line(" bigger than zero!");
    elsif N = 0 then
        Put(N);
        Put_Line(" same as zero!");
    else
        Put(N);
        Put_Line(" smaller than zero!");
    end if;
end program_if;

여기서 다른 언어와 헷갈리지 말아야할 것은 Ada는 파스칼의 영향을 받은 언어이기에, 대입연산자가 '='이 아닌, ':='이고, 동일을 뜻하는 연산자는 '='입니다.

즉 위에서 N = 0은 C언어에서는 N == 0과 같다고 생각하시면 됩니다.

그럼 과연 작동이 되는지를, 컴파일을 하여 확인을 해볼까요?

작동이 잘 된다!


작동이 잘 됨을 알 수 있습니다.

이런 식으로 Ada에서의 조건문을 간단하게 알 수 있었습니다.

반복문

PL/pgSQL 또는 PL/SQL을 접해보신 분들이라면, 반복문이 익숙하실 수 있습니다.
PL/pgSQL과 PL/SQL은 Ada의 영향을 받아 제작된 언어이기에, 비슷한 구조를 지니고 있습니다.

그럼 알아볼까요?

For loops 형

For loops 형은 일반적인 For문과 약간 차이가 있지만(?), 파이썬 형태의 For문과 유사합니다.

for <변수> in <배열> loop
    <실행시키고자 하는 코드>
end loop;

이러한 구조를 가지고 있습니다.

파이썬 For문과 구조가 유사하죠?
그렇기 때문에 그리 어려움은 가지시지 않으실거라고 생각합니다.

예시로 만들어서 작동을 시켜봅시다!

with Ada.Text_IO; use Ada.Text_IO;

procedure loop_1 is
begin
    for I in 1 .. 5 loop
        Put_Line(Integer'Image(I) & " times!");
    end loop;
end loop_1;

'Image가 보이실 것 입니다!
기본적인 형태는 X'Image(Y) 형태를 가지고 있는데, 간단하게 설명하자면, X는 Y의 타입이고, Y는 변수입니다. 이를 실행하면, string형으로 반환을 시키기 때문에, I를 String으로 바꾸어준 이후 '&'을 이용하여, 두 문자열을 묶어서 출력하는 방식입니다!

C언어로 보자면, printf("%d times!", I); 와 같은 애들이죠!

그럼 소스코드에 대한 간단한 분석은 끝났으니, 작동을 해볼까요?

잘 작동이 됩니다!

또한 reverse를 이용하여, 역순으로 정렬하여 출력해줄 수 있습니다!

with Ada.Text_IO; use Ada.Text_IO;

procedure loop_1 is
begin
    for I in reverse 1 .. 5 loop
        Put_Line(Integer'Image(I) & " times!");
    end loop;
end loop_1;

이런식으로 말이죠!

While loops 형

While loops 형은 다른 언어에서의 While문과 같은 역할을 지니고 있습니다!

while loop는 비교적 구조가 간단하기에, 간단하게 보고 넘어갑시다!

while <조건문> loop
    <실행할 코드>
end loop;

이런식으로 구조를 가지고 있으며, 기본적으로 일반적인 타언어들에서의 While문과 큰 차이를 보이지 않기에, 넘어가도록 하겠습니다!

Bare loops 형

Bare loops 형은 처음 볼 것 입니다...
Bare loops 형은 간단하게, 그동안 For이나, While 처럼 loop가 같이 붙어서 나오는 형태가 아닌, 독립적인 형태를 가지고 있습니다.

loop
<실행하고자 하는 코드>
end loop;

그럼 이러한 형태만 보면, 조건이 없기 때문에 결국 무한반복문의 형태를 가집니다.
그럼 간단한 프로그램을 만들어 확인해볼까요?

with Ada.Text_IO; use Ada.Text_IO;

procedure loop_2 is
    I : Integer := 0;
begin
    loop
        Put_Line(Integer'Image(I) & " Times!");
        I := I + 1;
    end loop;
end loop_2;

해당 소스코드를 컴파일하고, 실행을 할 경우

프로세스를 강제 종료 시키지 않을 경우, 무한히 반복되는 것을 확인하실 수 있습니다.

???: 그럼 무한반복문에서 특정 조건에서 빠져나가고 싶다면 어떻게 해야하나요?

어렵지 않습니다!
exit를 이용하면 됩니다!

???: 그럼 exit만 사용하면 되나요??
그럴리가요...
그냥 exit만 쓰면, 한번만 쓰고 꺼진답니다...

???: 그럼 if문을!!
그건 너무 덩치가 크잖아요...

???: 아놔 그럼 뭐 사용하냐고요;;
when <조건문>을 이용하면 됩니다!

exit와 when <조건문>을 이용하여, 무한루프에서도 특정 조건이 되었을 때, 루프문을 빠져나오도록 해줄 수 있습니다.

with Ada.Text_IO; use Ada.Text_IO;

procedure loop_2 is
    I : Integer := 0;
begin
    loop
        Put_Line(Integer'Image(I) & " Times!");
        I := I + 1;
        exit when I = 5; -- Exit when 'I' is 5
    end loop;
end loop_2;

이런식으로 작성하고 컴파일을 시킨다면,

제대로 작동이 됨을 아실 수 있습니다!

'Ada' 카테고리의 다른 글

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