{함수형{프로그래밍이란?☞ 함수의 정의⇒ 함수가 수행할 일을 기술한 C코드를 함수 정의라고 한다. 또한 특정 작업을 수행하도록 설계된 독립적인 프로그램을 말한다 C언어에서의 함수는 다른 프로그래밍 언어에서 사용되는 프로시져(Procedure), 서브루틴(Subroutine)과, 유사한 개념이다.※ 단 함수 정의와 함수 선언을 혼동하지 말아야 한다◎ 함수의 형식typefunction_name( parameter list ){declarationsstatements}⇒ 첫 번째 여는 중괄호의 앞부분을 함수 정의의 헤더라고 하고, 그 중괄호 사이에 있는 것을 함수 정의의 몸체라고 한다. 매개 변수 목록은 선언들의 목록으로 콤마로 분리된다.위의 형식에서 type는 함수를 실행한 후 반환되는 자료형을 의미한다. 이 type은 생략 가능한데 생략될 경우 컴파일러는 이것을 int로 처리한다. 그러므로 반환되는 자료형이 int가 아닌 다른 경우 예를 들면 char, long, float, double 등의 경우에는 생략될 수 없다. function_name는 printf, scanf와 같은 함수명으로 프로그래머가 직접 명명한다. 함수명을 작성하는 방법은 변수명을 작성하는 방법과 동일하다.parameter_list는 argument_list 또는 매개변수 리스트라고도 하며, 이것은 함수를 수행하는데 반드시 필요한 정보들을 함수에 전달하기 위한 입구에 해당하는 것으로 그 형식은 변수의 선언과 동일하다.이러한 type, parameter_list, argument_list가 정해지고 나면 함수의 본체를 작성하게 된다.☞ 함수의 종류⇒ C 언어에는 크게 3종류의 함수들이 있는데 주함수, 라이브러리 함수, 그리고 사용자 정의함수이다.1) 주함수(main function)⇒ 이 함수는 C 소스에 반드시 있어야 하는 함수이며 그 이름은 반드시 영문 소문자 main이어야 한다. 이 함수는 사용자가 프로그램을 모두 작성한 후, 프로그램을 실행할 경우에 프로그램의 시작과 끝을 나타내는 역할을로그램 내에서 특정 부분을 여러번 반복하여 사용할 경우 함수를 이용하여 필요할 때마나 이를 호출하여 사용하면 매우 편리하고, 프로그램의 작성도 용이해진다.2) 프로그램이 모듈화 됨으로써 프로그램의 이해와 오류의 수정이 쉬워지게 되어 유지 보수에 소요되는 비용을 줄일 수 있다.3) 함수들을 기능에 따라 일반적으로 작성함으로써 다른 프로그램 작성시 이를 재활용할 수 있다.☞ 함수의 원형⇒ 함수는 사용되기 전에 선언되어야 한다. ANSI C는 새로운 함수 선언 구문인 함수 원형을 제공한다. 함수 원형은 컴파일러에게 함수로 전달되는 인자의 수와 형 그리고 함수에 의해 return되는 값의 형을 알려준다.double sqrt(double);이것은 컴파일러에게 sqrt()는 double 형의 인자를 하나 가지고 double을 return하는 함수라는 것을 알려준다.☞ 함수 원형의 일반적인 형식type function_name(parameter type list);⇒ 전형적으로 매개변수 형 목록은 콤마로 분리되는 형의 목록이다. 식별자는 옵션이다. 식별자는 함수 원형에 아무런 영향도 주지 않는다.void f(char c, int I);void f(char, int);컴파일러는 함수 원형의 매개변수 목록에 나오는 c와 i 같은 식별자를 사용하지 않는다.함수가 인자를 가지지 않을 때 키워드 void를 사용한다. 또한 이 void는 함수가 return하는 값이 없을 때에도 사용된다.컴파일러는 함수 원형을 사용하여 코드를 더 철저히 검사할 수 있다. 또한 필요하다면, 함수로 전달되는 값을 적절한 형으로 변환시킬 수도 있다. 예를 들어 sqrt()의 함수 원형이 앞에서 본 것처럼 기술되어 있다면, sqrt(4)로 이 함수를 호출해도 정확한 값을 return 할 수 있다. 왜냐하면, 컴파일러는 이 함수가 double형 인자를 갖는다는 것을 알고 있기 때문에, 컴파일러는 int 값 4를 double로 승격시킬 것이고 따라서 정확한 값이 return될 것이다.◎ C++에서 함수 원형⇒ 해, 함수 정의에 의해, 명확한 함수 선언과 함수 원형에 의해)만일 컴파일러가 f(x)와 같은 함수 호출을 그 함수의 선언이나 정의 또는 함수 원형 전에 만나면, 컴파일러는 디폴트로 다음과 같은 형태의 선언을 가정한다int f();함수의 매개변수 목록에 대한 가정은 하지 않는다.※ 한계 : 함수 정의와 원형은 특정한 한계가 있다. 함수의 기억영역 클래스 명시자는, 이것이 사용된다면, extern이나 static 중 하나일 수 있지만, 동시에 둘 다일 수는 없다. 그러나 배열이나 함수의 포인터는 return할 수 있다. 매개변수 목록에 올 수 있는 기억영역 클래스 명시자는 register 뿐이다. 매개변수는 초기화될 수 없다.☞ 함수 정의 순서의 다른 방법⇒ 하나의 파일에 프로그램을 작성한다고 생각하고, 그 프로그램이 하나 이상의 함수 정의를 가진다면, 파일의 제일 상단에 #include와 #define을 쓰고, 그 다음 열거형을 쓴다.그리고, 함수 원형들을 쓰고, 마지막으로 main() 함수부터 시작하여 함수들의 정의를 쓴다. 또 다른 방법으로는, 함수 정의가 함수 원형의 역할도 하기 때문에, 함수 원형들을 제거하고 함수가 호출되기 전 부분에 함수 정의를 써도 된다. 이런 경우, main() 함수는 파일의 맨 뒤에 위치하게 된다.☞ 함수 호출과 값에 의한 호출⇒ 프로그램은 하나 이상의 함수들로 구성되는데, 그 중 하나는 main() 함수이다. 프로그램은 항상 main() 함수부터 수행한다. 프로그램의 제어가 함수 이름을 만나면, 그 함수가 호출된다. 그것은 프로그램의 제어가 그 함수로 넘어감을 의미한다. 호출된 함수가 시행을 완료하면, 프로그램의 제어는 함수를 호출한 환경으로 다시 넘어가며, 제어를 다시 받은 함수는 자기 일을 계속 수행한다.함수를 호출하고 싶다면, 그 함수의 이름과 괄호로 둘러싸인 인자 목록을 쓰면 된다, 전형적으로 이러한 인자들은 함수 정의에서 매개변수 목록의 매개변수 개수와 형(또는 호환형)이 일치한다. 함수 원형이 사용된 경우, 컴파일러의 값이 형식 매개 변수의 형으로 변환되고, 함수 몸체의 시작 부분에서 그 겁이 대응되는 형식 매개변수에 할당된다.3. 함수의 몸체가 실행된다.4. return 문을 만나면, 제어는 호출한 환경으로 넘어간다.5. return 문이 수식을 가지고 있다면, 필요한 경우 그 수식의 값이 함수의 형으로 변환된 다음 그 값도 호출한 환경으로 넘어간다.6. return 문이 수식을 가지지 않는다면, 어떠한 유용한 값도 호출한 환경으로 return되지 않는다 .7. return 문이 없다면, 제어가 함수 몸체의 끝에 도달할 경우 호출한 환경으로 넘어간다. 이때 아무런 값도 return되지 않는다.8. 모든 인자는 값에 의한 호출 로 넘어간다.☞ 매개 변수⇒ 함수가 인수를 전달받을 때 프로그래밍 언어에서 사용하는 방법은 값에 의한 호출 (Call by Value)과 참조에 의한 호출(Call by Reference) 두 가지가 있다.1) 값에 의한 호출(Call by value)⇒ C에서 함수의 매개변수는 Call by value로 전달된다. 즉, 매개변수 자체가 전달 되는 것이 아니라, 매개변수가 가지는 값이 메모리의 임시저장 장소(또는 임시변수)에 기억됨으로서 전달된다. 따라서, 부름을 받은 함수(called function) 내에서 매개변수의 값을 변경하더라도 부르는 함수(calling function)의 값에 영향을 주지 않는다.2) 참조에 의한 호출(Call by reference)⇒ 반면, Call by reference방식에서는 매개변수 자체가 부름을 받는 함수 (called function)에 전달되므로 만약 부름을 받는 함수에서 매개변수의 값을 변경시키면 부르는 함수내에서도 그 값은 변하게 된다. C 언어에서 이 방식은 지원이 되지 않지만 포인터(Pointer)를 사용하여 이러한 효과를 낼 수 있다.※ C언어는 두 가지 인수 전달 방법 중 값에 의한 호출을 사용한다.C언어에서 실인수와 형식 인수 사이의 정보 전달은 스택(stack)이라는 자료 구조를 통하여 다. 즉, 식별자가 선언된 블록 밖의 영역에서는 그 식별자를 이용할 수 없다. 프로그래머가 여러 가지 이유로 인해 다른 선언에서 같은 식별자를 사용하는 것만을 제외하면, 이 규칙을 이해하는 것은 쉽다. 만일 같은 식별자를 다른 곳에서도 선언했다면, 실제로 참조되는 식별자는 어떤 것인가라는 문제가 생길 수 있다.1) 병렬 블록과 중첩 블록⇒ 두 개의 블록이 차례대로 올 수 있다. 이런 경우 두 번째 블록은 첫 번째 블록에서 선언한 변수를 알지 못한다. 같은 레벨에 있는 이러한 블록들을 병렬 블록이라 한다. 함수들은 가장 바깥 레벨에서 병렬로 선언된다.2) 디버깅을 위한 블록 구조의 사용⇒ 블록은 디버깅을 위한 목적으로도 많이 사용된다. 예를 들어 v라는 변수가 이상한 값을 갖는 코드 부분이 있다고 가정하자. 이 코드 부분에 임시로 블록을 삽입하면, 프로그램의 다른 부분에 영향을 주지 않는 지역 변수를 사용할 수 있다.☞ 기억영역 클래스⇒ C의 모든 변수와 함수는 두 가지(형과 기억영역 클래스) 속성을 가진다.※ 기억 영역 클래스 : auto, extern, register, static1) 기억 영역 클래스 auto⇒ 함수의 몸체에서 선언된 변수는 디폴트로 자동이다. 그러므로, 자동은 네 가지 기억영역 클래스 중 가장 일반적인 것이다. 복합문이 변수 선언으로 시작한다면, 그 변수들의 유효범위는 그 블록안이 된다. 변수 선언이 있는 복합문을 블록이라고 한다.블록 안에서 선언된 변수는 묵시적으로 자동 기억영역 클래스이다. 키워드 auto를 사용하여 기억영역 클래스를 명시 할 수도 있다.2) 기억영역 클래스 extern⇒ 블록들과 함수들 간에 정보를 전달하는 한가지 방법은 외부 변수를 사용하는 것이다. 변수가 함수 밖에서 선언되어 있다면, 이변수의 기억영역 클래스는 extern이 되고, 프로그램이 종료될 때까지 메모리에 계속 남아 있게 된다. 외부 변수의 선언은 함수나 블록 내부에서 변수의 선언과 외견상으로는 같다. 이러한 변수는 이 이후에 정의된 모든 함수에게 전역들이다.
{시각{프로그래밍이란?◎ 시각 프로그래밍이란⇒ "프로그래밍 과정에서 의미 있는 그래픽을 사용하는 것", 혹은 "프로그램을 2차원 이상으로 기술하는 것"을 의미한다. 시각 프로그래밍은 구체성, 언어의 장벽이 없음, 생산성 향상, 오류 감소, 배우기 쉬움 등의 장점을 지니고 있기 때문에 여러 방면에서 시각 프로그래밍에 관한 연구를 수행하고 있다. 상업적인 면에서도 "visual"이라는 단어를 붙인 많은 프로그래밍 환경(Visual Basic, Visual C++, VisualWorks 등)이 발표되고 있는 것도 이러한 이유 때문이다. 그러나, 이러한 프로그래밍 환경을 모두 시각 프로그래밍이라고는 할 수 없다. 시각 프로그래밍은 Prograph, LabView등과 같이 좀 더 높은 수준의 시각 표현력을 지원할 수 있어야 한다.멀티패러다임 시각 프로그래밍 시스템은 다양한 형태의 시각 프로그래밍 패러다임을 결합함으로서 멀티패러다임의 장점을 활용할 수 있고, 시각 프로그래밍의 단점을 보완할 수 있다◎ 시각 프로그래밍의 문제점⇒ 시각 프로그래밍은 많은 장점을 가지고 있지만 아직 상업적으로 성공한 제품이 나오지 않고 있는 이유는 비효율적인 표현, 제한된 도메인, 제한된 자료 타입과 연산자, 알고리즘 표현의 어려움 등의 문제점 때문이다. 이러한 문제점들 때문에 시각 프로그래밍은 제한된 분야에서만 사용되어왔다. 대부분의 시각 프로그래밍은 하나의 프로그래밍 패러다임이나 계산 모델에 바탕을 두고 있으며, 매우 구체적이라는 특성을 가지고 있기 때문에 사용된 패러다임에 적합한 문제는 수월하게 해결할 수 있지만, 그렇지 않은 경우에는 문제를 해결하기 어렵다는 단점을 가지고 있다. 반면에 실세계의 큰 시스템은 모든 프로그래밍 특성들을 가지고 있기 때문에 한 패러다임만을 지원하는 시각 프로그래밍 언어나 도구를 이용해서 문제를 해결하기에는 많은 어려움이 있다.◎ C++를 사용해 작성한 객체지향 프로그램과 Prolog를 사용한 로직 프로그램⇒ MS사의 Excel을 사용한 프로그램은 프로그램의 sual ToolSet⇒ Visual ToolSet은 범용 프로그래밍 언어로 사용되지 못하는 시각 프로그래밍 언어의 한계를 극복하기 위해 멀티패러다임을 도입한 시각 프로그래밍 언어이다. Visual ToolSet은 서로 다른 패러다임을 지원하는 간단한 서브 시각프로그래밍 언어들의 집합으로 구성되어 있다. 각 서브 시각 언어들은 자기 자신의 언어로 프로그램을 작성할 수 있는 도구를 가지고 있다. Visual ToolSet은 5개의 반 독립적인 도구들로 구성되어 있으며 도구들은 서로 통신할 수 있고, 한 도구에서 정의된 함수, 프로시듀어, 데이터는 다른 도구에서 사용될 수 있다. Visual ToolSet은 다음과 같은 도구들을 가지고 있다.(1) 자료정의 도구(DDT) : 새로운 자료 타입과 변수를 정의한다.(2) 함수정의 도구(FDT) : 기존의 함수들을 이용해서 데이터플로우 패러다임 방법으로 새로운 함수를 정의한다.(3) DBMS 도구 : 자료를 테이블 형태로 관리, 저장, 질의어 처리 등의 작업을 수행하는 함수를 정의한다. 이 도구는 Query-by-Example 모델에 기초를 두었고, 계산적인 기능은 부족하지만 주어진 관계에 따라 데이터 튜플의 갱신 및 질의어 처리에 편리하다.(4) 제어흐름 도구(CFT) : 이 도구에서는 제어의 흐름이 프로시듀어를 수행하는 플로우차트 그림으로 표현된다. 이 도구는 자료나 화면의 출력은 기술하지 못하고, 미리 정의되어 있는 프로시듀어를 이용해 고수준의 제어를 수행한다.(5) Programming-By-Example 도구 : 함수를 자료에 적용하거나 사이드 이펙트를 시각화하는 작업, 프로시듀어를 정의하고 실행하는 기능, 다른 도구에서 정의한 프로시듀어를 통합하는 기능을 제공한다.Visual ToolSet의 서브 시각 프로그래밍 언어들은 각각 사용할 수 있는 연산자, 가능한 프로그래밍 구조, 계산 기능을 가지고 있다. Visual ToolSet은 시각 프로그래밍의 문제점을 해결하기 위해 멀티 패러다임을 도입했다는데 큰 의의를 패러다임에 맞는 데이터/연산자 표기법 및 문법적 사항을 이용할 때 가장 잘 프로그래밍에 이용될 수 있다. 따라서 멀티패러다임 시스템은 각 패러다임에 맞는 데이터/연산자 표기법들을 사용할 수 있도록 지원해야 한다.멀티패러다임 시스템에서는 다양한 표기법 및 문법적 사항은 수용하지만, 각 패러다임간에 불필요한 상호 작용은 배제해야한다.각 패러다임으로 작성된 프로그램은 모듈 단위이어야 한다. 패러다임간 결합은 프로세스 단위, 모듈단위, 문장/연산 단위로 이루어 질 수 있다. 모듈 단위의 패러다임간 결합은 모듈 단위의 편집, 컴파일, 링킹을 가능하게 한다. 문장과 연산 수준에서 패러다임간의 결합은 강력한 프로그래밍 도구를 제공할지 모르지만 패러다임간에 사용되는 표기법 및 문법이 다름으로 해서 많은 혼란을 야기할 수 있다. 따라서, 멀티패러다임 시각 프로그래밍에서는 모듈 단위의 결합이 가장 적절하다. 하나의 모듈을 하나의 패러다임으로 표현함으로서 패러다임간의 독립성과 협력성이 조화롭게 이루어질 수 있다.그밖에 객체지향 패러다임은 재사용성과 확장성 등에서 많은 장점을 가지고 있기 때문에 멀티패러다임 시각 프로그래밍 시스템이 객체지향 패러다임을 지원하면 바람직하겠다.패러다임을 구조적으로 결합하기 위한 연구에서 패러다임을 객체 클래스로 인식하고 상속을 통해서 패러다임을 결합하는 연구가 Diomidis[12,13]에 의해 이루어졌다. 그러나 이러한 관점보다 패러다임을 클래스의 메소드로 보는 관점이 더 타당하다. 객체지향 프로그래밍의 가장 중심이 되는 클래스는 어트리뷰트와 메소드의 집합으로 되어 있다. 이 클래스의 메소드들이 각각 하나의 패러다임으로 표현된다면 전체적으로는 객체지향을 지원하고, 클래스내부에서는 멀티패러다임을 지원하게 된다.MVPE는 4개의 프로그래밍 패러다임을 지원하며, 각 패러다임마다 프로그래밍 도구를 두어서 패러다임 고유의 제어 구조나 연산자를 사용할 수 있다. 따라서 MVPE는 멀티패러다임 언어의 요구 사항을 충족시키면서, 새로운 패러다임 도구를 쉽게 추가에서는 패러다임간의 자료 교환 방법으로 함수 호출 결과와 클래스의 어트리뷰트의 전역변수처럼 사용하는 방법을 사용한다. 교환되는 자료형으로는 MVPE의 기반 언어인 C++에서 지원하는 자료형으로 제한함으로서 시스템 구현을 쉽게 하였다.3) 패러다임간의 제어 이동 과 자원관리⇒ 패러다임간의 자료 교환과 함께 제어 이동은 패러다임들 간의 협력을 위해 반드시 필요한 부분이다. MVPE에서 패러다임간의 제어 이동은 메소드 호출 방법을 이용하도록 하였다.패러다임간에 자원을 관리하는 방법이 다르기 때문에 자원의 사용과 관리는 중요한 고려사항 중의 하나이다. 가장 대표적인 자원으로는 변수, 변수의 네임 스페이스, 메모리 등을 들 수 있다. 예를 들어, 어떤 프로그래밍 패러다임은 변수를 사용하지만, 다른 패러다임에서는 변수를 사용하지 않을 수 있다. 일반적인 데이터플로우 패러다임과 스프레드쉬트 패러다임은 변수를 사용하지 않지만, MVPE의 데이터플로우 패러다임과 스프레드쉬트 패러다임에서는 변수를 사용하도록 했다.4) 실행 모델의 차이⇒ 마지막으로 고려할 대상은 실행 모델이다. 어떤 프로그래밍 패러다임은 컴파일을 통해 실행되는데 반해 다른 패러다임은 인터프리트 방식으로 실행된다. 따라서 멀티패러다임 시스템은 어떤 실행 모델을 지원할 것인가를 고려해야 한다. 스프레드쉬트 패러다임은 원래 인터프리트 방식으로 실행 되는데 MVPE 시스템에서 사용되는 스프레드쉬트 패러다임은 인터프리트되지 않고 컴파일 방식을 지원한다.◎ MVPE 시스템 구성⇒ MVPE는 그림 2와 같은 구조로 되어있으며 4개의 프로그래밍 도구로 구성되어 있다.(1) 객체지향 프로그래밍 도구(2) 데이터플로우 프로그래밍 도구(3) 스프레드쉬트 프로그래밍 도구(4) 인터페이스 개발 도구⇒ 각 프로그래밍 도구는 하나의 패러다임을 지원하며 사용자의 입력에 따라 시각 문장을 생성한다. 각 도구의 트리 핸들러는 사용자가 기술한 시각 문장을 트리 형태로 관리한다. 각 도구에서 생성된 트리를 이용해 코드 생성기는 사용자의 요구에 따변수와 메소드 내에서만 사용되는 지역 변수를 정의할 수 있다. 이 곳에서 정의된 변수와 클래스 선언 도구에서 정의된 클래스 멤버 필드 변수들은 드래그-앤-드랍해서 작업 영역에 기록될 수 있다. 이 도구에서 제공하는 시각 문장도 마찬가지로 드래그-앤-드랍해서 사용된다. 작업 영역에 드랍된 시각 문장은 이동, 크기 변경, 삭제, 텍스트 입력 등의 연산이 적용될 수 있다.일반적으로 시각 프로그래밍 시스템에서는 주로 문장의 위치 정보와 문장과 문장 사이 관계 정보를 이용하여 파싱한다. MVPE의 메소드 정의 도구에서는 다른 일반 시각 프로그래밍 시스템에서 하는 문법적인 오류 체크나 의미 분석 과정은 생략한다. 이러한 과정은 전적으로 C++컴파일러에 의존적이다. 메소드 정의 도구는 C++코드를 생성하는데 필요한 최소한의 내용만 체크한다. 메소드 도구의 작업 영역 좌측 상단을 X축과 Y축의 원점(0,0)으로 보고, 좌에서 우를 X축, 위에서 아래를 Y축으로 정한다. 메소드 정의 도구는 시각 문장이 시작하는 X축과 Y축 좌표를 보고 좌표 값이 적은 문장이 시간적으로 우선한다고 판단한다. 같은 Y축 상에서는 X값이 작은 문장이 우선하고, 같은 X축 상에서는 Y값이 작은 문장이 우선한다. X축과 Y축에서는 Y축에 우선권이 있다. 따라서 시각 문장 VS1의 시작 위치 (x1, y1)이고, VS2의 시작 위치 (X1, Y1)일 때 x1 < X1 이고 Y1 < y1 이면 시각 문장 VS2가 VS1에 대해 우선권을 갖는다. 어떤 시각 문장은 다른 시각 문장을 포함하는 포함 관계를 가질 수도 있다. 그러나, 어떠한 두 문장도 Y축 상에서 서로 교차하지는 않는다. 시각 문장이 서로 교차하는 경우에 메소드 정의 도구는 자동적으로 시각 문장을 이동시켜 교차가 일어나지 않도록 한다.{메소드 정의 도구와 클래스 선언 도구에서 정의된 변수들은 드래그-앤-드랍해서 작업 영역에서 사용될 수 있다. 일반적으로 선언된 변수가 프리미티브 타입인 경우, 변수가 사용되는 형태가 변경되는 경우는 드물다. 그러밍 도구
{논리형{프로그래밍이란?1) 논리형 프로그래밍 언어란?⇒ 수학적 논리와 논리가 사용되는 프로그래밍 언어를 논리형 언어라 한다. 논리 문장은 주로 프로그램이 언어 구문구조의 의미를 기술하는데 사용되고, 또한 형식 명제어나 수학적 방법으로 프로그램의 정확성을 증명하는데 사용된다. 논리의 원리는 이 밖에 수학적 정리를 증명하는 프로그램 작성에 사용되어 왔다. 따라서 논리 문장은 제한된 형태에 이어서 프로그래밍 언어라 할 수 있다.2) 논리형 프로그래밍 언어의 핵심⇒ 공리인 문장의 집합으로부터 추론규칙에 따라 자동화방법으로 원하는 사실을 유도하는 것. 즉, 논리 프로그램은 공이로 가정된 논리문장의 집합이고 정리는 계산을 위한 입력에 해당한다.논리 프로그래밍은 프로그래머에게 답의 성질을 명세 하게 하고, 언어 시스템 성질로부터 답을 계산하는 방법을 제공하게 하는데 목적을 두고 있다.논리 원리에 관련 1970년 후반에 논리형 프로그래밍 언어로 prolog가 탄생하였다. prolog는 horn절을 사용하였다.※ horn절(발명자인 Alfred Horn의 이름을 따서)은{{ a}_{1 }and {{ a}_{2 }and{{ a}_{3 }..... and{{ a}_{n }→ b- 형태의 문장이고,{{ a}_{ i}는 연결자를 포함하지 않는 간단한 문장만 될 수 있다. 따라서 horn절에는 or 연결자가 없고 정량자도 없다. 여기서 horn절은 {{ a}_{1 }부터 {{ a}_{n }이 b를 암시한다고 하고 이는 모든{{ a}_{ i}가 참일 때 b가 참임을 의미한다. b는 이 절의 머리라고 하고{{ a}_{1 }............{{ a}_{n }은 본체라고 한다. horn절에서{{ a}_{ i}의 수가 0일 수 있고 이러한 경우에 horn절은→ b형태이다. 이러한 절은 b가 항상 참임을 의미하고. 즉 공리이고 보통 연결자 →없이 표시한다. 이러한 절을 때때로 사실이라고 한다.3) Prolog 언어⇒ Prolog는 가장 널리 사용되는 논리형 프로그래밍 시스템이다. Prolog는 horn 절을 사용하며 엄격한 선형 깊이 - 우선(depth-first) 전략과 더 자세히 기술될 단일화를 사용하여 도출을 구현한다. 표준 Prolog는 없지만 1970년대 말과 1980년대 초에 Edinburgh 대학에서 개발된 Prolog가 일종의 산업계 표준이 되고 있으며 여기서도 이를 기반으로 설명한다. 어떤 Prolog 시스템(특히 Turbo Prolog)은 이것과는 상당히 다르다.1 표기법 및 자료 구조- Prolog는 horn 절을 위해 개발된 것과 거의 동일한 표기를 사용하는데 다만 암시를 나타내는 화살표 ← 대신에 :- 를 사용한다. Prolog 구문 구조는 다음과 같다.ancestor (X,Y) :- parent(X,Z), ancestor(Z,Y).ancestor (X,Y).parent (amy,bob).또 예제 4는 다음과 같이 쓸 수 있다.natural (0).natural (successor(X) :- natural(X)변수 X와 Y가 대문자로 쓰여졌다는 점에 주의하기 바란다. Prolog는 변수를 대문자로 쓰고 다른 것을 소문자로 씀으로써 상수, 술어나 함수 이름과 구분한다. 또한 대부분의 Prolog 시스템에서 ancestor(_x, _x)처럼 이름 앞에 밑줄을 그음으로써 변수를 나타낸다.and 를 나타내는 컴머 외에도 Prolog에서는 or 를 위해서 세미콜론 ; 을 사용한다. 그러나 세미콜론은 horn절 논리의 표준적인 부분이 아니므로 프로그래밍에서 거의 사용되지 않는다.기본적인 자료구조는 parent(X, Z) 혹은 successor(successor(0))와 같은 항이다. Prolog는 또한 기본적인 자료구조로 대괄호를 사용하는 리스트를 포함한다. x, y, z 항목들로 이루어진 리스트는 [x, y, z]로 표기한다.또한 세로막대를 이용하여 리스트의 머리와 후미를 표시할 수 있다. [H | T]는 H가 이 리스트의 첫 번째 항목이고 T가 이 리스트에서 첫 번째 항목을 제외한 후미 부분이다. 따라서 [H | T] = [1, 2, 3] 이면 H = 1이고 T = [2, 3]이다. 또한 여러 개 항을 원하는 만큼 세로 막대 앞에 쓸 수 있다. [X, Y | Z ] = [1, 2, 3] 이면 X = 1, Y = 2, Z = [3]이 된다. 빈 리스트는 [ ]로 표시하며 첫 번째 원소가 없다.Prolog는 not, =, 및 I/O연산 read, write, nl 등과 같은 몇 개의 표준 술어를 갖고 있다. Prolog에서 하나의 예외는 작거나 같음 연산자로
{Ada{언어의 이해◎ Ada란?⇒ Ada는 장기적이고(long-lived) 신뢰성 있는 소프트웨어 시스템 구축을 지원하도록 디자인된 프로그래밍 언어이다. Ada는 읽기 쉽고 재사용 가능하며 코딩시의 에러를 최소한 줄 일 수 있게끔 디자인되었고 Ada의 가장 큰 장점은 디버깅 타임을 많이 줄였다는데 있다. 많은 에러들이 compile-time과 run-time에서 조기에 파악되어지고 언어 개발 시에 다른 여타의 프로그래밍 언어보다 철저한 준비, 요구사항 분석, 자체 검증을 하여 완벽성을 지향해온 프로그래밍 언어라고 볼 수 있다.◎ Ada의 역사⇒ Ada는 수학응용, 시스템 프로그램 응용, 실시간 및 병렬처리 응용 등을 위한 프로그래밍 언어로서 Ada Augusta라는 여자 프로그래머의 이름을 따서 부르게 되었다.Ada는 미국 국방성에서 각 군에 필요한 응용에 적절한 프로그래밍언어를 개발하고자 1975년에 DOD에서 HOLWG(고단위 언어 작업조)를 구성하여 국방성 관내 각종 컴퓨터에 적합한 단일 고급 프로그래밍언어를 구성하려고 하였다.첫 단계로서 프로그래밍언어의 요구사항을 개발하는데 1975년에 전반적인 개념을 설명한 Strawman이 나왔고, 같은 해에 이 개념을 여러 개의 특징으로 재 정의한 Woodenman이 나왔고, 1976년에는 약 100개의 특성을 기존언어와 비교하는 Tinman이 나왔으며, 1977년에 최종 요구 사항을 결정한 Ironman이 나오게 되었다다음 단계로는 기존언어 중에서 이들 요구사항을 만족하는 것이 있는지를 검토하는 것과 그 결과로 Tinman을 만족하는 언어가 없다고 단정하고 Pascal, Algol68, PL/1등을 기본으로 하는 언어의 설계 단계에 들게 되었다. 언어설계를 위해서 16개의 제의가 있었으나, 국방성에서는 우선 C∥-Honeywell-bull, Intermetrics, SRI International, Soft Tech등 네 가지 제안을 수락하였는데 이들은 모두 Pascal을 기본으로 하고 있었다.1978년 2월까지 이들 네 회사는 예비적인 설계를 완료하여 심사를 받은 결과 Green과 Red가 최종 설계를 위해 1년 더 연장을 얻게 되었으며, 1979년 5월에 HOLWG는 최종적으로 Green을 선택하게 되었다.Ada는 일반적으로 package의 프로그램 단위별 개념이 강하다고 볼 수 있으며, 프로그램의 안전도 (reliability), 유지보수(maintenance) 그리고 인간의 활동과 효율에 중점을 두고 있다고 할 수 있다.◎ Ada의 특징⇒ Ada95는 이전 Ada83에 비해 매우 많이 발전되었다. 가장 큰 변화는 많은 사람들에게 유용하다는 객체지향이다. Ada가 가진 특징은 다음과 같다.1. 패키지(package) (모듈(module)), 관련 자료형, 객체를 모두 정의할 수 있다2. 패키지와 자료형을 일반적으로(generic) 만들 수 있다3. 자료 표현은 시스템 프로그래밍이 가능하게 한다4. 객체지향 프로그래밍을 지원한다5. 명시적인 예외 처리가 가능하다6. 작업 (task, 여러 병렬 쓰레드)을 만들고 사용할 수 있다. 이 기능은 다른 대다수의 언어들과 달리 Ada95 언어 자체에 있다7. (C, Fortran, COBOL 등) 다른 언어로의 인터페이스를 언어에 포함할 수 있다8. Ada는 문자와 숫자 입출력을 위해 강한 자료형(strong datatype)을 지원한다. 결과적으로 Ada는 복잡한 시스템을 작성하고 유지하는데 매우 적합하다◎ 프로그램 환경⇒ Ada는 기존의 프로그램의 경우는 물론 공장이나 어떤 장비에 연결되어 있는 컴퓨터의 프로그램 작성도 하도록 하고 있다. 물론 이들 장비라 하면, 군사장비를 비롯하여 항공장비 등 산업용 제어장비까지 광범위하게 포함하기 때문에 여기에 소요되는 컴퓨터는 큰 것도 있고 작은 것도 있으며, 단일 컴퓨터일 수도 있고, 어떤 컴퓨터 집합이 될 수도 있고, 어떤 컴퓨터의 망이 될 수도 있다.따라서 Ada는 종전의 컴퓨터와는 몇 가지 다른 프로그래밍 환경을 갖고 있다. 즉 모든 프로그램은 목적 컴퓨터가 아닌 Host 컴퓨터에 의하여 컴파일 되며, 만일 Ada가 어떤 컴퓨터에 실행이 되는 경우에는 컴퓨터에는 Ada 밖에 다름 프로그램이 적재되어서는 안 되도록 하고 있다.Ada 프로그램의 컴파일링은 각 프로그램 단위별로 실시하되 관련되는 모든 모듈들이 함께 포함되고 있으며, 프로그램의 실행은 하나 혹은 그 이상의 목적컴퓨터에 실행하게 되어 마치 한 개의 프로그램이 여러 개의 컴퓨터에서 실행되는 형태를 이룬다.Ada 프로그램은 컴퓨터 내부에서 여러 가지 활동을 지시할 뿐 아니라 컴퓨터들 사이의 상호활동을 연관시켜주는 일을 하는데, 이들 활동은 각종 입출력 등을 포함하기도 하는데, 이들은 모두 작은 프로그램으로 작성되어 라이브러리에 있게 된다.따라서 Ada 프로그램은 입출력 등 각종 패키지를 이용하게 되는데, STANDARD와 같은 패키지는 항시 이용이 가능하지만, 그 외의 패키지는 프로그래머가 작성해야 한다.◎ 프로그램 구성⇒ Ada 프로그램은 컴퓨터 안의 활동을 지정하는 하나의 프로시저라고 할 수 있다.with TEXT_IO; use TEXT_IO;procedure PROG - 1 ispragma MAIN;beginNEW_LINE;PUT("yes");end PROG-1;위의 프로그램은 with, use, procedure등 소문자 용어들은 모두 Ada의 용어에 속하며, TEXT_IO, PROG-1, MAIN등은 프로그램 작성자가 만들었거나 혹은 라이브러리에 있는 용어들이다.프로그램 구성을 보면 with, use 등을 이용한 라이브러리 등 패키지가 이용되고 있음을 보이고 있으며, 하나의 procedure는 파스칼의 것과 그 구조가 유사함을 알 수 있다.파스칼과 다른 것은 with를 써서 TEXT_IO의 패키지를 참조하며, use를 써서 NEW_LINE이나 PUT의 전치어를 줄이고 있다. 위 프로그램에서는 yes"가 출력될 것이다.pragma라는 문장은 컴파일러에게 필요한 정보를 제공하는데, pragma MAIN은 프로시저가 주프로그램이란 뜻이다. .◎ 프로그램 성격⇒ Ada 프로그램은 근원적으로 구조된 프로그램과 데이터의 성격을 규정하는 개념을 기본으로 하고 있다.구조로는 프로그램 단위로 블록들이 인접하거나 혹은 중첩되어 있는 logical structure, 컴파일링 단위로 서로 분리되어 있는 physical structure로 구분하여 생각하면 편리할 것이다. 프로그램 단위로는 종프로그램, package, task등을 말할 수 있으며, 이들은 선언부이거나 실행부가 될 수도 있으며, 내부적으로 여러 가지 구조를 포함할 수가 있다.컴파일링 단위란 완전히 분리된 프로그램 단위로 프로그램 시작에는 구문에 지정된 머리 표시를 하고 있다. 따라서 Ada 프로그램이란 분리된 컴파일링 단위들의 집합이라고 볼 수 있으며, 각 컴파일링 단위는 중첩되거나 혹은 나열된 프로그램 단위로 구성되었다고 할 수 있다.프로그램에 사용되는 각 명칭(identifier)들은 프로그램 어디선가 선언이 되어야 하며, 선언된 위치에 따라서 이 변수들은 효력 범위규칙을 갖게 되는데, 이와 같이 접근 가능한 경우를 가시적이라고 하며, 가시적인 범위 내에서라도 효력을 상실하는 지역을 은폐적이라고 한다.이들 블록 구조의 구성을 보면 declare문으로 시작되면서 begin ... end 의 구조를 이루는 경우와OUTER : declareI, J : INTEGERbegin:endprocedure나 function으로 시작하여 블록을 구성하기도 한다.function COMP(I : INTEGER) return FLOAT isS : INTEGER;begin:end이 밖에 모듈 구조를 많이 이용하는데, 선언으로 시작되는 블록이나 function등으로 시작되는 블록에서 선언된 변수들의 범위규칙이 해당블록에 제한하지만, 이 모듈 개념은 이들의 범위를 확장하는데 사용된다.변수들이 효력범위를 확장하기 위해서는 지정 부분인 모듈의 공중부에서 선언함으로써 이루어질 수 있는데, 이러한 선언을 공중선언이라고 한다.◎ 실행문1. 수식1) 정수형 수식⇒ 정수형 수식에서 + - * / 등은 수학에서와 같은 뜻이 되며, 소수점 아래 부분은 자르게 된다 연산자 rem과 mod는 각기 나눗셈에서 나머지를 나타내는데, rem은 나머지가 분자의 기호를 따르고 mod는 나머지가 분모의 기호를 따르게 된다.또한 지수연산(**)에서는 지수는 정수형이며, 연산결과도 정수가 되어야 하므로 지수가 음수여서는 안 된다.2) 실수형 수식⇒ 실수형 수식에서 + - * / 등은 수학에서와 같은 뜻이 되며, 지수연산(**)에서 지수들은 정수형이어야만 하며, 실수연산에서 그 결과를 실수가 될 것이다. 정수에서나 실수에서나 기계가 허용하는 범위를 초과하면 오류의 경고인 exception이 발생하게 된다.3) 고정점 수식⇒ Ada에서는 fixed point type라는 것을 두어, 이 수형 형의 변수의 값이 어느 범위를 넘지 않도록 종범위형으로 규정하는 경우가 있다.이 고정점 수들도 정수로 곱하거나 나눌 수가 있지만, 정수를 고정점수로 나누어서는 안 된다.4) 부울린 수식⇒ Ada에서는 = /= < > = 등의 관계연산자를 이용한 관계수식 in, not in 등을 이용한 확인 수식 그리고 not, and, or등을 이용한 논리 수식 등을 이용하여 부울린 수식을 이루고 있다.일반적으로 수식들은 연산자와 연산수들이 연결되어 형성하는데, 다른 프로그래밍언어에서와 같이 이들 연산자들은 일방연산자와 쌍방연산자가 있는데, 일방연산자들은 + - in, not in 과 같이 주로 오른편의 연산 수를 연산하며, + - * / and or =
{객체{지향 프로그래밍이란?☞ 정의 : 객체는 데이터(data)와, 메소드(method)의 소프트웨어 묶음이다.데이터 구조의 데이터 타입뿐만 아니라 그 데이터에 적용되는 함수까지 함께 정의 하는 프로그래밍 형식을 말한다.이렇게 정의된 데이터 구조를 오브젝트라고 한다.(오브젝트 : 1. 개별적으로 선택하여 다룰 수 있는 아이템. 오브젝트는 디스플레이 화면의 어떤 모양 이나 그림일 수도 있고 소프트웨어 엔티티일 수도 있다.2. 객체 지향 프로그래밍에서, 데이터와 그 데이터를 다루는 프로시저를 동시에 포함하는 엔티티.)또한 프로그래머는 오브젝트사이의 관계를 생성할 수도 있다.예를 들어, 오브젝트는 다른 오브젝트의 특성을 계승(inherit)할 수 있다.OOP를 이용하여 작성한 프로그램 모듈은 새로운 오브젝트 타입이 첨가되더라도 내용을 바꿀 필요가 없이 독립적이다.☞ 객체 지향 프로그램이란?- lego block으로 여러 물체를 만드는 것과 같은 개념- 필요한 블록을 구입하여 또 다른 물체를 만드는 것과 같이 필요한 객체를 만들거나, 구입하여 하나의 새로운 프로그램을 제작☞ 객체지향 프로그램이란 작은 객체를 모아 하나의 일을 수행하는 또 다른 큰 프로그램을 만드는 작업- Computer = mother board + a CPU ship + a video card + hard disk + a keyboard + a mouse + .....- programming = A Objects + B Objects + C Objects +.....☞ 객체(Objects)란?- 클래스에서 하나의 구체적인 표현- The specific concrete representation of a class☞ 클래스(Classes)란?- 동일한(비슷한) 특징(모습)을 갖는 여러 객체를 정의할 수 있는 틀(모형)- a general(generic) template for multiple(a set of)objects with similar features- 클래스는 객체 집합의 모든 특징을 기술할 수 있어야 함.☞ 행위와 속성(behaviors & attributes)1) 클래스의 2가지 주요 부분(구성)2) 행위(behaviors)- methods·동작을 기술- 클래스 자동차의 method·시동을 걸다·엑셀을 밟다·속도를 증가시키다·기어를 변속하다·정지하다3) 속성(attribute)- properties·객체를 구별시키는 특성(외모, 상태 등)- 클래스 자동차의 properties·색상(흰색, 검은색....)·스타일(레저용, 세단형......)·제조회사(....)·변속방법(수동, 자동...)☞ 계층구조와 상속(hierarchy & inheritance)1) 계층(hierarchy)- 하위 클래스는 상위 클래스의 모든 조건을 만족- 예) 생물{2) 상위 클래스와 하부 클래스(superclass & subclass)- 생물은 포유류의 상위 클래스- 포유류는 생물을 하부 클래스3) 상속(inheritance)- 계층구조에서 하부 클래스는 상위 클래스의 모든 행위와 속성을 상속받음☞ Overriding과 다중상속1) Overriding Method- 동일한 이름의 Method는 하부 클래스가 상위 클래스를 우선{- 정삼각형 객체에서 발생한 Draw() Method는 정삼각형의 Method를 실행2) Multiple Inheritance- 두 개 이상의 상위 클래스를 갖는 계층 구조를 허용· C++은 허용하나 Java는 허용하지 않음.- Single Inheritance·상위클래스는 단 하나 존재☞ 기본 구문1) 기본 규약- 대소문자 구분·관례적으로 class명의 첫 글자를 대문자로·method와 object명은 첫 글자는 소문자로, 새로운 글자는 이해 쉽게 대문자로·기본형 변수는 일반적으로 첫 글자는 소문자로 시작하고 새로운 낱말의 시작은 대문자로 표기하여 쉽게 이해될 수 있도록 한다ex) int myAge;- 문장 구분자; (semi colon)- 문장 그룹(복합 문장){}(brace)2) 주석(Comments)- 언어의 문법에 관련 없이 프로그래머나 시스템이 프로그램에 기술- 3가지 방법·//이 주석은 한 라인에서 사용할 수 있는 주석 문이다.·/*이 주석은 시작과 끝에 표시하면 여러 라인에 주석을 사용할 수 있다.*/·/** 이 주석은 시스템에서 자동적으로 발생하여 주는 주석이므로 프로그래머는 가급적 사용하지 말아야 한다*/☞ 문장과 표현식1) 문장(Statement)- 일을 수행(처리)하는 문법상의 최소단위 : Simplest Tasks· 세미콜론(;)으로 문장을 구분·예)1 int I = 0;2 System.out printfIn("Welcome to Java Lecture!");- Block Statement·여러 개의 문장이 모인 복합 문장1 Brace로 표시 : {.........}2) 표현식(Expression)- 계산을 수행 후, 되돌림(Return)값을 되돌려 주는 일련의 작업·수식 값이나 논리값 등·예)1 a++:a 값을 리턴한 후 a값을 하나 증가시킴2 x*y*z3) 치환문(Assign Statement)· = 기호를 이용하여 왼쪽의 값을 오른쪽 변수에 치환1 size = 4; myName = "Cho Won Suk";☞ 키워드와 식별자1) 키워드- Java 시스템에서 사용하는 단어로 사용자는 식별자로 서 이용할 수 없다.- static, void. public, int, byte, long 등2) 식별자(Identifier)- 사용자가 임의로 정의하여 사용하는 모든 단어3) 식별자에 이름을 붙이는 규칙- 키워드는 사용불가- 반드시 다음으로 시작·대소문자 : a-z, A-Z·밑줄 : _·달러 : $·예) myAddress,_E-mail. $sollarSign- 이름의 일반적인 관례·class 명은 명사를 이용하며 대문자로 시작·method 명은 동사를 이용하며 소문자로 시작·단어를 잘 이해하기 위하여 첫 번째 글자는 대문자를 이용1 getCurrentSpeed☞ 변수와 자료유형1) 변수(Variables)- 값이 저장되는 메모리의 위치- 이름(name), 값(value), 유형(type)으로 구성2) 변수 선언- 변수의 자료 유형을 명시·type var_name;·모든 변수는 쓰이기 전에 자료 유형이 선언되어야 함1 int myAge;2 String myName;- 대중 선언·int x,y,z;·int x=0, y=0, z=0;·int x,y,z=0;- 자료 유형의 종류·4가지 기본유형에 8가지의 세부 기본형1 Integer형(4), Float-poin(2), Character형(1), Boolean형(1)·Array, Class, Interface☞ 변수 사료형의 종류1) 기본 자료형 8가지- 정수형 : integer·byte, short, int, long- 실수형(부동소수형) : float-point·float, double- 논리형 : boolean·boolean- 문자형 : character·char2) 배열(Array)3) 클래스(Class)4) 인터페이스(Interface)☞ 정수형1) 정수를 표현하는 기본자료- byte·1byte : 8bit -({{ 2}^{7 }= 128)