디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

Ada 프로그래밍: 3. Ada 형식 시스템

나르시갤로그로 이동합니다. 2025.08.11 00:22:45
조회 88 추천 0 댓글 0

3. Ada 형식 시스템

Ada의 형식 시스템(type system)은 언어의 신뢰성과 정확성 목표를 달성하기 위한 중심 기능이자 주요 도구입니다. 이는 문제 영역을 모델링하고, 애플리케이션별 규칙을 코드에 내장하며, 프로그램이 실행되기 전에 컴파일러가 광범위한 논리적 오류를 감지할 수 있도록 하는 메커니즘입니다.

3.1 강력한 형식 지정 원칙

Ada는 강력한 형식 지정(strongly typed) 언어입니다. 이는 컴파일 시간 오류 감지를 높이기 위한 설계상의 선택입니다. 이 시스템은 몇 가지 주요 규칙에 기반합니다:

  • 이름 동등성(Name Equivalence): 두 변수는 동일한 형식 이름을 사용하여 선언된 경우에만 동일한 형식입니다. 기본 구조나 표현이 동일하다는 것만으로는 충분하지 않습니다. 예를 들어, 두 개의 정수 형식을 고려해 봅시다:

    type Apples  is range 0 .. 1_000;
    type Oranges is range 0 .. 1_000;
    
    num_apples  : Apples;
    num_oranges : Oranges;
    
  • 암묵적 변환 없음(No Implicit Conversions): 컴파일러는 다른 형식, 특히 숫자 형식 간에 암묵적인 형식 변환을 수행하지 않습니다. 프로그래머가 Apples 형식의 값을 Oranges 형식의 변수에 할당하려면, 명시적으로 num_apples := Apples (Num_Oranges);와 같이 해야 합니다. 이는 프로그래머가 변환을 인지하도록 강제하여 의도를 명확히 하고 미묘한 오류를 방지합니다. 암묵적 변환의 위험성을 보여주는 대표적인 예는 정수 나눗셈입니다. C++나 Java에서 float result = 5 / 2; 표현식은 2.0을 산출하는데, 이는 먼저 정수 나눗셈이 수행되고 그 결과(2)가 암묵적으로 float로 변환되기 때문입니다. Ada에서 이에 상응하는 연산은 result := Float (5) / Float (2);와 같이 명시적인 변환을 요구하며, 이는 부동소수점 나눗셈을 올바르게 수행하여 2.5를 산출합니다.

    이러한 엄격함은 형식 시스템이 도메인 모델링 도구로서 기능하게 합니다. 서로 다른 물리량(예: Meters, Kilograms, Seconds)에 대해 별개의 형식을 생성함으로써, 프로그래머는 컴파일러를 사용하여 이러한 양들이 절대 잘못 결합되지 않도록 보장할 수 있으며, 이로써 논리적 및 물리적 모델링 오류의 한 종류를 방지할 수 있습니다.

3.2 스칼라 형식

스칼라 형식(Scalar types)은 숫자나 문자와 같은 단일 값을 나타냅니다. Ada는 사용자 정의 스칼라 형식을 정의하기 위한 일련의 기능을 제공합니다.

정수 형식

Ada는 미리 정의된 Integer 형식을 제공하지만, 범위가 제한된 문제별 정수 형식을 생성할 것을 권장합니다.

type Day_Of_Month is range 1 .. 31;
type Engine_RPM   is range 0 .. 7_000;

Day_Of_Month 형식의 변수를 선언하면 값이 지정된 범위로 제한될 뿐만 아니라, Engine_RPM과 같은 다른 정수 형식과 호환되지 않게 됩니다. 정의된 범위 밖의 값을 할당하려는 시도는 컴파일 시간에 포착되지 않으면 실행 시간에 미리 정의된 Constraint_Error 예외를 발생시킵니다.

표준 라이브러리는 또한 Integer의 유용한 두 가지 미리 정의된 서브타입을 제공합니다:

  • subtype Natural is Integer range 0 .. Integer'last;
  • subtype Positive is Integer range 1 .. Integer'last;

열거 형식

열거 형식(Enumeration types)은 그 값들이 정렬된 식별자 목록으로 지정되는 형식입니다. 상태, 모드 또는 명명된 값들의 집합을 모델링하는 데 유용합니다.

type Traffic_Light_Color is (Red, Amber, Green);
type Day_Of_Week is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

값들은 순서가 있으므로, <  >와 같은 관계 연산자가 정의됩니다(예: Red < Amber는 참입니다).

실수 형식 (부동소수점 및 고정소수점)

실수를 포함하는 계산을 위해 Ada는 두 종류의 형식을 제공합니다:

  • 부동소수점 형식(Floating-Point Types): 상대 오차가 중요한 근사 계산에 사용됩니다. 프로그래머는 필요한 십진수 정밀도 자릿수를 지정합니다.

    type Percentage is digits 7 range 0.0 .. 100.0;
    type Mass is digits 15; -- 범위 제약이 없는 부동소수점 형식
    
  • 고정소수점 형식(Fixed-Point Types): 금융 계산과 같이 절대 오차가 중요한 근사 계산에 사용됩니다. 프로그래머는 절대 오차 한계인 델타(delta)를 지정합니다.

    type Dollars is delta 0.01 range 0.0 .. 1_000_000.00;
    

    이는 Dollars 형식의 값이 0.01보다 크지 않은 오차로 표현됨을 보장합니다.

서브타입

서브타입(Subtype)은 새로운 형식을 생성하지 않습니다. 대신, 기존 기본 형식에 선택적 제약을 제공합니다. 서브타입은 그 기본 형식 및 동일한 기본 형식의 다른 서브타입과 호환됩니다.

subtype Work_Day is Day_Of_Week range Monday .. Friday;

today    : Day_Of_Week;
pay_day  : Work_Day;
...
today := pay_day; -- 항상 합법적임
-- 합법적이지만, Today가 Saturday나 Sunday일 경우 실행 시간에 Constraint_Error를 발생시킴
pay_day := today;

새로운 type을 생성할지 subtype을 생성할지 선택하는 것은 기본적인 설계 결정입니다. 새로운 형식을 생성하면 엄격한 분리를 강제하고 개념의 우발적인 혼합(예: Celsius Fahrenheit)을 방지합니다. 서브타입을 생성하면 제약을 강제하면서 호환성을 허용하므로, 단일 개념을 정제하는 데 유용합니다(예: Work_Day Day_Of_Week의 부분집합).

3.3 복합 형식

복합 형식(Composite types)은 다른 형식들의 컬렉션을 나타냅니다.

배열

배열(Arrays)은 모두 동일한 형식의 구성 요소들의 컬렉션이며, 이산 형식(정수 또는 열거 형식)으로 인덱싱됩니다. Ada는 경계가 컴파일 시간에 고정되는 제한된 배열(constrained arrays)과 경계가 실행 시간에 결정될 수 있는 비제한 배열(unconstrained arrays)을 구분합니다.

  • 제한된 배열:

    type Vector is array (1 .. 10) of Float;
    my_vector : Vector; -- 경계가 1 .. 10으로 고정됨
    
  • 비제한 배열: 경계는 <>(box)로 표시됩니다.

    type Matrix is array (Integer range <>, Integer range <>) of Float;
    
    -- 객체가 선언될 때 경계가 지정됨
    m1 : Matrix (1 .. 10, 1 .. 20);
    m2 : Matrix (0 .. 4,  0 .. 4);
    

미리 정의된 String 형식은 비제한 배열입니다: type String is array (Positive range <>) of Character;.

레코드

레코드(Records)는 다른 형식일 수 있는 명명된 구성 요소들의 컬렉션입니다. C의 struct와 유사합니다.

type Date is record
  year  : Integer range 1900 .. 2100;
  month : Integer range 1 .. 12;
  day   : Day_Of_Month; -- 이전에 정의된 형식을 사용
end record;

type Person is record
  name      : String (1 .. 30);
  birthdate : Date;
end record;

3.4 접근 형식 (포인터)

Ada의 접근 형식(Access types)은 다른 언어의 포인터나 참조에 해당하지만, 안전성을 강조하여 설계되었습니다.

  • 강력한 형식 지정: 접근 형식은 지정할 수 있는 특정 형식에 묶여 있습니다. 형식 없는(void*) 포인터가 없어, 일반적인 형식 오류의 원인을 방지합니다.

  • 포인터 연산 없음: 접근 값에 대해 산술 연산을 수행하는 것은 불법입니다. 이 제한은 메모리 손상 버그와 보안 취약점의 한 종류를 제거합니다.

  • 선언 및 사용: access 형식은 access 키워드로 선언됩니다. new 할당자는 힙에 객체를 생성하고 해당 객체를 지정하는 접근 값을 반환하는 데 사용됩니다. .all 접미사는 접근 값을 역참조하여 지정된 객체에 접근하는 데 사용됩니다.

procedure main is
  -- Integer 객체만 가리킬 수 있는 접근 형식 선언
  type Integer_Access is access Integer;

    -- 특정 객체 및 접근 형식으로 제네릭 패키지를 인스턴스화하여
    -- 할당 해제를 위한 프로시저 선언.
    procedure free is new Ada.Unchecked_Deallocation (
      object => Integer,
      name   => Integer_Access
    );

  -- 기본적으로 null로 초기화되는 접근 변수 선언
  p : Integer_Access;

begin
  -- 힙에 값 42를 가진 새로운 Integer 객체를 할당하고,
  -- p가 그 객체를 가리키게 함.
  p := new Integer'(42);

  -- .all을 사용하여 지정된 객체의 값에 접근
  Ada.Text_IO.put_line (Integer'image (p.all)); -- " 42"를 출력

  p.all := p.all + 1; -- 지정된 객체는 이제 43

  free (p);
end main;

이러한 규칙을 강제함으로써, Ada의 접근 형식은 전통적인 포인터와 관련된 위험 없이 동적 데이터 구조의 강력한 기능을 제공합니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 존재만으로도 웃음주는 최고의 '웃수저' 스타는? 운영자 25/08/25 - -
공지 프로그래밍 갤러리 이용 안내 [90] 운영자 20.09.28 46612 65
2884319 결국 드러난 러뻘러 수준 ㅋㅋ 나르시갤로그로 이동합니다. 11:06 8 0
2884318 체력이 회복안되면 양치기에 급급해서 디테일이 떨어짐 ♥지나가던냥덩이♥갤로그로 이동합니다. 11:05 8 0
2884317 열정이 올 때 ♥지나가던냥덩이♥갤로그로 이동합니다. 10:59 7 0
2884316 해외로 탈영한 애들 이유 ♥지나가던냥덩이♥갤로그로 이동합니다. 10:46 11 0
2884315 피에로배르뎅씨가 벌써 2연속 간식타가셧습니다 [2] 헬마스터갤로그로 이동합니다. 10:36 16 0
2884314 베리나 근황 ♥지나가던냥덩이♥갤로그로 이동합니다. 10:34 18 0
2884313 웹땔깜 국비들 모여있는 갤러리가 어디냐? 프갤러(175.195) 10:33 11 0
2884312 아스카 JLPT 합격 [2] 아스카영원히사랑해갤로그로 이동합니다. 10:27 27 0
2884311 오늘도 프로그래밍 공부 ㅆㅇㅆ(124.216) 10:25 13 0
2884310 45세~50대는 우선 거르고 봄 좌좀세대인걸 떠나서 수치로 보여줌 ♥지나가던냥덩이♥갤로그로 이동합니다. 10:13 12 0
2884309 이 실력으로 영어강사나 가이드 ㄱㄴ) ㅇㅇ(58.229) 10:12 13 0
2884308 책임자가 무능한건 상관없는데 그 책임을 팀에 전가시키려는건 문제 ♥지나가던냥덩이♥갤로그로 이동합니다. 10:11 15 0
2884307 나님 산업진출 분야 ♥지나가던냥덩이♥갤로그로 이동합니다. 10:03 17 0
2884306 뉴프로에도 이런 어그로성글이 달리면 좋겟습니다 헬마스터갤로그로 이동합니다. 09:58 21 0
2884305 아스카 진짜로 본진 이사함 [2] 아스카영원히사랑해갤로그로 이동합니다. 09:48 32 0
2884300 죽여주싣시옵서 전하 [1] 주아갤로그로 이동합니다. 09:19 20 0
2884291 베티 골드 作 . ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 09:03 14 0
2884290 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:56 13 0
2884288 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:52 23 0
2884287 결국 해석의 문제임 어중이떠중이가 알지도 못하면서 이러쿵저러쿵 ♥지나가던냥덩이♥갤로그로 이동합니다. 08:39 25 0
2884286 흠.. 구조가 어캐 되있는건지 확신할수가 없냉 ♥지나가던냥덩이♥갤로그로 이동합니다. 08:37 26 0
2884285 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥지나가던냥덩이♥갤로그로 이동합니다. 08:18 18 0
2884284 하 진짜 지하철 시위 개빡친다 류류(118.235) 08:08 19 0
2884283 기획자들 이상한글을 써대네 [2] 프갤러(210.223) 08:03 37 0
2884282 러스트는 문법차원에서 데이터 레이스를 발생할 가능성조차 없앱니다. 프갤러(223.55) 07:53 18 0
2884275 요즘들어 ai api 터지는 경우가 잦네 [2] 뉴진파갤로그로 이동합니다. 05:55 55 0
2884273 25년 입결 수직 급상승 로켓 떡상 탑 클라쓰 라이징 블루칩!# 프갤러(59.17) 05:34 39 1
2884272 fast edit blocks 성능이 개좋다 ㄹㅇ.. 꼬치의달인갤로그로 이동합니다. 05:21 27 0
2884271 주 5일제는 사단, 마귀의 꾀임일 지어다 발명도둑잡기갤로그로 이동합니다. 05:08 21 0
2884269 홍순만 세계 톱클래스 저널들이 주목한 행정학계 신성 발명도둑잡기갤로그로 이동합니다. 04:50 14 0
2884266 음기 충전 발명도둑잡기갤로그로 이동합니다. 04:32 45 0
2884265 디시인사이드는 표현의 자유의 적이다 [1] 발명도둑잡기갤로그로 이동합니다. 04:14 28 0
2884264 조선이 부정적으로 나오는 젤렌스키 드라마 발명도둑잡기갤로그로 이동합니다. 03:58 18 0
2884263 동일 조건 하에 Ada와 Rust, 데이터 경쟁 100% 제거 나르시갤로그로 이동합니다. 03:53 29 0
2884262 일본 미즈호은행 차세대프로젝트 ada -> c++ 실패이야기 ㅇㅇ(211.193) 03:45 31 0
2884261 Ada의 주요 특징 중 동시성 나르시갤로그로 이동합니다. 03:41 22 0
2884260 세팅 범죄 발명도둑잡기갤로그로 이동합니다. 03:41 19 0
2884257 Balming Tiger-나란히 나란히 발명도둑잡기갤로그로 이동합니다. 03:31 14 0
2884254 교실서 '노'만 나와도 낄낄, "일베·극우 태풍이 온다" 발명도둑잡기갤로그로 이동합니다. 03:28 25 0
2884252 BE’O (비오) - 'ICONIC (Feat. 창모 (CHANGMO)) 발명도둑잡기갤로그로 이동합니다. 03:25 21 1
2884250 양당정치 국가들은 양극화가 심해지고 폭력물이 넘친다 발명도둑잡기갤로그로 이동합니다. 03:10 17 0
2884249 콘크리트 유토피아 ㅇㅇ(210.100) 03:06 29 0
2884247 정의당, 노동당의 예상과 다르게 이재명 민주당이 노란봉투법을 통과시켰다 발명도둑잡기갤로그로 이동합니다. 02:53 30 0
2884245 오늘의 발명 실마리: 음악, 책, 이미지, 영상 링크 추천 능력 측정기 발명도둑잡기갤로그로 이동합니다. 02:42 21 0
2884244 오늘의 작사 실마리: 한 번만 들어도 마음에 문신처럼 새겨지는 노래 발명도둑잡기갤로그로 이동합니다. 02:32 18 0
2884242 인터넷이 무법지대가 된 이유는 애초 인터넷 설계를 잘못 해서다 발명도둑잡기갤로그로 이동합니다. 02:26 20 0
2884240 사회참여 예술을 잘 안하는 이유는 발명도둑잡기갤로그로 이동합니다. 02:23 22 0
2884239 코딩 아조씨 특징 [1] ㅇㅇ(211.193) 02:14 95 0
2884238 Lovelyz(러블리즈) _ Wag-zak(여름 한 조각) 발명도둑잡기갤로그로 이동합니다. 02:10 20 0
뉴스 무당 된 개그우먼 김주연 “2년 하혈…누름굿에 2억 썼다” 디시트렌드 08.22
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2