프로그래밍 언어란? 기계가 읽을 수 있고, 사람이 읽을 수 있는 형태로 계산된 표현 체계
언어 설계의 기본 원칙
1) 효율성 : 목적 코드의 효율성 (실행 속도) , 번역의 효율성 (컴파일 속도) , 구현의 효율성 (알고리즘이 얼마나 쉬운가) , 프로그래밍의 효율성 (프로그램 작성이 얼마나 쉬운가) , 비용(돈) 문제 (개발비 / 디버깅 유지보수 / 구현 및 실행 비용)
2) 일반성 : 관련 있는 여러 개념들을 일반적인 하나의 개념으로 통합하여 얻는 성질
3) 직교성 : 언어의 구성자들이 각각 서로 독립적인 의미를 가진 채 조합하는 성질
4) 획일성 : 유사한 것은 유사하게, 상이한 것은 서로 다르게 표현
기타 설계 원칙
- 간결성, 안전성, 표현력, 정확성, 확장성 , 기계 독립성 , 제약성 , 부분성
일반성 부족 사례
1) Pascal : 가변 배열 불허 , 프로시저형 변수 불허
2) Modula-2 : 가변 배열 선언 불허, 그나마 일반성에 충실한 편 (프로시저)
3) Ada : 가변 배열 허용 , 매개변수에 프로시저는 사용 불가 , 배열&레코드에 배정 가능
4) Fortran : call by reference만 허용 , 가변 배열 선언 불허
5) JAVA의 포인터 불허 , Pascal의 포인터 제한
직교성 부족 사례
1) 함수 반환 값 자료형
- Pascal : 스칼라형, 포인터형 만 허용
- C : 배열만 제외
- Ada : 모든 자료형 허용 -> 완벽
2) 파일
- Pascal : 파일형을 특별한 상태 취급, but 매개변수 전달 및 배정 금지
- 대부분 언어 : 파일을 라이브러리 취급 (비직교성 탈피)
3) 문자열
- Modula-2 : 문자열 배정 (작 -> 큰)
- 크기가 다른 객체에 대한 유일한 배정
4) 매개변수 전달
- C : 배열만 call by reference , 나머지는 call by value
- Ada : 모든 자료형에 call by value, result, value-result 허용하여 직교성 보장
Algol 68의 중요 설계 목표 - 직교성 보장
획일성 부족 사례
- if, while : begin-end 구조 요구
- repeat : begin-end 구조 비 요구
- ^(*) : 포인터 선언용과 , 포인터 값 가져오는 용으로 의미가 다름
- ; : Modula-2와 Pascal에서 문장의 구분자 , 종결자로 세미콜론의 의미가 2개임
강 타입언어 : 자료형이 다른 경우 혼용 불가
프로그래밍 언어에게 중요한 것 : Readability , Writability , Reliability , Cost
컴퓨터 : 프로그램을 실행할 수 있는 알고리즘 + 자료구조 집합
하드웨어 컴퓨터(실제 컴퓨터)
소프트웨어 시뮬레이터 컴퓨터
가상 컴퓨터 (virtual computer)
언어 구문 : 프로그래밍 언어에서 사용할 수 있는 문자들의 집합
Fortran -> 기본 문자 집합 + 13개의 특수 문자
Algol 60 -> 알파벳 대소문자 52개 + 아라비아 숫자 10개 + 28개의 특수문자
문자 코드 체계 : EBCDIC (Extended Binary Coded Decimal Interchange Code) -> 8비트
ASCII (American Standard Code for Information Interchange) -> 7비트 (128개의 문자 표현)
영문자 대소문자 52 + 숫자 10 + 33 특수문자 + 33 제어문자
Uni code => 16비트
정합 순서 (collating sequence) : 언어에 제공된 문자 순서 <-> 특수 문자 순서 : 코드 체계를 따르며 프로그래머 정의가능
lexcial token(어휘 토큰) , lexical element(어휘 요소) , lexical unit(어휘 단위)
-> 언어의 알파벳 문자로 구성된 문자열 , 기본 의미 단위를 표현하는 한 개 이상의 프로그램
language construct(언어 구성자)
-> 한 개 이상의 어휘 토큰으로 형성되며, 구문적으로 허용된 프로그램의 일부
identifier(식별자)
-> 언어 구성자를 명명하는 어휘 토큰
predefined identifier(미리 정의된 식별자) => 예약어(reserved words , key words)
예약어
-> 언어 어휘를 구성하는 단어나 기호 형태의 문자 알파벳
-> 프로그램 변수 이름으로 사용 불가
장점 : 프로그램 판독성 증가, 컴파일러가 기호 테이블을 빠른 시간에 탐색
단점 : 많은 예약어를 기억하기 어려움, 언어 확장 시 새로운 예약어가 확장 이전에 사용했던 프로그램의 식별자와 중복 우려
BNF(Backus - Naur Form)
: 구문 형식을 정의하는 가장 보편적인 표기법 (생성 규칙)
::= 정의하다
<> 비단말 (nonterminal)
| 택일 기호
EBNF(Extended Backus - Naur Form)
: BNF 표기법을 확장하여 보다 읽기 쉽고, 간단하게 표현된 표기법
반복 : { }, (0번 이상 반복)
선택 : [ ] (0번 또는 1번 선택)
택일 : | (둘 중 하나 선택)
메타기호를 언어의 terminal로 사용하는 경우 인용 부호로 묶어 표현
<identfier> : 식별자
<literal> : 상수
<expression> , <exp> : 수식, 계산식
<statement> : 대입문, 분기문, 반복문
<type> : 자료형
<term> : 곱/나눗셈 시 연산자와 <factor>로 이루어진 조합의 수식
구문 도표 : 순서도와 유사하며, 단말/비단말 노드 구분
단말(terminal)
- 최종적으로 구문 분석 결과로 나타나는 단어
- 실제로 입력될 수 있는 문자열
- 키워드, 식별자, 상수, 연산자 등과 같이 입력으로 직접 사용되는 단어
- 작은 따옴표, 큰 따옴표로 감쌈
비단말(nonterminal)
- 문법 규칙에서만 사용되는 단어
- 구문 분석의 중간 과정에서 사용
- 다른 규칙에 참조 가능, 하나의 복잡한 문법으로 구성
- <> 괄호
파스 트리(parse tree)
- 원시 프로그램의 문법을 검사하는 과정에서 내부적으로 생성되는 트리 형태의 자료구조
모호(ambiguous) : 같은 파스트리에 대해서 두 가지 서로 다른 파스 트리가 발생하는 경우
순위 폭포(precedence cascade) : 새 비단말기호(<term>)와 문법 규칙을 추가하여 문법의 우선순위를 정함
=> 좌-결합 , 우-결합
현수(dangling) else 문제
=> 중첩된 if문에서 연결된 else를 찾을때 어렵게 되는 현상
번역기법 (source 원시언어 => translator => target 목적언어)
번역기의 종류
1) 컴파일러 (compiler) 원시 언어 : 고급언어 , 목적 언어 : 실제 기계 언어에 가까운 저급 언어(준 기계어, 어셈블리)
2) 어셈블러 (assembler) 원시 언어 : 어셈블리 언어 , 목적 언어 : 준 기계어
3) 링커, 링키지 에디터 (linkage editor) 여러개의 프로그램을 묶어서 로드 모듈(어느 정도 실행 가능한 하나의 기계어) 생성
4) 로더 (loader) 기계어 프로그램(로드 모듈)을 실제 실행 가능한 기계어로 번역해서 주기억 장치에 적재
5) 프리프로세서(preprocessor) #define, #include 처럼 소스 코드를 처리하여 컴파일러에 전달하기 전에 전처리된 소스 코드를 생성
인터프리터 기법
-> 고급 언어 기계를 다른 기계에서 소프트웨어로 시뮬레이션 하는 방법
번역기(컴파일러)는 입력 프로그램과 동일한 의미의 목적 코드를 생성하는 거고, 인터프리터는 직접 입력 프로그램을 실행하는 것이다.
순수 번역기법(obj모듈로 번역 -> link -> load -> 실행)
순수 시뮬레이션 기법(JCL, APL)
순수 번역이나 순수 시뮬레이션은 실제로는 거의 없고 좀 혼합된 형태로 존재
번역기법
장 : 실행시간 효율성 (한번 디코딩으로 반복 실행)
단 : 번역된 프로그램이 큰 기억장치 요구(I/O routine 등)
인터프리터 기법
장 : 사용자의 적응성 제공
단 : 실행시간 효율성 저하
하이브리드 기법
-> 프로그램을 실행 시키기 쉬운 형태로 번역한 후, 인터프리터 기법을 사용하여 시뮬레이션
-> 대부분의 인터프리터 언어
-> 중간 형태 코드가 저급이면 번역기법으로 간주되기도 함
컴파일러 언어
Fortran, Algol, PL/I , Pascal, Cobol, C, Ada
인터프리터 언어
Lisp, Snobol4 , APL ,Prolog
변수(variable) : 이름, 속성의 집합, 참조, 값 4요소로 구성
이름 - 속성들 - 주소(참조) - 값
(이름 자체도 하나의 속성)
선언문 또는 묵시적 선언으로 생성, 식별자, 자료 속성들의 집합
주소와 자료값들의 관계는 변할 수 있음
(어떤 언어는 주소 고정 , 값 변동 / 어떤 언어는 주소 와 값 둘다 변동 가능)
(python은 주소 변할 수 있음, C는 그리 잘 안변함)
바인딩(binding)
- 기본적인 추상화 메커니즘 : 이름(name) 또는 식별자(identifier) 사용
- 이름에 어떤 속성을 연결하는 과정
- 프로그램의 기본 단위에 이 단위가 택할 수 있는 여러 속성 중에서 일부를 선정하여 결정하는 행위
추상화 하는 이유 : 주소에 대해서 변수를 던져주면 컴파일러가 알아서 처리
여러 속성 중 일부를 선정하여 바인딩 하는 이유 : 맨 처음에는 이름이랑 속성의 일부가 매칭, 값이 확정되면 그때 속성 나머지와 연결
바인딩 시간의 종류
언어 정의 시간 / 언어 구현 시간(컴파일) / 번역시간(컴파일 타임) / 실행시간(런타임)
<fast ------------------------------------------------------------------------------------------------slow>
컴파일러 : 컴파일타임 때 바인딩
인터프리터 : 런타임 때 바인딩
정적바인딩(static)
- 번역시간(컴파일 타임)에 속성이 확정될 수 있는 성질
- 전체 프로그램이 실행되는 동안 유지
- 전체 프로그램의 실행 동안 그 값이 존재하고 유지되는 객체들의 속성
동적바인딩(dynamic)
- 실행시간(런타임)에야 속성이 확정될 수 있는 성질
- 프로그램의 전체 또는 일부의 실행 동안에만 그 값을 설정할 수 있는 자료의 속성
언어 정의 시간
- 언어를 정의할 때 확정되는 바인딩
- 언어구문 정의(반복문, 허용되는 자료구조, 연산 종류 등) , 혼합형 연산(덧셈 곱셈)에서 두 피연산자의 형 결정
언어 구현 시간
- 언어 정의시 일부 특성을 한정하지 않고, 언어를 컴퓨터에서 구현할 때 일부를 확정
- 정수의 자릿 수, 실수의 유효숫자 개수, 수의 표기법
번역시간
- 언어를 번역하는 시점에서 발생되는 바인딩 -> 정적바인딩
- 컴파일 시간, 링크 시간, 로드 시간
실행시간
- 프로그램 실행 시간에 발생되는 바인딩 => 동적 바인딩
- 변수 값 배정, 변수에 기억장소 할당
1) 모듈 프로그램 실행시작 시간에 발생하는 바인딩 (지역변수에 대한 기억 장소 할당, 형식매개변수와 실 매개변수 바인딩)
2) 프로그램 실행 시 사용 시점에서 수시로 발생하는 바인딩 (배정문으로 값을 변수에 저장하는 바인딩)
바인딩 시간의 중요성 -> 바인딩 시간의 차이에 따라 언어들간의 중요하고 미묘한 차이점 발생
빠른 바인딩은 효율성이 증가하고 늦은 바인딩은 유연성이 증가한다.
번역시간(컴파일시간, Linkage edit 시간 , 적재 시간)
실행시간(호출시간, 실행시간 사용 시점)
선언문(Declarations) : 실행 시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장
하나 이상의 식별자를 프로그램에 도입시켜 이 식별자들이 어떻게 해석되느냐를 명세하는 명시적인 언어 구성자
default : 묵시적 선언 (선언은 하지 않지만 변수 타입은 결정 되어 있음)
자료의 속성 : 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조 첨자 등
선언문의 목적
1) 주기억장치 사용과 접근 방법의 효율성
2) 주기억장치 경영의 효율성
3) 정적형 검사 가능 (형 고정 연산 => 하드웨어 제공 , 혼합형 연산 => 프로그래밍 언어 제공 )
(혼합형 검사를 정적으로 하면 효율성 추구, 동적으로 검사하면 유연성 추구)
정적형 검사(static type checking)
- 모든 변수의 형 선언 요구
장점 : 실행시간 효율이 높음
단점 : 자료 생성, 소멸, 내용변경에 제약 존재
Java, C, Fortran, Algol, Pascal등 컴파일러 언어
동적형 검사(dynamic type checking)
- 선언문 사용 안함
장점 : 프로그래밍 단순화, 유연성 증가
단점 : 프로그램 실행시간 지연, 자료 표현 효율 저하, 복잡한 기억장소 경영 기법 요구
Lisp, APL, Snobol 4 등 인터프리터 언어
Algol, Java, Ada => 약간의 효율성을 상실하여 실질적인 큰 유연성을 얻는 선언문 채택
배정문(Assignment statement) => 변수 내용을 변경시키는 기본 연산
수식으로 기술된 새로운 자료값으로 변수의 현재 자료값을 바꾸는 단순문
l-value : 값이 저장되는 위치(주소, 참조)
r-value : 저장되는 값
Algol => ref로 l-value
Bliss => r-value는 변수 앞에 . 사용
단일 목적지 배정문(단순 배정문)
다중 목적지 배정문 => 값을 하나 이상의 목적지 변수에 배정 (sum=total =0)
조건 목적지 배정문 => 배정문에 조건 목적지 허용 (flag ? cnt1 = 0 : cnt2)
복합 배정 연산자(compound assignment operator)
=> 배정문에 필요한 형태를 축약하여 표현하는 방법
sum += value;
단항 배정 연산자
++ , --
전위 연산자 (prefix operator) : sum = ++count; (선 증가 후 배정)
후위 연산자 (postfix operator) : sum = count++; (선 배정 후 증가)
혼합형 배정문 : 배정문의 양편 자료형이 서로 다름 / 우변 식이 평가된 후 발생 가능
Fortran , C, C++ : 묵시적 형 변환 규칙 가능
Pascal : 묵시적 형변환 일부 지원
Ada, modula-2 : 불허
Java : 확장형 변환에만 가능
상수(Constant) => 프로그램이 실행되는 동안 값이 변하지 않는 식별자
Pascal, Ada, Java등에서 사용
literal과 구별
묵시적 선언 또는 선언문
식별자, 자료 속성들의 집합, 하나 이상의 주소, 오직 한개의 유일값
실질적으로는 참조 없이 값 만 보유
상수 허용 시 고려사항
1) 단순 변수인지 구조 변수인지(record, array)
2) 상수 값 표현은 수식이 가능한지
3) 상수 값 배정시간이 동적인지 정적인지
4) predefined constant가 제공되는지
표현식/수식
-> 하나 이상의 피연산자에서 발생되는 결과, 자료값의 계산을 정의하는 언어 구성자
-> 참조 투명성(referential transparency) : 식 평가는 환경변화 없이 값만을 생성한다.
-> 부작용 제거가 관건
연산자 우선순위/좌결합/우결합 고려
연산자 우선순위 : 식 내에 연산자들의 적용 순서를 정의하는 순서화 규칙
-> 묵시적 순서 : 언어에 따라 차이
-> 명시적 순서 : 괄호
-> 결합법칙 : left-to-right가 보편적
-> BNF로 언어의 연산순위
-> 추상 구문 트리로 식의 연산 순위
조건문 : 일치하는 하나 이상의 조건으로 이루어진 조건식의 값에 따라 내포된 문장의 실행 순서 0개 또는 1개를 실행하도록 선택하는 복합문
case문 고려사항
1) 선택자 수식으로 허용된 자료형은?
2) case 레이블에 허용되는 자료형은?
3) case문 내부 외부에서 case 레이블로 분기가 가능한지?
4) 레이블간 상호 배제를 요구하는가?
5) 수식으로부터 발생되는 모든 경우들을 처리하는가?
반복문 : 내포된 문장의 반복실행을 제어하기 위한 기법을 포함한 복합문
하나 이상의 문장을 0번 이상 실행
사용자 지정 반복 : loop-repeat, goto, exit, break, continue
논리 제어 반복 : while, repeat-until , do-while(repeat-until in C)
제어 변수 반복 : for, do
for문 고려사항
1) 반복 변수가 가질 수 있는 자료형?
2) 초기값, 최종값, 증분값에 수식 허용여부? 수식 결과의 자료형?
3) 반복시 최종값과 증분값은 얼마나 자주 평가 되는지
4) 반복변수와 최종값은 언제 비교?
5) 반복문 내에서 배정문으로 반복 변수가 변경 가능한지
6) 반복문 종료 후 반복 변수가 갖는 값?
7) 반복문 내외로 제어 이동 허용?
8) 반복 변수의 영역은?
GOTO문
-레이블(프로그램 내의 위치를 나타내는 식별자) 제어 모든 문장 지칭
-기계어 특성 그대로 표현 -> 효율적 실행 보장
- 사용 편리
- 제어 구조를 하드웨어가 제공, 제어구조의 완벽한 범용성
단점 : 프로그램 질 저하 유도, 판독성 저하, 프로그램 유지보수 난해
자료형(data type)
- 명시된 자료 구조를 갖는 자료 객체들의 정의된 집합 & 어떤 연산의 수행 중 그 자료객체가 피 연산자로 쓰이도록 허용된 연산들의 집합
- 객체 집합 + 연산
자료형 기법(typing mechanism / system) : 자료형을 정의하고, 변수를 특정 자료형으로 선언하는 것
변수, 자료형 선언 : 정적 자료형 검사, 명세부를 구현부와 분리(추상 자료형) , 프로그램 신뢰성/판독성 증가
자료형 쟁점 사항
1) 자료형 정보의 바인딩 시점(번역? 실행?)
2) 강 자료형 -> 신뢰성, 유지보수성, 판독성 증가
3) 자료형의 적법성과 동치 관계
4) 자료형의 매개변수와 매개변수 평가 시점
자료형의 구성원(객체,요소,값)
- 자료형의 영역(domain) 구성
- 리터럴(literal)
- 스칼라형(단순형) : 수치형, 문자형, 열거형 등
- 구조형 : 배열, 레코드
강자료형 (strong typing) : 자료형은 정적바인딩
-> 언어 구성자에서 쓰인 피연산자들이 해당 연산에 적법한 자료형이기를 요구
-> 연산 수행되기전 명시적인 형변환 요구
스칼라형 (scalar type)
-> 각각의 인스턴스가 스칼라인 자료형
단순형 - 수치형
=> 기본 자료형(실수, 정수)
=> 기계 의존적 (빠른 연산속도, 호환성 문제 발생)
다형성(polymorphism) : 다양한 객체들이 동일한 메시지에 다르게 응답하는 능력
혼합형 연산 해결 : 1) 표로 제공 2)연산 결과의 자료형을 미리 결정하여 해당 연산 수행
단순형 - 논리형
=> 값 영역이 두개의 객체(참 과 거짓)로 구성
단순형 - 문자형
PL/I에서의 문자열 연산
(|, INDEX , LENGTH, SUBSTR, TRANSLATE, VERIFY)
infix prefix
열거형(enumerated Data Types)
- pred(x) 이전값
- succ(x) 다음값
- ord(x) 정의된 위치
단점 : 다중정의(Multiple definition) => 동일한 상수를 두 열거형의 리터럴 값으로 사용 => 형 대조 시 문제
부분 영역형(서브 레인지)
-> 이미 정의된 자료형에서 일부 구간 정의 사용
-> 범위 : 하한~상한
-> 원래형의 연산을 부분 영역형에서 사용 가능
배열
- 구조 자료형
- [집합체, 복합형]
- 여러 자료를 묶어 하나의 단위로 처리하는 자료형
- 이름, 차원, 원소형, 첨자(인덱스) 집합의 형과 범위로 구성
인덱스 => 일반적으로 연속적인 정수형 집합
각 차원의 크기 : ub - lb + 1
첨자범위 하한값
C,Java : 0
Fortran : 1
상한/하한값 표현
Fortran : 상수
Algol : 정수 수식
Pascal : 상수(크기가 다른 형이면 다른 자료형)
첨자범위 바인딩 | 기억장소 할당 | 장점 | |
정적배열 | 정적 | 정적 | 효율성 |
고정 스택-동적 배열 | 정적 | 동적 | 기억장소 공간의 효율성 |
스택 - 동적 배열 | 동적 | 동적 | 고정 후 변경 불가, 유연성 |
힙 - 동적 배열 | 동적 | 동적 | 변경 가능, 유연성 |
배열 - homogeneous data
구조체(레코드) - heterogeneous data
집합체(aggregate)
- 구조화된 구성 요소들의 모임
- 그 구성 요소들은 동일하거나 상이한 다른 자료구조들을 가질 수 있음
배열형 - 각 요소 또는 적정 그룹의 요소들이 다른 요소들과 독립적으로 임의로 참조될 수 있는, 배열형의 인스턴스인 집합체
배열 명세표 => 속성, 배열의 정보 저장 테이블(배열 이름, 원소형, 길이, 시작 주소, 차원수, 각 차원 상/하한값)
행우선 : 대부분
열우선 : Fortran
1차원 : loc(A(i)) = base + (i-lb1) * s
2차원 : loc(B(i,j)) = base + ( i - lb1) * (ub2 - lb2 + 1) *s + (j - lb2) * s
슬라이스 : 배열에서 임의의 한 차원에서의 연속적인 원소들로 구성되어지는 부분
Ada에서 기본연산
배열 자료형 고려사항
1) 배열 이름과 배열 원소 구문
2) 원소값은 어떤 자료형?
3) 첨자로는 어떤 자료형?
4) 배열 크기의 바인딩 시간?
5) 배열 이름에 대한 주소 결정이 얼마나 복잡?
6) 어떤 형태의 slicing 제공?
7) 배열을 초기화하려면 어떤 종류의 문장?
8) 배열에 대한 내장된 연산은 어떤 종류 허용?
연상/연관 배열(associative array)
=> 키 값들에 의해서 접근되는 순서를 갖지 않은 데이터 집합체
=> 사용자-정의 키들이 배열에 함께 저장
(설계 시 고려사항)
- 원소의 참조형 식과 연상 배열의 크기 바인딩 시간
레코드(구조체)
- 이질형 요소들의 모임인 자료형
* with문 (Pascal) => 변수명을 생략하는 필드 지정 구문
가변부(variant part)
=> 판별자를 이용한 필드들의 택일 변환 기술
=> 자료 객체들로 구성된 레코드의 한 부분, 해당 자료구조나 선언된 자료형이 변할 수 있는 부분
판별자
=> 주어진 가변 레코드에서 사용되는 자료구조를 가리키는 매개변수와 유사한 언어 구성자
포인터
- 객체에 대한 참조
- 자신의 자료값이 다른 자료 객체의 주소가 되는 객체
포인터 변수
- 객체를 참조하기 위한 주소를 값으로 취하는 식별자
=> 필요성 : 실행시간까지 크기를 알수 없는 자료 / 동적 할당 / 다중 관계
=> 문제점 : 다수의 포인터가 동일 객체를 지시할때 이명문제 / 포인트 되지 않은 객체 존재 가능 / 현수 참조
* : 역참조 연산자
& : 주소 연산자
C++
참조형 : 포인터형 (메모리의 위치 공유)
묵시적으로 항상 역참조 되는 상수 포인터
참조형 변수는 상수이다!!
묵시적 역참조 자동
참조 변수에 배정 허용 x
Java는 안전성을 위해서 포인터가 없음
C++ 포인터 : 메모리 주소 참조
Java 참조변수 : 클래스 인스턴스 참조
자료형 변환
- 한 자료형의 자료값 표현을 다른 자료형의 자료값 표현으로 변환하는 것
1) 묵시적 형변환 =>강제로 요구되어 시스템에 의해 자동변환
축소 변환 : 축소되는 크기로 반환 (정수 => 문자 , 실수 => 정수)
확대 변환 : 확대되는 크기로 변환 (문자형 => 정수 , 정수 => 실수)
C,C++ , Java : 확대변환은 자동형변환, 축소변환은 cast 명령
스칼라형은 형변환이 용이하나 구조형이나 사용자 정의형은 거의 불가능 하다
정수에서 실수로 확대배정이 되는 경우는 정수형의 범위가 실수형의 가수 범위보다 클때 이다.
자료형 동치
이름 동치 : 함께 선언, 동일 식별자 이름 선언시 동일형
구조 동치 : 구성요소가 모든 측면에서 같으면 동일형
선언 동치 : 이름 동치와 구조 동치의 중간, 자료형의 이름을 재선언해도 동일형
자료형 적법성(type compatibility)
=> 객체의 형이 특정 문맥에서 정당한지를 결정하는 의미 규칙들
부 자료형
=> 다른 자료형에 대한 하나 이상의 제약조건에 의해 그 자료형으로부터 파생된 자료형
subtype aint is INTEGER range 1..100
파생 자료형
=> 자료값과 연산들이 기존의 원 자료형에서 복사된 자료형
type bint is new INTEGER range 100
'CS(Computer Science) > 프로그래밍언어' 카테고리의 다른 글
14. 객체지향 프로그래밍 (0) | 2023.06.07 |
---|---|
12. 예외 처리 (0) | 2023.06.04 |
11. 추상 자료형 (0) | 2023.06.04 |
10장 부 프로그램 (0) | 2023.06.04 |
9장 요약 (0) | 2023.06.04 |