5. 열거 타입을 사용할 때 장점을 얻을 수 있는 프로그램을 작성하여라.열거 타입(enumeration type)에서 가질 수 있는 모든 값들은 타입 정의에서 정해지는 이름 상수이다. 이러한 이름 상수를 열거 상수(enumeration constant)라 한다.다음은 enum day 열거 타입을 정의한 C 예제로, SUN, MON, …, SAT의 열거 상수에는 정수 값 0, 1, …, 6이 묵시적으로 할당된다.다음과 같이 임의의 정수를 명시적으로 할당할 수도 있는데. JAN에는 1이, FEB에는 2, …가 할당된다.다음은 정의된 enum day 타입을 이용해서 변수 currentDay를 선언하는 예이다. currentDay가 가질 수 있는 값은 SUN, MON, …, SAT이다.이와 같은 열거 타입은 주로 가독성을 향상시키기 위해 사용되는데같이 작성하는 것보다는같이 열거 타입을 사용하는 것이 좀 더 읽기 쉽다.? 열거 타입을 사용할 때 장점을 얻을 수 있는 프로그램무작위로 값을 입력받아 무슨 요일인지 알 수 있는 프로그램이다. 열거 타입을 사용해서 일요일을 0대신에 SUN으로 표시할 수 있으므로 가독성을 높일 수 있다.8. 다음과 같은 조건의 행 중심 2차원 배열 arr[5][3]에서 arr[3][2] 요소의 주소를 계산하여라.배열의 시작 주소는 200이고, 행과 열의 첨자는 0으로 시작된다. 그리고 배열 요소의 크기는 4바이트 이다.배열(array)은 집합체의 첫 번째 원소의 상대적 위치로 원소를 식별하는 동질형 데이터의 모임이다. 배열의 원소는 배열 이름과 첨자에 의해 참조되는데, 배열 이름이 먼저 오고 다음에 소괄호나 대괄호에 둘러싸인 첨자가 온다.그러면 배열 원소의 주소를 계산하는 방법을 살펴보자.2차원 배열 A[n][m]에서 첫 번째 원소의 행과 열의 첨자가 a이고, 시작 주소가 base, 원소의 크기가 size라 할 때 A[i][j]의 주소를 구하는 공식은 다음과 같다.행 중심 저장 방식: A[i][j]의 주소 = base + (m*(i-a) + (j-a)) * size열 중심 저장 방식: A[i][j]의 주소 = base + (n*(j-a) + (i-a)) * size이제 arr[3][2]의 주소를 구해보자. 배열은 arr[5][3]이므로 n이 5고, m이 3이고, 행과 열의 첨자는 0이다. 그리고 시작 주소는 200이고, 각 원소의 크기는 4바이트 이다.행 중심 저장 방식의 arr[3][2] 주소는 다음과 같이 공식에 대입하면 244가 된다.base + (m*(i-a) + (j-a)) * size= 200 + (3*(3-0) + (2-0)) * 4= 244위의 배열 arr[5][3]을 주소와 함께 그림으로 나타내면 다음과 같다.10. 다음 C언어와 Ada의 레코드 선언에서 (가), (나), (다)에 들어갈 내용은?C 언어Ada(가): struct(나): type(다): record레코드(record)는 집합체의 원소를 이름으로 식별하는 이질형 데이터의 모임이다.레코드는 이질적인 데이터들을 하나로 묶어서 관리한다. 학생에 대한 정보를 예로 들면, 이름, 학번, 주소, 학과, 학년 등의 학생에 대한 정보들을 하나의 레코드로 묶으면 관리하기가 편하다.레코드를 이루고 있는 데이터들을 필드(field)라 하는데, 필드에 접근하는 표현 형식은 언어에 따라 차이가 있으나 C, Pascal, Ada는 변수 이름을 쓰고, 그 뒤에 도트(.), 그리고 필드 이름을 차례로 쓴다. 다음은 변수 A의 number 필드에 10을 저장하는 C, Pascal, Ada문장이다.A.number = 10; : … CA.number := 10; … Pascal, Ada12. 다음 동적으로 메모리를 할당하고 ptr이 가리키게 하는 C언어 문장에서 (가)에 들어갈 내용은?(가): malloc동적으로 메모리를 할당하는 함수는 malloc이다. 다음을 실행하면 동적으로 메모리를 할당하고 ptr이 이 영역을 가리키게 된다.이를 도식화하면 다음과 같다. 동적으로 할당된 영역은 이름이 없으므로 무명 변수(anonymous variable)라 한다.ptr이 가리키고 있는 영역의 data에 접근하는 표현 형식은 포인터 변수인 ptr을 쓰고, ->, 그리고 data를 차례로 쓰면 된다. 다음은 data에 10을 저장하는 문장이다.그리고 또 다른 메모리 영역을 동적으로 할당받고 ptr->next가 이 영역을 가리키게 하는 코드는 다음과 같다.이를 도식화하면 다음과 같다.1. 다음 표기법을 비교한 예에서 (가)와 (나)에 들어갈 내용은?중위 표기법2 * 3 + 41 - 2 * 3전위 표기법(가)- 1 * 2 3후위 표기법2 3 * 4 +(나)(가): + * 2 3 4(나): 1 2 3 * -연산자가 피연산자들 사이에 위치하는 표기법을 중위 표기법(infix notation)이라 하고, 연산자가 피연산자들보다 앞에 위치하는 표기법을 전위 표기법(prefix notation)이라 한다. 그리고 연산자가 피연산자들보다 뒤에 위치하는 표기법을 후위 표기법(postfix notation)이라 한다.먼저 ‘2 * 3 + 4’ 식을 노드로 나타내면 아래와 같다.이 식의 전위 표기법을 알기 위해서는 위의 노드들을 부모노드-왼쪽노드-오른쪽노드 순으로 읽으면 된다. 그러므로 ‘+ * 2 3 4’가 전위 표기법이 된다.후위 표기법을 알기 위해서는 위의 노드들을 왼쪽노드-오른쪽노드-부모노드 순으로 읽으면 된다. 그러므로 ‘2 3 * 4 +’ 가 후위 표기법이 된다.다음으로 ‘1 - 2 * 3‘식을 노드로 나타내면 아래와 같다.이 식의 전위 표기법은 부모노드-왼쪽노드-오른쪽노드 순으로 읽어서 ‘- 1 * 2 3’이 된다.위의 방법을 사용하면 후위 표기법은 ‘1 2 3 * -’이 된다.4. Ada로 된 다음 코드를 C언어로 나타내어라.#1. if 사용#2. switch 사용실행화면프로그램은 위에서부터 아래로 한 문장씩 순차적으로 실행된다. 그러나 제어문을 이용하면 프로그램 실행 순서에 변화를 가져올 수 있다. 제어문은 조건문, 반복문, 무조건 분기문으로 구분할 수 있다.조건문(conditional statement)은 조건에 따라 둘 또는 그 이상의 실행 경로 중에서 하나를 선택할 수 있는 수단을 제공하는 문장이다. 조건문은 조건이 참이냐 거짓이냐에 따라 선택하는 if문과 조건에 따라 여러 경로 중 하나를 선택하는 case문(또는 switch 문)으로 구분할 수 있다.
1. 다음 변수들의 속성에서 (가)와 (나)에 들어갈 내용은?변수(가)주소값(나)영역속성(가): 이름(나): 타입C 언어 선언문이 다음과 같을 때, 각각의 속성에 대한 설명int x;① 이름: 이름은 x가 된다.② 주소: 변수의 값이 저장될 메모리 주소③ 값: 변수의 값은 배정문에 의해 부여되는데, 다음 배정문을 실행하면 변수 x의 값은 20이 된다. (x = 20;)④ 타입: 변수가 가질 수 있는 값의 범위와 이 값에 대한 연산자들의 집합을 의미한다. 4바이트 크기의 int 형은 -2,147,483,648 ~ 2,147,483647의 값의 범위와 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산 등의 연산을 갖는다.⑤ 영역: 변수 x의 사용이 허락되는 범위⑥ 수명: 변수 x가 메모리 주소에 할당되어 있는 기간2. l-value와 r-value에 대해 설명하여라.변수의 값은 그 변수의 주소에 저장된 내용을 의미한다. 변수의 값은 배정문에 의해 부여되는데, 다음 배정문은 변수 x의 주소에 값20을 저장한다는 의미이다.x = 20;그리고 다음 배정문은 y의 값을 x의 주소에 저장한다는 것을 의미한다.x = y;여기에서 x와 y 모두 변수 이름임에도 불구하고 배정문의 왼쪽의 x는 주소를 의미하고, 오른쪽의 y는 y의 값을 의미한다. 이러한 이유로 변수의 주소를 l-value(배정문의 왼쪽에 나타나므로)라 부르고, 변수의 값을 r-value(배정문의 오른쪽에 나타나므로)라 부른다.좀 더 자세히 설명하자면 r-value에 있는 변수, 상수 등은 항상 일정한 값을 가지고 있어야 한다. 그리고 l-value에 위치하기 위해서는 반드시 값을 저장하기 위한 장소를 제공할 수 있는 능력자만이 올 수 있다. l-value에 상수가 올 수 없는 이유이기도 하다.(상수는 고유한 값을 갖고 있기 때문에 다른 값으로 바꿀 수 없기 때문이다.)l-value = r-value 바꾸어 말하면 ‘장소’ = ‘값’이라는 개념이다.수학에서 생각할 때 두 변수 a, b에 대하여 a=b라고 함은 ‘a와 b가 같다.’라는 의미로 해석된다. 하지만 프로그래밍에서는 전혀 다르게 해석해야 한다는 것을 기억해야 한다.수학에서의 개념과 다르다는 것을 알아보기 위해 직접 코딩해 보았다.- 실행화면3. 정적 바인딩과 동적 바인딩에 대해 설명하여라.변수에 변수와 관련된 속성을 연관시키는 것을 바인딩이라 한다.변수는 하나의 이름에 다양한 속성이 연결되어 형성된다. 다음 java 선언문은 이름 x에 ‘정수(integer)’ 타입과 값20이 연결된다.int x = 20;이와 같이 이름에 속성을 연관시키는 과정을 바인딩(binding)이라고 한다. 그리고 바인딩이 일어나는 시간을 바인딩 시간(binding time)이라 하는데, 바인딩 시간에 따라 바인딩을 정적 바인딩(static binding)과 동적 바인딩(dynamic binding)으로 분류할 수 있다.바인딩설명정적 바인딩실행 시간 전에 일어나고 프로그램 실행 과정에서 변하지 않는 상태로 유지되는 바인딩동적 바인딩실행 시간 중에 일어나거나 프로그램 실행 과정에서 변경되는 바인딩예를 들어, 다음 선언은 ‘정수(integer)’ 타입을 이름 x에 정적으로 바인딩하는 것이고,int x;다음 C++ 문장은 할당한 기억장소를 y에 동적으로 바인딩하는 것이다.y = new int;즉, 번역시간에 이루어지는 바인딩이 정적 바인딩이고, 실행시간에 이루어지는 바인딩이 동적 바인딩이다.프로그래밍 언어를 비교 분석하는 과정에서 발생하는 주된 차이점의 근본적인 원인은 바인딩 시간 때문임을 알 수 있다. 번역시간 바인딩과 실행시간 바인딩의 장단점은 효율성과 유연성의 상충된 관계이다. 즉, 실행의 효율성을 가장 중시한 Fortran, Algol, Cobol, C 등의 컴파일러 언어들은 가능한 한 많은 바인딩이 번역하는 동안에 이루어지도록 설계했다. 반면, 유연성이 특징인 Snobol4, APL, LISP와 같은 인터프리트 기법의 언어에서는 바인딩을 대부분 자료에 맞출 수 있도록 실행시간까지 바인딩을 지연시킨다.일반적으로 바인딩을 가능한 한 추기 시간에 수행하는 것이 유리하기 때문에 설계가 완료된 언어는 같은 바인딩 시간을 갖도록 구현된다.4. 다음 세분화된 바인딩 시간에서 (가)와 (나)에 들어갈 내용은?바인딩 시간설명언어 정의 시간프로그래밍 언어를 정의할 때 이루어지는 바인딩(가)언어에 대한 번역기를 구현할 때 이루어지는 바인딩번역 시간원시 프로그램을 번역할 때 이루어지는 바인딩링크 시간프로그램을 라이브러리와 링크할 때 이루어지는 바인딩(나)프로그램의 실행을 위해 메모리로 적재할 때 이루어지는 바인딩실행 시간프로그램을 실행할 때 이루어지는 바인딩(가): 언어 구현 시간(나): 적재 시간이들 바인딩 시간의 예를 살펴보면 다음과 같다.? 언어 정의 시간- C 언어의 int 타입이 정수 값을 가진다는 의미를 바인딩- ‘+’기호에 덧셈 연산자라는 의미를 바인딩? 언어 구현 시간- C 언어의 int 타입에 가능한 값의 범위를 바인딩- 정수에 컴퓨터 내에서의 표기법을 바인딩? 번역 시간- 다음 C 선언문에서 변수 x에 타입 int를 바인딩int x;? 링크 시간- 라이브러리 부프로그램 호출에 부프로그램 코드를 바인딩? 적재 시간- 전역 변수에 메모리 주소를 바인딩? 실행 시간- 다음 C 배정문에서 변수 x에 값 20을 바인딩x = 20;5. 다음 선언의 종류에서 (가)와 (나)에 들어갈 내용은?선언설명(가)선언문을 사용하여 변수 이름을 나열하고 이들에 속성을 부여하는 방법(나)선언문을 사용하지 않고 디폴트 규칙에 의해서 변수에 속성을 부여하는 방법(가): 명시적 선언(나): 묵시적 선언선언(declaration)은 변수에 이름과 데이터 타입 등의 속성을 부여하는 문장인데, 명시적 선언(explicit declaration)과 묵시적 선언(implicit declaration)으로 구분할 수 있다.다음 C 선언문은 변수 x의 데이터 타입을 예약어 int를 사용하여 명시적으로 지정하는 명시적 선언의 예이다.int x;묵시적 선언을 사용하는 언어에는 FORTRAN과 Perl이 있다. FORTRAN은 선언문 없이 변수 이름을 그냥 사용하면 그 이름이 선언된 것으로 간주한다. 특히 변수 이름이 ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’으로 시작되면 정수 타입으로 선언되고, 그렇지 않으면 실수 타입으로 선언된다.그리고 유사한 묵시적 선언을 사용하는 Perl에서는 $로 시작되는 변수는 스칼라 타입이고, @로 시작되는 변수는 배열이고, %로 시작되는 변수는 해시 구조체이다. 그러므로 $edu, @edu, 그리고 %edu는 서로 연관성이 없는 별개의 변수이다.6. 다음과 같은 가상 언어로 된 프로그램에 대해 정적 영역 규칙을 적용할 때와 동적 영역 규칙을 적용할 때의 출력 결과는 무엇인가?정적 영역 규칙을 적용할 때 a=0, b=1로 출력되며, 동적 영역 규칙을 적용하면 a=2, b=3으로 출력된다.우선 정적 영역 규칙을 적용해서 위의 프로그램을 설명하면, 프로그램이 시작되고 14행이 실행될 때 변수 a와 b를 찾기 위해서 14행을 포함하고 있는 블록을 찾는다. 2행에서 a와 b를 찾을 수 있기 때문에 2행의 a와 b값을 0과 1로 초기화시킨다. 그리고 func함수를 부른다. func함수 블록에서는 변수 a와 b를 선언하고 초기화시킨 후 print함수를 부른다. print함수 블록에서는 변수 a와 b를 출력해야 하는데, 이 블록에서는 변수 a와 b를 찾을 수 없다. 그러므로 바깥쪽 블록에서 찾아보면 0과 1의 값을 가진 a와 b를 찾을 수 있다. 결과적으로 정적 영역 규칙을 적용하면 a=0, b=1로 출력된다.
1. 저급 언어와 고급 언어를 비교 설명하고 그 예를 들어라.● 저급 언어저급 프로그래밍 언어란 컴퓨터 내부에서 바로 처리 가능한 프로그래밍 언어로, 일반적으로 기계어와 어셈블리어를 일컫는다. 강력하나 배우기 어려운 것이 단점으로, 현재는 특수한 경우가 아니면 사용되지 않는다. 저급언어와 반대되는 것으로 고급 프로그래밍 언어가 있다.(예: 기계어, 어셈블리어)(출처: 위키백과)● 고급 언어고급 프로그래밍 언어란 사람이 알기 쉽도록 씌어진 프로그래밍 언어로서, 저급 프로그래밍 언어보다 가독성이 높고 다루기 간단하다는 장점이 있다. 컴파일러나 인터프리터에 의해 저급언어로 번역되어 실행된다. C언어, 자바, 베이직 등 대부분의 프로그래밍 언어들은 고급언어에 속한다.(예: C, C++, java, 등 대부분의 언어)(출처: 위키백과)2. 프로그램 언어 설계 원칙을 설명하여라.● 효율성우선 번역기가 효율적인 실행 코드를 생성할 수 있도록 언어 설계가 이루어져야 한다. 이것은 종종 최적화라고 불린다.또 하나의 효율성으로 번역의 효율성을 들 수 있다. 번역 시간에 오류를 검사하는 것은 번역기가 비효율적일 수 있고, 실행 시간에 오류를 검사하는 것은 목적 코드가 비효율적일 수 있다.이 두 가지 외에도 효율성에 대하여 더 많은 견해들이 있다. 이 중에 하나는 구현성, 즉 번역기가 얼마나 효율적으로 작성될 수 있는가 하는 것을 들 수 있다. 또 하나의 효율성에 관한 다른 견해가 프로그래밍 효율성이다. 얼마나 쉽고 빠르게 프로그램을 작성할 수 있는가 하는 것으로 프로그램 작성력을 말한다. 이것에 포함될 수 있는 성질 중에 하나가 언어의 표현력이다. 신뢰성은 효율성 문제 자체로 간주되기도 한다. 신뢰가 없는 프로그램은 많은 비용을 낭비한다.● 일반성, 직교성, 획일성언어는 이용 시 특별한 경우를 피하거나 밀접하게 관련이 있는 여러 개념들을 일반적인 하나의 개념으로 결합하여 일반성(generality)을 취득한다. 직교성(orthogonality)은 수학에서 인용해온 용어로 원래는 e): 이 원칙은 특정 기계에 독립적인 언어 정의를 통하여 보장할 수 있다. 기계 독립성을 보장할 수 있는 첫 번째 방법은 기억장소 배당이나 기계 구조와 독립적인 미리 정의된 자료형을 갖는 것이다.- 안전성(security): 이 원칙은 프로그래밍 오류를 적게 하고 오류 발견을 쉽게 하기 위한 언어 설계에 도움이 된다. 안정성은 언어의 신뢰성이나 정확성과 밀접한 관계를 가지고 있다.- 확장성(extensibility) : 이 설계 원칙은 사용자에게 언어의 특징을 더 추가할 수 있도록 하자는 것이다. 이것은 단순히 대부분의 언어가 허용하는 새로운 자료형을 정의할 수 있다는 것을 의미할 수도 있으며, 다른 수준에서는 많은 언어들이 이미 허용하는 바와 같이 라이브러리에 새로운 함수를 첨가하는 것을 의미할 수도 있다. 또한 번역기에 새 예약어나 새로운 구문을 추가하는 것을 의미할 수도 있다.- 제약성(restictability), 부분성(subset): 언어 설계는 프로그래머가 언어에 대한 적은 지식과 언어 구조에 대해 일부만 알고 있더라도 효과적으로 프로그램을 작성할 수 있게 해야 한다. 그러므로 언어의 부분집합을 정의하는 능력을 가져야 한다. 이것은 두 가지 면에서 유용하다. 첫째로 프로그래머는 언어를 효과적으로 사용하기 위해 언어 전체를 배워야 할 필요가 없다. 둘째로 전체 언어 구현에 비용이 많이 들거나 전체 구현이 불필요할 때, 번역기 작성자가 단지 언어의 부문만을 선택해서 구현하여 사용할 수 있다.(출처: http://bit.ly/eAQMt2)3. 다음 언어들의 장, 단점을 비교 설명하여라.C, C++, C#, java, Ada, schema● C 언어의 특징 및 장단점? 시스템 프로그래밍 언어C 언어는 시스템 프로그래밍 언어이다. 시스템 프로그램이란 운영체제, 언어처리계, 편집기, 디버깅 등 소프트웨어 작성을 지원하는 프로그램을 의미한다. C 언어는 뛰어난 이식성과 작은 언어사양, 비트 조작, 포인터 사용, 자유로운 형 변환, 분할 컴파일 기능 등의 특징사용할 수 있으며 어떤 시스템에 사용되던 C 프로그램도 수정 없이 약간의 수정만으로 다른 시스템에서 실행시킬 수 있는 장점이 있다.(출처: http://bit.ly/eOwNjw)● C++ 언어의 특징 및 장단점C++는 기존 C 언어의 기능을 완전히 포함한 객체 지향 언어이다. 기존 C 언어에서 사용한 라이브러리들을 그대로 사용할 수 있으며 C 언어로 개발하는 것보다 시간과 노력을 크게 줄일 수 있는 특징을 가지고 있다. C++라는 이름이 만들어진 이유는 C 언어에 있는 ++(어떤 변수에 1을 증가시키는 연산)연산자로부터 생겨난 것으로 C 언어의 확장판 이라는 의미를 가지고 있다. C++는 C 언어의 특징이 하드웨어 접근 능력과 OOP개념을 이용한 객체지향 프로그래밍 능력을 모두 갖고 있다.○ C와 C++의 차이점? 함수 정의에 관련된 차이C 언어에서 int f();라고 선언된 함수는 매개변수에 대해 어떤 것도 언급하고 있지 않는다. 매개변수가 있을 수도 있고 없을 수도 있다는 의미로 해석된다. 하지만 C++에서는 매개변수를 갖고있다는 의미가 된다. C++는 int f();또는 int f(void); 처럼 사용된다.? 문자 상수와 전역 변수C 언어에서 문자 상수가 자동적으로 정수로 바뀌지만 C++는 그렇지 않다. C 에서는 전역변수를 여러 번 선언해도 에러가 발생하지 않지만 C++에서는 에러가 발생한다.? 유효 식별자 길이C 언어는 처음 31문자만이 식별자로 유효하다. C++에서는 적어도 1024문자가 식별자로 유효하다.? main()함수 호출C 언어에서는 사용자가 프로그램에서 main()함수를 호출할 수 있지만 C++는 호출할 수 없다.? Register 변수CPU안에 내장된 초고속 메모리인 Register 메모리에 C 언어에서는 변수의 주소를 가질 수 없지만 C++에서는 가능하다. 하지만 Register 메모리에 주소를 할당하면 이식성에 큰 문제가 발생하기 때문에 거의 사용하지 않는다.실제 C++와 C 언어의 차이점은 객체지향 개념을 지원유무의 차이가 있을 구조체, 공용체 등의 관련된 기능을 갖고 있지 않다. 이러한 이유로 C 나 C++를 알고 있다면 자바를 쉽게 배울 수 있다. C++의 기능 중에 자주 사용하지 않는 복잡한 기능을 뺀 축소형 버전이 자바이다.? 객체지향 언어자바는 지금까지 개발된 프로그래밍 언어 중 가장 완벽한 개체 지향 언어중 하나이다. 기본 자료형을 제외하고 자바에서 다루는 모든 데이터는 객체를 통하여 처리된다. 자바의 모든 포트는 객체의 클래스 안에서 조작된다. 각 클래스는 부모 클래스의 상속을 받은 변수와 메소드의 집합으로 구성되어 있다. Object라는 최상위 클래스로부터 다양한 클래스가 상속되어 구현되어 있다. 자바는 단일 상속만 지원되기 때문에 C++에 있는 다중 상속에서 발생할 수 있는 문제를 효과적으로 해결할 수 있다.? 구조 중립적인 언어자바 프로그램은 바이트 코드로 컴파일 되기 때문에 자바를 지원하는 어떠한 플랫폼에서도 실행할 수 있다. C 나 C++처럼 새로운 플랫폼이 나올 때 마다 코드를 수정해 재컴파일해줄 필요 없이 새 플랫폼에 적당한 자바 가상 머신만 바꿔주면 소스 코드나 재컴파일 과정 없이 바로 실행할 수 있다. 또한 휴대폰, PDA, 셋톱박스 처럼 컴퓨터와 하드웨어 구조가 다른 플랫폼에서도 자바의 중립성은 보장된다. 자바는 C 나 C++처럼 하드웨어의 특징에 따라 데이터형이 바뀌지 않고 동일하다. 자바의 Integer 형은 32비트이고 Long 형은 64비트이다. 또한 자바 시스템은 운영체제에 대한 접근을 지원하는 다양한 라이브러리를 제공한다.? 쓰레기 수집기능쓰레기 수집기능으로 메모리 누수를 걱정하지 않고 메모리를 마음대로 사용할 수 있다.? 견고한 언어자바는 메모리에 액세스 할 때마다 문제가 발생하는지 체크한다. 만일 의도하지 않는 어떤 일이 발생한다면 자바는 이들을 예외 상황으로 처리하고 그에 합당한 처리를 수행한다. 또한 자바는 허락된 메모리에만 엑세스하도록 설계되었기 때문에 C 나 C++에 비해 시스템 다운이 적다.? 분산 환경에 적합한 언어자바는 처음부터tp://bit.ly/eOwNjw)※ C++과 자바의 비교C++는 이름에서 나타나듯이 C를 더 확장하여 만들었다. 절차적 프로그래밍 언어에 효율적인 실행을 목표로 설계되었다. 정적 자료형 검사 객체 지향 프로그래밍, 예외 처리, RAII, 제네릭 프로그래밍을 지원한다. 범용 컨터이너와 알고리즘을 포함한 C++ 표준 라이브러리도 추가되었다.자바는 처음에는 가전제품에 탑재되어 네트워크 컴퓨팅을 지원하기 위해서 만들었다. 가상 머신위에서 실행되기 때문에 안전성을 가지며 또한 이식성이 높다. 하위 플랫폼을 완벽히 추상화시켜 주는 광대한 분량의 라이브러리를 가지고 있다. 자바는 C와 비슷한 문법을 사용할뿐 직접적인 호환성은 없다. 사용하기 편하고 많은 사람이 이해하기 쉬운 언어를 목표로 설계되었다.※ 그 외의 출처http://programming.dojo.net.nz/resources/programming-language-comparison/indexhttp://en.wikipedia.org/wiki/Comparison_of_programming_languages※ 위의 언어들의 일반적인 비교LanguageIntended useParadigm(s)CSystemimperative, proceduralC++Application, Systemimperative, procedural, object-oriented, genericC#Application, Webimperative, object-oriented, functional, generic, reflectivejavaApplication, Webimperative, object-oriented, generic, reflectiveAdaApplication, Embedded, System and Realtimeimperative, procedural, concurrent, distributed, generic, object-orientedschemaGeneral, Educationfunctional4. 객체지향 언어의 특징
9. 최단경로 문제를 푸는 플로이드 알고리즘2(알고리즘 3.4)를 어떤 주어진 정점에서 다른 명시된 정점으로 가는 최단경로만 주는 알고리즘으로 수정가능한가? 그리고 왜 그런 답이 나오는지를 밝혀라1.에서까지 가는 최단경로의 중간에 놓여 있는 정점이 최소한 하나는 있는 경우 -> 그 놓여 있는 정점 중에서 가장 큰 인덱스2. 최단경로의 중간에 놓여 있는 정점이 없는 경우 -> 0우선 알고리즘 3.4를 통해서 위의 두 가지 정보를 알 수 있습니다. 그림 3.2를 참조하여 1번을 살펴보자면에서까지 가는 최단경로는->->->이므로 이 정점 중에서 가장 큰 인덱스인 5가 저장됩니다.2번으로는에서로 가는 최단경로는->로서 중간 정점이 없으므로 0이 저장됩니다. 이와 같은 사실을 알고 있을 때 알고리즘 3.4를 이용해서 알고리즘 3.5를 만들 수 있습니다. 알고리즘 3.5는 주어진 정점에서 다른 명시된 정점으로 가는 최단경로만을 알려줄 수 있는 알고리즘입니다. 알고리즘을 살펴보면, 배열 P[q][r]이 0이 아닐 경우, 즉 최단경로의 중간에 놓여있는 정점이 있을 경우 그 정점과 주어진 정점까지의 경로를 또 찾는 것입니다. 위의 예를 들면에서까지 최단경로를 구하기 위해 알고리즘 3.4를 적용해보면 P[2][1]=5가 됩니다. 여기서에서까지 가는 경로에를 거친다는 것을 알 수 있습니다. 이 사실을 알 때 P[2][5]와 P[5][1]를 또 진행시켜보면 P[2][5]=4이고 P[5][1]=0입니다.에서로 가는 중간지점이 없다는 뜻이고,에서까지 가는 경로에가 존재한다는 것을 알 수 있습니다. 다시 P[2][4]와 P[4][5]를 구하는 과정을 반복해서 결국에서로 가는 경로 중에->를 거친다는 것을 알 수 있습니다. 그 결과->->->라는 최단 경로를 얻을 수 있습니다.이 알고리즘은 알고리즘 3.4에서 최단경로 중 가장 큰 인덱스를 알 수 있으므로 그 인덱스로 재귀 루틴을 거쳐 최단 경로를 알 수 있는 것입니다.19. 6개의 서로 다른 키를 가지고 몇 개의 다른 이진검색 트리를 만들 수 있는가?6개의 서로 다른 키를 가질 때 서로 다른 이진트리의 수를 구하기 위해서 다음과 같은 방법을 사용했습니다. 키가 한 개일 때 서로 다른 이진트리의 수는 1개라는 것을 알 수 있습니다.key1키가 두 개라면 다음과 같이 네 가지의 서로 다른 이진트리가 존재합니다.key1key2key1key2key2key1key2key1위의 네 가지 이진트리에서는 모양이 같은 이진트리가 2개로써개 인 것을 알 수 있습니다. 결국 n개의 키를 가지고 있을 때 서로 다른 모양의 이진트리는인 것을 알 수 있습니다. 또한 각 모양에서 키 값이 다른 경우가 2가지 씩 존재합니다. 이 수는 n!개인 것을 알 수 있습니다. 그러나 이러한 과정을 n=3일 때에 적용시키면,=4가지의 이진트리와, 3!=6가지의 키의 배치를 곱해 4*6=24가지가 나타나야 하지만, 서로 다른 모양의 이진트리가 5가지가 나오는 것을 알 수 있습니다. 이와 같은 완전 이진트리는 n=3, n=4, n=6... 일 때 한 개씩 나오게 됩니다.key1key1key1key1key2key2key2key2key3key3key3key3key1key1key1위와 같이 서로 다른 모양의 이진트리는+1=5개가 될 것이고 각각의 이진트리에서 키 1, 2, 3을 배치하는 방법은 3!=6개로 총 30개라는 것을 알 수 있습니다.n=4일 때도 위와 같이 완전 이진트리인 경우가 한 개 더 생겨+2=10개의 서로 다른 이진트리가 존재합니다.결국, 6개의 키가 존재할 때(n=6일 때)+3=35개의 서로 다른 모양의 이진트리와 6!=720개의 서로 다른 키의 배치를 곱해 32*720=25,020개 만큼의 서로 다른 이진트리를 만들 수 있습니다.문제를 진행하다 보니 31번 문제에 n개의 키로 서로 다른 이진검색 트리를 몇 개나 만들 수 있을지에 대한 공식을 사용해보니=132라는 결과를 얻을 수 있었습니다.29. n 번째 피보나치 항 구하기 알고리즘(1장의 연습문제 34 참조)같이, 알고리즘 3.2(동적계획법을 사용하여 이항계수 구하기)의 입력크기는 숫자 n과 k를 코드화하는 데 필요한 심볼의 개수이다. 이 입력크기를 기준으로 알고리즘을 분석하라.파라미터 n과 k는 이 알고리즘에서 입력의 크기가 아니라, 입력의 크기는 그들을 코드화 하는데 필요한 심볼의 개수입니다. 그러나 답을 구하기 위해서 얼마만큼의 일을 했는지 n과 k의 함수로 표현하여 알고리즘의 효율성에 대해서 대충이나마 알아볼 수 없지는 않습니다. n과 k에 대해서 for j 루프를 몇 번 수행하는지 알아보겠습니다.j0123kk+1n루프의 수행횟수1234k+1k+1k+1따라서 총 수행횟수는 다음과 같이 계산할 수 있다.여기서 1부터 k까지의 합은이고 k+1은 n-k+1개만큼 있으므로입니다. 이 두 값을 더하면인 것을 알 수 있습니다.31. n개의 키로 구성된 이진검색 트리의 개수는 다음과 같은 식으로 주어짐을 증명하라.위와 같은 식을 증명하기 위해 n=1, n=2, n=3...을 계산해보려고 합니다.n=1일 때, 위의 식에 값을 대입하면=1인 것을 알 수 있고, 키가 한 개 있을 때 한 개의 이진검색 트리만을 만들 수 있으므로 식이 성립하는 것을 알 수 있습니다.n=2일 때, 위의 식에 값을 대입하면=2인 것을 알 수 있고, 키가 두 개 있을 때key1key1key2key2다음과 같이 두 개의 이진검색 트리를 만들 수 있으므로 식이 성립하는 것을 알 수 있습니다.n=3일 때, 위의 식에 값을 대입하면=5인 것을 알 수 있고, 키가 세 개 있을 때key1key1key1key1key2key2key2key2key3key3key3key3key1key2key3위와 같이 다섯 개의 이진검색 트리를 만들 수 있으므로 식이 성립한다는 것을 알 수 있습니다.32. 최적 이진검색 트리 문제(알고리즘 3.9)를 푸는 2차 시간 알고리즘을 개발할 수 있는가?알고리즘 3.9를 직접 구현하는 과정에 있어 어려움이 있는 부분은 minimum과 sigma과정입니다. 우선 minimum을 풀기 위해선 minimum이란 함수 안에 for문을 사용하여 I부터 j까지 반복하는 과정이 있어야 하겠고 배열 A를 파라미터로 전달해줘야 할 것입니다. 그리고 가장 중요한 최소값을 리턴해주는 부분일 것입니다.int minimum(int A[], int i, int j){int min = [i][i-1]+A[i+1][j];for( int k=i ; ktemp )min = temp;}return min;}그리고 sigma함수를 만들어서들의 합을 구하는 과정을 따로 함수로 만들어줘야 하는데 파라미터로 i와 j를 받고 p값들의 합을 구합니다.int sigma(int p[], int i, int j) {int sum=0;for( int m=i ; m